更新HTML主体时JQuery / Dojo点击处理异常

2hh7jdfx  于 2022-12-16  发布在  Dojo
关注(0)|答案(1)|浏览(144)

我正在尝试在网页上安装一个鼠标点击处理程序。数据处理程序函数有一个部分可以像这样修改函数体:

document.body.innerHTML+='<div class=... id=...>X</div>'

添加后,click处理程序不再工作,需要重新连接。如何解决这个问题,而不用每次(some_condition)为真时都重新连接函数?
下面是我的main.js(为了清楚起见,省略了一些行):

function parsenodes(data,ioargs){
    // IE does not supprt forEach method
    //data.forEach(function(item){
    dojo.forEach(data,function(item){
        //do something
        if(some_condifition)
            document.body.innerHTML+='<div class="some_class" id="unique_id">X</div>';
    });

}

var postData = function(){
    dojo.xhrPost({
        //url: "/ajax/get_messages",
        url: "/dbnode.json",
        handleAs: "json",
        load:parsenodes 
    });
};
function doUpdate()
{
    postData();
    setTimeout(doUpdate,1000);
}

function on_img_mb_down()
{
    alert("mouse clicked");
}

function init()
{
    console.debug("installing handler");
    //$('#resim').click(function() {alert("obarey")});
    handle = dojo.connect(dojo.byId("resim"),'onclick',on_img_mb_down);
    console.debug(handle);

    doUpdate();
}

dojo.ready(init);
//$(document).ready(init);

addendum:id为“resim”的锚是一个静态HTML元素:

<body>
    <a id="resim" style="border:1px;" ><img id="worldpng" src="world.png" /></a> 
</body>
vmdwslir

vmdwslir1#

  • 更新问题:*

当您更改.innerHTML时,其中的所有元素都将从更新的HTML中销毁/重新创建,丢失click处理程序等。请使用DOM方法附加内容,而不是这样做:

document.body.innerHTML+='<div class="some_class" id="unique_id">X</div>';

用这样的方式:

dojo.query("body").append("<div class="some_class" id="unique_id">X</div>");
  • 上一个问题:*

只有当ready上的元素存在 then 时,才需要装配处理程序,假设ID没有重复(这是一个单独的问题......如果是这种情况,则切换到一个类),您只需要执行以下操作:

dojo.connect(dojo.byId("resim"),'click',on_img_mb_down);

parsenodes方法中,新元素加载完成后......因为当它们被替换时,它们的click处理程序会被破坏,所以需要在新元素上重新创建它们。

相关问题