可以在 jQuery 生成的内容中应用 jQuery 吗?

Posted

技术标签:

【中文标题】可以在 jQuery 生成的内容中应用 jQuery 吗?【英文标题】:Can jQuery be applied in jQuery generated content? 【发布时间】:2012-04-22 19:18:36 【问题描述】:

我不知道为什么这不起作用。

当点击一个 li 元素时,我调用一个 php 文件来获取一些结果并将它们打印到我的页面中。到目前为止一切顺利。

$("li").click(function()

            var item = $(this).html();
            $.getJSON('fSearch.php',sTerm: item, function(data)
                var results='';

                $.each(data, function(i, item) 
                    results += "<li id='t'>"+item.Description+"</li>";

                );
               $('#ResultsHolder').html("<ul>"+results+"</ul>");

            );

        );

我第一次单击 li 元素时一切正常,我得到了结果。现在这些结果是另一组 li,我希望它们的行为相同,但是当我点击生成的 li 时,函数没有执行..

为什么会这样?为什么jQuery不能识别动态插入的li元素?

提前致谢!

【问题讨论】:

Later-inserted tags not seen by JQuery 的可能重复项 @KrisIvanov .live() 已弃用,.on() 现在是首选方法 【参考方案1】:

当您调用 ("li").click() 时,您将事件绑定到现有的 li 元素。当您创建新的 li 元素时,您需要将它们绑定到事件以便单击工作。

所以,把你的循环改成这样吧……

 $.each(data, function(i, item) 
    var li = $('li').text(item.Description);
    $(li).click(function(e)   loadChildren(this); );
    $("#ResultsHolder").append(li);
);         

【讨论】:

【参考方案2】:

使用.delegate():$(document).delegate("li","click",function()...)

或者,更新版本,.on()$('li').on("click",function()...)

如果您的 li 在某个固定的 div 中,您可以通过将第一个 sn-p 中的 document 替换为该 div 的选择器来使其更快;并制作第二个$(SELECTOR).on("click","li",function()...)

【讨论】:

不要使用live()delegate() 是旧版本的替代方案。【参考方案3】:

因为 .click 功能与所有 li 的绑定发生在这个新的创建之前。 JQuery 有 .on() 函数,可以解决你的问题。

$("li").on("click", function(event)
// do functionality
);

【讨论】:

这不是委托事件处理程序,并且仍然会遇到 OP 使用 click() 描述的相同问题【参考方案4】:

当您使用事件快捷方式(例如 clickhover)时,它仅适用于页面加载时 DOM 可用的事件。当您动态添加元素时,您需要将事件侦听器委托给页面中始终可用的元素。

在下面的示例中,我使用了#ResultsHolder

$("#ResultsHolder").on("click", "li", function()
    var item = $(this).html();
    $.getJSON('fSearch.php',sTerm: item, function(data)
        var results='';
        $.each(data, function(i, item) 
            results += "<li id='t'>"+item.Description+"</li>";
        );
        $('#ResultsHolder').html("<ul>"+results+"</ul>");
    );
);

这应该适用于 jQuery 1.7+。对于旧版本的 jQuery,请使用 delegate()...

$("#ResultsHolder").delegate("li", "click", function() ...

此外,所有附加的li 元素都具有't' 的id。这将导致无效代码,因为 id 应该是唯一的。如果您想拥有组标识符,请改用类。

【讨论】:

【参考方案5】:

添加到页面的“li”元素没有将函数绑定到其点击事件处理程序。您需要使用 jQuery live() 函数来执行此操作。

http://api.jquery.com/live/

基本上你需要做 .live("click",function()) 而不是 .click(function())

【讨论】:

live() 已被弃用,取而代之的是 on()。即使在旧版本的 jQuery 中,它也很慢,而您应该使用 delegate()【参考方案6】:

.click() 不是实时处理程序,仅将事件绑定到执行时存在于 DOM 中的元素。如果您希望事件是实时的,则需要查看另一个处理程序,例如 .on()

【讨论】:

.live() 已弃用,.on() 现在是首选方法 哦,我不知道,我刚开始使用 jQuery。我会尝试 .on() 处理程序,看看是否能得到结果。谢谢 看起来 jQuery 网站已关闭,但 Rory 的回答对如何使用它有很好的了解。 如果你使用 live(),一定要像这样在你的父元素上调用它... $("ul").on('click', 'li', function(e) ...这不起作用... $("li").on('click', function(e) ...

以上是关于可以在 jQuery 生成的内容中应用 jQuery 吗?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery-自动完成滚动问题

JQuer的简单应用

在vue中如何引jquer

超时 jQuery 效果

jquer 事件,选择器,dom操作

手机页的点击事件怎么写,是不是还要加载jquery mobile? 能不能同时加载电脑版jquer