在Dom更新后jQuery检测实例

时间:2011-03-10 04:51:36

标签: jquery object each

从标题来看,这似乎很简单,但并不像标题那么简单。

我正在尝试使用像.live这样的东西检测div的实例,但是live只能应用于click,mousedown等事件,没有domupdate之类的事件。

现在让我解释一下我在做什么。当我运行插件时,它检查dom是否为div类的所有实例(因此对于此示例:c_talk是类)。然后,对于每个返回的元素,它执行操作。即使在通过ajax或其他方式进行dom更新后,我也需要使用此脚本为页面上的所有div工作c_talk。

因此,当我运行jQuery('div.c_talk').c_talk();时,无论如何都应检测dom中的所有实例。

这是迄今为止的代码


(function($){
$.fn.c_talk = function () {
    var fn = $.fn.c_talk;
    var opt = {
        divliveprev : 'view_prev',
        divlivesend : 'send'
    }
    // test function
    fn.activateLive = function($this) {

    }

    // do for each element in dom
    return this.each(function(e){

        var $this = jQuery(this);

        if(!jQuery(this).data('init')) {
            // on page set it
            jQuery(this).data('init', '1');

        }else {
            // is already on page
            alert($this.size());
        }
        return false;
    });

};
})(jQuery);

jQuery(document).ready(function(){

    jQuery('div.c_talk').c_talk();
});

对于那些不理解的人的更多信息:基本上它是一个像评论框的Facebook。你有一个div,div包含注释,一个视图上一个按钮和一个post按钮,我需要为每个注释框实例做一些事情。关键是我必须能够检测到附加的新评论框,因为我的网站在100%ajax上运行。如果我只需要检测注释框onload,这个脚本就可以正常工作。在我的情况下,这并不是那么简单,因为脚本必须能够动态检测新的评论框(通过ajax)..任何想法,我的网站是kalluna.com,如果它可以帮助你更好地理解这一点。

2 个答案:

答案 0 :(得分:2)

您可以采用与jQuery livequery plugin类似的方式跟踪HTML更改。 livequery插件包装了所有jQuery DOM操作方法,当调用它们中的任何一个时,包装器方法会执行一些特殊操作(在您的情况下,使用{{1在c_talk上调用div函数}} c_talk)然后代理回原始函数。

class

Displaying change of content through parent

答案 1 :(得分:1)

你需要进行民意调查,我相信。

// Consider a function to make this DRY - getDomLength()
var domItems  = $(document).find('*').length;

setInterval(function() {
    if (domItems != $(document).find('*').length) {
         domChanged();
    }
    domItems = $(document).find('*').length; 

}, 100);

jsFiddle

如果没有其他更好的方法,轮询更改通常是完成某项工作的唯一方法。

请记住,您可以使用此代码(例如click())确定事件源自何处...

$(document).click(function(event) {
   var element = event.target;
});