是否有一种惯用的方法来使用Prototype库来监听DOM的更改?

时间:2009-01-16 18:04:00

标签: javascript events dom prototypejs listener

我正在尝试为DOM更改事件添加侦听器。我希望像'dom:loaded'这样简单的东西被刻入Prototype。我不确定处理这个问题的'Prototype-way'。

编辑:我无法控制DOM可能被更改的每个案例,所以我无法在每次更改DOM时触发自定义事件。

4 个答案:

答案 0 :(得分:3)

没有标准的处理程序可以观察到这一点。但是,您可以在Prototype中触发自定义事件。结合Function.wrap,您应该能够完全满足您的需求。

基本上,你可以使用任何可以修改DOM的函数,比如Element.insert(),并用一个触发你的change事件的函数包装它:

Element.prototype.insert = Element.prototype.insert.wrap(
function(original) {
    var ret = original.call(this, $A(arguments).slice(1));
    document.fire('dom:changed');
}.bind(this)
);

现在,无论何时调用Element.insert,它都会触发'dom:changed',可以使用Event.observe()进行观察。

我无法保证我刚才写的是100%完美,也不是100%多才多艺,但它应该让你开始。

答案 1 :(得分:1)

我建议您从原型文档中查看Event.observe的文档。

使用dom:loaded

作为示例
document.observe("dom:loaded", function() {     
                // Some Javascript Code
                  });

Event.observe的一个例子

$('step_anchor_' + i).observe('click', function(a, b){
        return function(){pm.loadData(a, b, true)};
            }(profile.steps[i].action, profile.steps[i].dao_id)
                   );

我应该指出,显然document还有一个observe函数,专门用于侦听整个文档中的事件,例如dom:loaded。

答案 2 :(得分:0)

$(element).observe('click',function(event){someFunction(event);}); //将在click事件上调用someFunction。这可以更改为任何其他事件。

http://prototypejs.org/api

转到Element以查看更多内容。

答案 3 :(得分:0)

我认为这是恰当的答案:Can javascript listen for "onDomChange" on every Dom elements?。 查看DOMSubtreeModified,DOMNodeInserted等。