1

我正在使用 XML 文件填充表,我有一列链接到更多详细信息。由于我运行网页的方式(Chrome 扩展),我需要在填充表格时动态添加事件处理程序。

我有这个工作...

document.addEventListener('DOMContentLoaded', function () {
document.getElementById("detailLink").addEventListener('click',
    clickHandlerDetailLink); });

function clickHandlerDetailLink(e) {   detailLinkPress('SHOW'); }

function detailLinkPress(str) {
alert("Message that will show more detail");
}

但是我该如何动态添加事件处理程序呢?我已为该列中的所有字段分配了 detailLink 的 ID。

4

2 回答 2

3

您可能需要侦听表的突变事件,然后每次检查触发事件的目标元素。以前它曾经是这些事件“DOMNodeInserted”或“DOMSubtreeModified”,但它们非常慢,因此根据新规范,侦听器称为MutationObserver(比以前的要快得多)。这是为我的测试编辑的一些 Mozilla 网页的示例:

var observer = new MutationObserver(function(mutations) {
  mutations.forEach(function(mutation) {
    alert(mutation.target.id + ", " + mutation.type + 
    (mutation.addedNodes ? ", added nodes(" + mutation.addedNodes.length + "): " + printNodeList(mutation.addedNodes) : "") + 
    (mutation.removedNodes ? ", removed nodes(" + mutation.removedNodes.length + "): " + printNodeList(mutation.removedNodes) : ""));
  });   
});

// configuration of the observer:
var config = { attributes: false, childList: true, characterData: false };

var element = document.getElementById('TestID');

// pass in the target node, as well as the observer options
observer.observe(element, config); 

function printNodeList(nodelist)
{
    if(!nodelist)
        return "";
    var i = 0;
    var str = "";
    for(; i < nodelist.length; ++i)
        str += nodelist[i].textContent + ",";

    return str;
}
于 2013-02-25T23:50:53.760 回答
2

如果要将事件分配给尚不存在的元素或一系列元素(无需为每个元素创建一个),则需要委托。委托只是一个父元素,它将侦听事件而不是所有子元素。当它处理事件时,您检查引发事件的元素是否是您要查找的元素。

如果父级<table>总是退出,那将是添加侦听器的好地方。您也可以将其添加到body. 此外,您不应将detailLinkid用作多个元素。改为使用class

演示: jsFiddle

脚本:

document.body.addEventListener( 'click', function ( event ) {
    if( event.srcElement.className == 'detailLink' ) {
        detailLinkPress( 'SHOW' );
    };
} );

function detailLinkPress( str ) {
    alert("Message that will show more detail");
};

HTML:

<div class="detailLink">click me</div>
于 2013-02-25T23:39:34.493 回答