Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在js中动态添加事件_Javascript_Html - Fatal编程技术网

Javascript 如何在js中动态添加事件

Javascript 如何在js中动态添加事件,javascript,html,Javascript,Html,当我得到一些json数据时,我想在页面中显示它们: 代码: function update(){ for(far i=0;i<data.length;i++){ var l=document.createElement("li"); document.getElementById("ul_con").appendChild(l); l.onclick=function(){ alert ("id:"

当我得到一些json数据时,我想在页面中显示它们:

代码:

    function update(){

      for(far i=0;i<data.length;i++){
        var l=document.createElement("li"); 
        document.getElementById("ul_con").appendChild(l);
        l.onclick=function(){
          alert ("id:"+data[i].id);
        }

      }
}
函数更新(){

对于(far)i=0;i当触发
onclick
事件时,
data[]
数组脱离上下文。您需要使用
this
代替ie

l.onclick=function(){
   alert ("id:"+this.id);
}

调用onclick函数时,时间比连接事件处理程序时晚得多,数据和i值可能不再是连接函数时的值,因此无法依赖它们。事实上,i值保证不相同,因为它会因为后续的内部调用而提前循环的默认值。数据值可能有效,也可能无效,具体取决于代码的其余部分

您可以冻结它们,以便在事件处理程序中使用,如下所示:

function update(){
    for(far i=0;i<data.length;i++){
        var l=document.createElement("li"); 
        document.getElementById("ul_con").appendChild(l);
        l.onclick=(function(mydata, index){     // define function that gets called at assignment time
            // variables mydata and index are available here in this scope
             return function() {
                alert ("id:"+mydata[index].id);
            };
       })(data, i);   // pass data and i into the inner scope
    }
}
function update(){
    for(far i=0;i<data.length;i++){
        var l=document.createElement("li"); 
        document.getElementById("ul_con").appendChild(l);
        l.myId = data[i];
        l.onclick=function() {alert(this.myId);};
    }
}
如果您所需要的只是该数据结构中的几段数据,那么您可能希望将其放在DOM对象本身上,如下所示:

function update(){
    for(far i=0;i<data.length;i++){
        var l=document.createElement("li"); 
        document.getElementById("ul_con").appendChild(l);
        l.onclick=(function(mydata, index){     // define function that gets called at assignment time
            // variables mydata and index are available here in this scope
             return function() {
                alert ("id:"+mydata[index].id);
            };
       })(data, i);   // pass data and i into the inner scope
    }
}
function update(){
    for(far i=0;i<data.length;i++){
        var l=document.createElement("li"); 
        document.getElementById("ul_con").appendChild(l);
        l.myId = data[i];
        l.onclick=function() {alert(this.myId);};
    }
}
函数更新(){

对于(far i=0;i但元素“l”没有属性“id”。我如何使用它来处理这些问题?事实上,单击项目时需要id,我还需要项目的其他属性,例如名称、地址、位置等。所有这些属性都来自服务器端。因此,我如何将这些数据绑定到元素?我不知道为了将这些数据保存在HTML tagI中,ant添加了一个如何执行此操作的示例,以及hwo处理此一般类型问题的阅读参考。您好,谢谢您的建议,这是否意味着我必须将数据数组设置为全局的?另外,我想知道是否有任何方法可以将数据项直接绑定到元素,就像jquery.data.data一样em不必是全局的。只要在该元素上定义了此单击处理程序,它将保持在作用域中(例如,不获取垃圾回收),因为函数闭包保留对它的引用并使其保持活动状态。您将不必弄乱“数据”中的数据变量,如果您希望它适用于单击处理程序。我添加了第三种方法,将id添加到DOM对象中。它只是一个对象,因此它可以接受您想要的任何新属性(只要它们不与正常的DOM操作冲突).我不能在单击时使用,因为在单击发生时循环已更改了它的值。如果在单击发生时它的值仍然有效,则可以使用数据。此代码通过在将其存储为l.tindex时冻结所需的值来解决i问题。您必须记住,单击发生在e分配给l.onclick。