2011-06-02 77 views
0

我有一个页面,左边有一个用户可以点击的链接列表,当它们被点击时,右边的div会根据链接通过Ajax加载正确的内容。
现在我想在右侧div的内容每次都改变时触发一个函数。
在SO搜索后,我得知有Mutation Events,我用的是DOMSubtreeModified事件:当div内的内容改变时调用一个函数?

right_div.addEventListener("DOMSubtreeModified", handler, false); 

然而,当我点击左侧的链接,似乎handler会叫几个时间。我希望只有在它的新内容被加载时才调用它。我怎么能这样做?

+1

这些事件在所有浏览器中都没有得到广泛的支持,您如何在修改内容的函数中添加回调函数? – Ibu 2011-06-02 03:59:00

+0

@lbu其实,这不是我的网站,我想写一个用户脚本来为它添加一些有用的功能,而且它只需要在Chrome和Firefox中运行 – wong2 2011-06-02 04:01:43

+0

真的很难在没有看到您的代码的情况下提供帮助。但是,如果处理程序被多次调用,这可能意味着DOM子树正在被修改几次: - )...所以也许这不是你想要使用的。不能只使用回调,例如,等待readyState完成,然后激发你的函数(我认为jQuery不是一个选项,因为你没有添加标签)? – squidbe 2011-06-02 04:28:11

回答

1

DOMSubtreeModified是“的所有更改文件通知一般的事件”。您可以设置突变事件的特定突变:

  1. DOMAttrModified事件
  2. DOMCharacterDataModified事件
  3. DOMNodeInserted事件
  4. DOMNodeInsertedIntoDocument事件
  5. DOMNodeRemoved事件
  6. DOMNodeRemovedFromDocument事件

而且有以下几种类型:

  1. DOMElementNameChanged
  2. DOMAttributeNameChanged

因此,如果您要更换节点,它可能会导致两个(或更多)突变事件 - 一个当节点删除,另一个更换时。还可能发送更多事件,如修改字符数据。如果你正在听的,只有当文本内容产生了变化的情况下,尝试DOMCharacterDataModified事件:

用户代理必须CharacterData.dataProcessingInstruction.data已经 修改后调度此事件 ,但节点本身具有不已插入或删除 。此事件的近端 事件目标必须是节点或 ProcessingInstruction节点。

+0

哦,我知道为什么它现在会被多次调用。但我不能使用'DOMCharacterDataModified',因为它不仅仅是正确的div中的文本内容,还有其他div。 – wong2 2011-06-02 08:18:57

+0

然后我想你必须筛选事件来确定要回应哪些内容以及忽略哪些内容。 – RobG 2011-06-02 09:23:24