【问题标题】:Access Dynamically Created Data Tag in Single Page Application在单页应用程序中访问动态创建的数据标签
【发布时间】:2015-11-07 00:08:15
【问题描述】:

我有一个单页应用程序,它使用列表项动态填充一个 div,该列表项将在单击时调用一个函数。我正在尝试动态填充数据标签,然后在附加的列表项中访问它。

$(\#documents) 中有反斜杠是因为这是一个 kendoUI 模板,我的路由函数正在调用它。

一旦从服务器检索到数据,就会在 Ajax 成功函数中调用构建树函数。任何见解或帮助表示赞赏!!!

   function buildTreeView(tree, jobCode){
       var treeHtml = "<div class='row'><div class='col-xs-12 col-sm-8 col-sm-offset-2'><div class='panel-group'><div class='panel panel-default'><div class='panel-heading'><h3 class='text-center'>View or Download Documents</h3></div><div class='panel-body'><ul class='list-group'>";
        for(var i =0;i < tree.length;i++){
          if(typeof tree[i] === 'object'){
            for(var ind = 0;ind < tree[i].length; ind++){
                //another element will be populated here
            }
          }else{
            treeHtml += "<li class='list-group-item viewDoc' data-docName='"+tree[i]+"' data-jobCode='"+jobCode+"'>"+tree[i]+"</li>";
          }
        }
        treeHtml += "</ul></div></div></div></div></div>";
        $('\#documents').append(treeHtml);
}

$(document).on("click", ".viewDoc", function(){
    var docName = $(this).data('docName');
    var jobCode = $(this).data('jobCode');
    console.log(docName);
    console.log(jobCode);
});

【问题讨论】:

    标签: javascript jquery single-page-application kendo-template


    【解决方案1】:

    您无法访问这些数据,因为数据属性“docName”和“jobName”已标准化为小写。

    例如,html 如下所示:

    <li class="list-group-item viewDoc" data-docname="something" data-jobcode="something">something</li>
    

    在这里寻找better answer

    无论如何这都会起作用:

    $(document).on("click", ".viewDoc", function(){
        var docName = $(this).data('docname');
        var jobCode = $(this).data('jobcode');
        console.log(docName);
        console.log(jobCode);
    });
    

    更新:添加jsfiddle

    【讨论】:

      【解决方案2】:

      更改您的函数,使其使用 .data(key,value) 设置数据。见https://api.jquery.com/data/

      function buildTreeView(tree, jobCode){
          $('\#documents').append("<div class='row'><div class='col-xs-12 col-sm-8 col-sm-offset-2'><div class='panel-group'><div class='panel panel-default'><div class='panel-heading'><h3 class='text-center'>View or Download Documents</h3></div><div class='panel-body'><ul class='list-group'></ul></div></div></div></div></div>");
          for(var i =0;i < tree.length;i++){
            if(typeof tree[i] === 'object'){
              for(var ind = 0;ind < tree[i].length; ind++){
                  //another element will be populated here
              }
            }else{
              var li = $('\#documents').find('ul:last()').append("<li class='list-group-item viewDoc'>"+tree[i]+"</li>");
              $(li).data("docName",tree[i]);
              $(li).data("jobCode",jobCode);
            }
          } 
                      // ---- EDITED ----//
      
          var li = $('\#documents').find('ul:last()').append("<li class='list-group-item viewDoc' id='docIndex"+i+"'>"+tree[i]+"</li>");
          $('\#docIndex'+i).data({"docName":tree[i], "jobCode":jobCode});    
      

      【讨论】:

      • ahervin,感谢您的回复。您的代码实际上使我找到了另一种可能在未来受益的解决方案。然而,CodeLama 的解决方案是我问题的根源..
      • @KyleSuhan 是的,不确定我的代码现在是否可以工作,因为我正在使用大写设置数据。
      • 它会起作用,因为当您设置密钥时,它会将密钥规范化为数据小写。我将添加一个编辑,以显示在发现案例问题之前我是如何让您的代码工作的。
      • 奇怪如何声明 var li 然后在其上设置数据是行不通的……还是会这样?我之前遇到过很多次这个问题
      猜你喜欢
      • 2013-12-07
      • 1970-01-01
      • 2017-11-19
      • 2011-04-09
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      相关资源
      最近更新 更多