【问题标题】:jquery .live() and .append()jquery .live() 和 .append()
【发布时间】:2012-12-26 17:17:00
【问题描述】:

所以我目前正在使用 .append() 为网页上的所有帖子添加一个功能,但是当页面上加载其他帖子时,附加功能不会包含在新内容中 - 我'我试图想出一种方法来确保所有新内容也都具有附加功能。

$(this).append('<div id="new_feature></div>');

这样的?

$(this).live().append('<div id="new_feature></div>');

也许有办法让它不断地附加在一个循环中?

【问题讨论】:

  • 您是否知道您的代码中的 append 拼写错误?
  • .live 不是这样工作的 (check the documentation)。每当您加载新帖子时,您都必须为其添加功能。

标签: javascript ajax jquery jquery-append


【解决方案1】:

它是 append 而不是 appened
live 是一个已弃用的事件处理程序。它不是这样使用的。请改用onhttp://api.jquery.com/live/

因此,当您单击selector 时,将运行以下代码。

$(document).on('click', 'selector', function() {
    $(this).append('<div id="new_feature></div>');
});

【讨论】:

    【解决方案2】:

    不,没有标准的方法可以做到这一点。有一个关于在插入 DOM 元素等时触发的事件的提议,但你不能依赖它。

    改为依赖任一:

    • (最好是)回调 - 只需调用函数以确保存在此类附加的 sn-ps,无论何时您拉取某些东西(但在您成功从服务器拉取并插入 DOM 之后,而不是更早),或
    • 持续检查 - 就像在 setInterval()setTimeout() 中使用,但这将是不必要的处理,并且您永远不会得到即时追加,除非您将一直执行处理繁重的检查,

    【讨论】:

    • 所以我应该使用 setTimeout() 来快速检查要追加的新内容吗?
    • @luke 仅作为最后的努力(例如用户修改或由第三方代码修改)。如果 DOM 操作由您控制 - 例如来自 AJAX - 那么就没有必要了。
    【解决方案3】:

    使用加载功能:

    $(item).on('load',function(){
        $(this).append('<div id="new_feature"></div>');
    });
    

    这将在项目加载后添加附加项目作为回调。我也会选择某种动态 ID 创建者,而不是总是附加具有相同 ID 的内容,但这只是我。

    【讨论】:

    • 只有在有东西要加载时才有效,而不是在你附加文本时。
    • 新帖子不是正在加载的项目吗?
    • @TonyQuentano:请阅读jQuery's documentation on load event,尤其是这部分:“加载事件在元素及其所有子元素都已完全加载后发送。可以发送此事件到与 URL 关联的任何元素:图像、脚本、框架、iframe 和窗口对象。"。不,就load 事件而言,纯文本帖子不是加载的。您只加载具有 URL 的内容(图像、脚本、框架等)。
    【解决方案4】:

    jQuery 文档:

    不再推荐使用 .live() 方法,因为更高版本的 jQuery 提供了没有缺点的更好方法。

    您可以使用setTimeout() 函数,该函数可以每n 毫秒检查一次新的&lt;div&gt;s。

    $(function(){
        setInterval("Check4NewDivs();",1000);
    });
    

    假设this 是一个带有class="comment newdiv" 的div,所以当它第一次出现在页面上时,它具有newdiv 类,它会让函数知道它只是动态创建的。

    function Check4NewDivs(){
        $(".comment .newdiv").each(function(){
            $(this).append('<div class="new_feature"></div>').removeClass("newdiv");
        });
    }
    

    【讨论】:

    • 我尝试实现这一点 - 现在发生的情况是,我正在获得新功能的多个副本,这些副本正在快速一遍又一遍地添加到每个帖子中。
    • 你必须添加一些东西让 JS 知道它是一个新形成的&lt;div&gt;。这就是为什么我说如果你有它,那么当一个新的&lt;div&gt; 出现时,它有newdiv 类,这只会影响动态创建的&lt;div&gt;s。否则,如果您将其保留为 $(".comment"),是的,它将继续添加“new_feature”div。
    • 同样&lt;div id="new_feature&gt; 应该是&lt;div class="new_feature"&gt;。所有id 属性都应该是唯一的。
    【解决方案5】:

    有 DOMNodeInserted 事件:

    $('button').click(function() {
      $('#appendme').append($('<div class="inner">').text(Math.random()));
    
    })
    
    $('#appendme').on('DOMNodeInserted','.inner',function() {
     console.log(this); 
    });
    

    DEMO

    更新:这似乎在 IE 中不起作用,请尝试 propertychnage 事件处理程序 ($('#appendme').on('DOMNodeInserted,propertychange') 但我不确定,现在没有 IE 可以检查这个。

    update2: Domnode* 根据 mdn 似乎已弃用,他们告诉使用 MutationObserver 对象代替

    update3:这里似乎没有针对 MutationEvents 的跨浏览器解决方案,请参阅 this answer,所以我的建议是使用上面的代码,如果支持事件并回退到 setTimeOut 或 livequery 选项。

    更新4: 如果你只依赖.append(),你可以像这样修补jQuery.fn.append()

    jQuery.fn.append=function() {
                    return this.domManip(arguments, true, function( elem ) {
                            if ( this.nodeType === 1 || this.nodeType === 11 ) {
                                    this.appendChild( elem );                             
                                    $(elem).trigger('appended');
                            }
                    });
            };
    
    $('button').click(function() {
      $('#appendme').append($('<div class="inner">').text(Math.random()));
    
    })
    
    $('#appendme').on('appended','.inner',function() {
     console.log(this); 
    });
    

    DEMO2

    可能更正确的是欺骗jQuery.fn.domManip 喜欢here

    【讨论】:

    • 已弃用,未删除;因为 DOM4 仍然是 WD,所以它还没有地方可去。 MutationEvents 的更大问题是支持,并且可能缺乏支持。我不知道哪些浏览器实现了它以及在多大程度上实现了它。如果有一些垫片库,我不会感到惊讶..
    • @pst 我添加了一些 jquery 原生示例,你能说什么?
    【解决方案6】:

    您必须绑定到页面上已存在的元素。我已经写了一个例子,我可以在其中制作附加内容。

    DEMO on JSFiddle

    HTML

    <div id="container">
      <div id="features">
      </div>
      <br />
      <a href='#' id='clickme'>click me to add feature</a>
    </div>
    

    JS

    $(function() {
      $('#clickme').on('click', function(e) {
        $('#features').append('<div class="new_feature">new feature</div>');
      });
    
      $('#features').on('click', '.new_feature', function() {
        alert('i am live.');
      });
    });
    

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 2019-02-27
      相关资源
      最近更新 更多