【问题标题】:jQuery on click only works on dynamically generated contentjQuery on click 仅适用于动态生成的内容
【发布时间】:2014-06-25 13:58:45
【问题描述】:

我正在使用 jQuery 1.9.1,并且有两种情况可以通过 AJAX 调用加载相同的内容。由于有两种情况,我使用类作为选择器而不是 ID,因为 ID 仅适用于第一个实例。

场景一,在菜单中,一个带有 class="firstlink" 的 href 元素。

场景二,一个自定义的自动完成,它输出一个链接作为搜索词,同样,这个链接有“firstlink”类。在文档中调用自动完成脚本。

以下工作在页面上的第一次和后续加载/点击时单击菜单项类“firstlink”。

$(document).ready(function(){
    $(".firstlink").click(function(){
        $.ajax({url:"resources/pageone.html",dataType:"html",success:function(result){
        $(".content-area").html(result);
    }});
});
});

因为自动完成将第二个链接与“firstlink”类添加到 DOM 中,以上不适用于同一个类的动态生成链接,所以我必须使用“on”,我正在使用这样:-

$(document).ready(function(){
    $(document).on("click",".firstlink", function () {
        $.ajax({url:"resources/pageone.html",dataType:"html",success:function(result){
        $(".content-area").html(result);
    }});
});
});

这适用于类“firstlink”的动态生成元素,但不适用于 DOM 中类“firstlink”的菜单项。

我也试过在同一个文档准备功能:-

$('.firstlink').on("click" ,function() {
        $.ajax({url:"resources/pageone.html",dataType:"html",success:function(result){
        $(".content-area").html(result);
    }});
});
});

这适用于具有类“firstlink”的静态(已存在于 DOM 中)元素,但不适用于具有相同类名的动态创建元素。

我确信这一定是有原因的,并且我不需要为同一个函数定义两次相同的代码,如 "$(".firstlink").click(function(){" 和"$(document).on("click",".firstlink", function () {" 产生相同的结果 - 加载相同的 AJAX 内容。

示例 HTML 代码:-

静态 HTML:-

<ul>
    <li><a href="#" class="firstlink">click here first</li>
    <li><a href="#" class="secondlink">click here second</li>
    <li><a href="#" class="thirdlink">click here third</li>
</ul>

自动完成(jQuery)动态生成的链接是这样的:-

<div class="search-output">
    <a href="#" class="firstlink">please click here</a>
</div>

`

【问题讨论】:

  • 你能展示你的html吗?
  • 委托取决于事件冒泡。如果你有一个包含静态.firstlink 的元素,它有一个click 处理程序,并且它使用stopPropagation(),这将阻止它冒泡到document
  • 据我所知,我没有在任何地方使用 stopPropagation()。使用示例 HTML 代码编辑 OP。

标签: jquery dom dynamic static click


【解决方案1】:

您应该可以使用委托事件,即:.on("click", ".firstlink", function...,即,这应该是首选方法:

$(document).on("click",".firstlink", function (e) {
    $.ajax({url:"resources/pageone.html",dataType:"html",success:function(result){
    $(".content-area").html(result);
    return false;
}});

另外,因为您提到您正在使用锚标记(“链接”),您可能不希望默认浏览器操作为您的链接触发(它们可能正在刷新页面)。从事件处理程序返回 false 将防止这种情况发生(相当于调用 e.preventDefault() 和 e.stopPropagation())。

确保没有其他事件处理程序(在 document 或 direct 之前)不调用 stopPropagation(或返回 false)。这将阻止事件到达文档。

这是一个fiddle,表明它正在工作

另外,.click(function...).on("click", function()... 相同 http://api.jquery.com/click/
http://api.jquery.com/on/

【讨论】:

  • 我使用过 $(document).on("click",".firstlink", function () { 并且如 OP 中所述,这似乎只适用于动态生成的链接与 firstlink类,而不是静态的并且仍然存在于 DOM 中的具有相同类名的链接。
  • 我也改成函数(e),加上return false;它仍然不适用于两个链接。控制台不输出任何警告或错误,这两个元素在我点击它们之前和之后肯定都有“firstlink”类。
  • 您是否注册了任何可能在点击这些元素时运行的处理程序。如果其中一个处理程序停止传播(即 e.stopPropagation 或返回 false),则文档中的处理程序将不会运行。
  • 我想是的,是的。我有这个:- ` $("#nav ul li a").click( function () { // 在这里做一些其他不相关的事情。return false; });` 这可以克服吗?
  • @GrantG 我不知道你的项目的细节,但如果你想要做的只是阻止默认浏览器操作,你可以通过调用 e.preventDefault() 来做到这一点$("#nav ul li a").click( function (e) ...。它不会停止传播,但会阻止锚标记的默认操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-25
  • 2012-08-14
  • 2021-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多