【问题标题】:Dynamic hide/show not functioning with .on动态隐藏/显示不适用于 .on
【发布时间】:2017-08-11 16:57:01
【问题描述】:

已尝试环顾四周,但被我的一个动态触发器卡住了。

我已经检查了与此相关的其他线程,但似乎有一些其他代码错误可能导致建议的 .on 方法失败。

代码旨在隐藏/显示 2 个单独的 - 有一些初始预渲染的,还有一些之后动态加载的。

预渲染很好,动态渲染失败。

Jquery:

   $("div .flipper_link").on("click", function () {

             $(this).parent().find(".contain_content").toggle();
             $(this).parent().find(".card-tags").toggle();

        });

以及动态创建的代码:

 <div class="callout_surround">
                        <div class="callout ct_shop">
                            <div class='header-global header-shop'>Shop</div>
                            <div class="flipper_link header-shop"><i class="fi-loop"></i></div>


                            <div class='contain_content' uid="74" data-popup-open="popup-1">
                                <img src='images/someimage.jpg' class='img_cont'/>

                                <div class='tile-text-cont'>

                                    <div class='tile-desc'>
                                        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut non scelerisque

                                    </div>
                                </div>
                            </div>
                            <div class="card-tags">Some tags etc</div>

                        </div>

                    </div>

我是 jQuery 的新手,如果我使用了错误的方法,请道歉!

【问题讨论】:

  • 当您是 jquery 新手时,这并不明显,请在此处阅读:stackoverflow.com/questions/203198/…
  • 本质上,当你连接一个事件时,它只适用于当时存在的元素——所以如果你添加更多的元素,它们就不会有这个事件。
  • 尝试使用$(document).on("click",".flipper_link", function()
  • 即使假设你让它工作,你为什么要将点击事件绑定到 div 元素?不会使用鼠标的用户将如何使用您的页面?您应该使用锚元素,以便仅使用键盘的用户可以通过 Tab 键找到它们并用键盘“单击”它们。

标签: jquery dynamic-content


【解决方案1】:

对于动态 HTML,请使用 jquery on() 方法,例如:

$(document).on("click",".flipper_link", function(){
    // do some thing here
});

【讨论】:

  • 好的,已编辑代码以添加文档和 .flipper_link - 现在它们都不起作用了吗?
  • 这会添加一个监听器,每个单击事件都会触发该监听器。建议在这里使用选择器而不是文档。
【解决方案2】:

您将点击事件附加到的选择器不能是动态的。如果您删除该选择器然后再次添加它,这将删除单击事件或任何 jQuery 事件。

您必须将事件附加到一个选择器,该选择器一开始就在那里,并且一直在那里。您不能使用动态添加或稍后删除的。

谢天谢地,jQuery 的on() 方法让我们有机会指定第二个选择器来缩小范围并实现您想要实现的目标。以前使用live() 来实现这一点,但新的方式更快。如果您使用的是旧版本的 jQuery,您可能需要使用 live()。如果这不起作用,请告诉我您的版本是什么。

不建议在标记中使用 onclick 事件,原因有很多,我在此不再赘述。您可以查看stackoverflow.com/questions/12627443/jquery-click-vs-onclick,但不推荐使用.click。也不建议将事件附加到主文档,例如使用 $(document).on(),因为每次有人点击页面上的任何内容时都会触发。

您将把事件放在一个非动态的初始选择器上,然后在第二个参数中引用您的动态选择器,如下所示:

$("#non-dynamic").on("click", ".flipper_link", function () {

您将不得不向您的代码中添加更多代码,或者在您的标记中引用更高的非动态选择器。这是一个有效的 sn-p:

$(document).ready(function() {
    $("#non-dynamic").on("click", ".flipper_link", function () {
      $(this).parent().find(".contain_content").toggle();
      $(this).parent().find(".card-tags").toggle();
    });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="non-dynamic">
<div class="callout_surround">
  <div class="callout ct_shop">
     <div class='header-global header-shop'>Shop</div>
         <a class="flipper_link header-shop">
            <i class="fi-loop">Test Link</i>
         </a>
          <div class='contain_content' uid="74" data-popup-open="popup-1">
             <img src='images/someimage.jpg' class='img_cont'/>
             
             <div class='tile-text-cont'>
                <div class='tile-desc'>
                                        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut non scelerisque

               </div>
           </div>
        </div>
        <div class="card-tags">Some tags etc</div>
    </div>
</div>
</div>

【讨论】:

  • 当该内容是动态的时,它会失败
  • 哦,好的。你怎么改?究竟什么是动态?
  • 试试看 - 只要 .callout_surround 没有改变,它应该可以工作。
  • 所有来自/包括 'callout_surround' div 的数据都通过 .append(data);方法。任何预渲染的东西都可以正常工作,但随后会因动态添加的内容而中断(希望这足够清楚!)
  • 是的,它因为我所说的原因而中断。您应该包含代码的其他部分,因为它是导致问题的原因。我将对此进行编辑,以便为您提供一个更好的示例。
【解决方案3】:

修复它的简单方法是将您的 javascript 更改为:

<script>
function flipValues(div) {
     $(div).parent().find(".contain_content").toggle();
     $(div).parent().find(".card-tags").toggle();
}
</script>

更改动态生成的 html 以在要翻转的 div 上单击。

例子:

    <div class="flipper_link header-shop"  onclick="flipValues(this);">
           <i class="fi-loop"></i>
   </div>

【讨论】:

  • 在控制台中给我这个 - 未捕获的 ReferenceError: div is not defined
  • 您是否在动态创建的 html 中传递了这个参数?
  • 谢谢,使用添加的 'this / div' 可以正常工作
  • 无需将javascript: 放入内联事件处理程序中。
  • 编辑删除 javascript:根据 nnnnnn 的评论
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 2016-01-09
  • 2014-08-30
  • 2021-10-29
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多