在页面内部内容后添加或触发事件

Posted

技术标签:

【中文标题】在页面内部内容后添加或触发事件【英文标题】:Add or trigger event after inner content to page 【发布时间】:2014-01-06 17:46:39 【问题描述】:

我在表格上有编辑或删除元素的链接,这些元素可以被过滤。我使用 ajax 和 get 函数过滤并得到结果。之后我使用inner.html在表格上添加(显示)结果,这里的问题是过滤元素上的链接后不起作用,导致具有这样的dojo功能

dojo.ready(function()

    dojo.query(".delete-link").onclick(function(el)
    var rowToDelete = dojo.attr(this,"name");
    if(confirm("Really delete?"))
.......


);

我需要过滤后触发事件,有什么想法吗?

【问题讨论】:

【参考方案1】:

(我假设您在这里使用的是 Dojo

快速回答是您需要将dojo.ready 中的代码提取到一个单独的函数中,并在Ajax 调用的load() 回调结束时调用该函数。例如,制作一个这样的函数:

var attachDeleteEvents = function() 
    dojo.query(".delete-link").onclick(function(el)
        var rowToDelete = dojo.attr(this,"name");
        if(confirm("Really delete?"))
            .......
        
    );
;

然后您在 dojo.ready 和您的 Ajax 调用完成时调用此函数:

dojo.ready(function()  attachDeleteEvents(); );
....
var filter = function(someFilter) 
    dojo.xhrGet(
        url: "some/url.html?filter=someFilter",
        handleAs: "text",
        load: function(newRows) 
            getTableBody().innerHTML = newRows;
            attachDeleteEvents();
        
    );
;

这是一个快速的答案。您可能想要研究的另一件事是事件委托。上面代码中发生的情况是每一行都有一个 onclick 事件处理程序。您也可以在表本身上有一个事件处理程序。这意味着在过滤表时无需将事件处理程序重新附加到新行。

在最新版本的 Dojo 中,您可以从 dojo/on 获得一些帮助 - 类似于:

require(["dojo/on"], function(on) 
    on(document.getElementById("theTableBody"), "a:click", function(evt) ...);

这将是整个表格主体上的单个事件处理程序,但您的事件侦听器只会在点击 <a> 元素时被调用。

因为(我假设)您使用的是 1.5 或更低版本,所以您必须做一些不同的事情。我们仍然只会为整个表格主体获取一个事件侦听器,但我们必须确保我们自己只对<a>(或子元素)的点击采取行动。

dojo.connect(tableBody, "click", function(evt) 

    var a = null, name = null;
    // Bubble up the DOM to find the actual link element (which
    // has the data attribute), because the evt.target may be a 
    // child element (e.g. the span). We also guard against 
    // bubbling beyond the table body itself.
    for(a = evt.target; 
        a != tableBody && a.nodeName !== "A"; 
        a = a.parentNode);

    name = dojo.attr(a, "data-yourapp-name");
    if(name && confirm("Really delete " + name + "?")) 
        alert("Will delete " + name);
    
);

示例:http://fiddle.jshell.net/qCZhs/1/

【讨论】:

我试过但没用,我使用的是1.6版本,过滤后我在这个变量中得到了null var rowToDelete = dojo.attr(this,"name");我正在使用 POST

以上是关于在页面内部内容后添加或触发事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个页面中触发一个事件后就刷新这个页面的另一部分呢?

js如何在页面滚动到一定位置时触发事件?

为啥单击事件处理程序会在页面加载后立即触发?

js想跳转页面后触发一个onload事件怎么写

在页面内容更改时停止自动滚动

加载较大数据的 GridView 后,页面事件无法触发