【问题标题】:jquery event not firing on second clickjquery 事件不会在第二次点击时触发
【发布时间】:2015-09-02 05:48:06
【问题描述】:

我有如下的 html。我想添加切换功能,其中 class=togglediv 的 div 应在单击标题为 class=grid-1of1 时显示或隐藏。

问题是我打开切换按钮时的第一次点击工作正常。但是,当我再次单击标题以隐藏 div 时,单击事件不会被触发。

HTML:

<div class="thead clearfix commonHeader">
               <div class="gs grid-1of1 hcell pointer">
                            <p>Sales<span class="icn"></span></p>
                        </div>
                <div class="togglediv" style="display: block;">
                <div id="salesProductsMultiDiv" class="clearfix ms-shim">
                    <p class="loader center hide"><img class="loadingIcon" src="/resources/images/spinner.gif"></p>

    <div class="vError mls pll hide" data-id="salesProductsMulti"><span class="mll">Please select a product</span></div>
    <select id="salesProductsMulti" class="multiselect" multiple="multiple" style="position: absolute; left: -9999px;">
    <option value="iphone" data-id="iphone" title="iPhone">iPhone </option><option value="ipad" data-id="ipad" title="iPad" selected="selected">iPad </option><option value="mac" data-id="mac" title="Mac" selected="selected">Mac </option><option value="ipod" data-id="ipod" title="iPod" selected="selected">iPod </option><option value="appletv" data-id="appletv" title="Apple TV" selected="selected">Apple TV </option><option value="beats" data-id="beats" title="Beats">Beats </option><option value="watch" data-id="watch" title="Watch">Watch </option><option value="watchedition" data-id="watchedition" title="Watch Edition">Watch Edition </option>
    </select><div id="ms-salesProductsMulti" class="ms-container"><div class="ms-selectable" data-id="salesProductsMulti"><input type="text" class="multiselect-filter field-input field-text" autocomplete="off" placeholder="Available Products"><ul class="ms-list ms-focus"><li class="ms-elem-selectable" id="_i_p_h_o_n_e_-selectable"><span>iPhone </span></li></ul></div></div>
</div>

                <div class="clearfix field-block channelInputText">
                    <label class="h-label" for="salesSearchRadius">Search Radius</label>
                    <input class="h-input input-n field-input field-text" type="text" value="" data-id="salesSearchRadius" maxlength="35" id="salesSearchRadius">
                </div>

                <div class="clearfix field-block channelInputText">
                    <label class="h-label" for="salesMaxResults">Max Results</label>
                    <input class="h-input input-n field-input field-text" type="text" value="" data-id="salesMaxResults" maxlength="35" id="salesMaxResults">
                </div>
                </div>
             </div>

Javascript:

$('.commonHeader .grid-1of1').off('click').on("click", function(event) {            
                var $this = event.currentTarget;
                if($($this).is('.grid-1of1')){
                    $($this.parentElement.getElementsByClassName('togglediv')).toggle();
                }
            });

【问题讨论】:

  • 删除off('click')
  • var $this = event.currentTarget: 我相信 jQuery 会为你做到这一点。
  • 这似乎对我有用。
  • 您在控制台中是否有任何错误,您在使用什么浏览器?
  • 无法在您的代码中重现该问题。我还创建了jsfiddle.net/xz8x7oma 供参考

标签: jquery


【解决方案1】:

试试这个

js fiddle 工作示例。

 $('.commonHeader .grid-1of1').click(function () {

     $(this).parent().find('.togglediv').toggle();

});

【讨论】:

    【解决方案2】:

    改成这样:

    $(document).ready(function(){ // as per comment try the code in this block.
        $('.commonHeader .grid-1of1').off('click').on("click", function(event) {
          var $this = $(event.currentTarget); // make a jquery selector
          $this.siblings('.togglediv').toggle(); // use ".siblings('targetClass')" to toggle
        });
    });
    

    您可以使用.siblings() 方法来定位要切换的所需div。

    或者你可以尝试使用javascript的Node.nextElementSiblings作为:

    $($this.nextElementSibling).toggle();
    

    $('.grid-1of1').off('click').on("click", function(event) {
      var $this = $(event.currentTarget);
      $this.siblings('.togglediv').toggle()
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="gs grid-1of1 hcell pointer">
      <p>Sales<span class="icn"> span</span>
      </p>
    </div>
    <div class="togglediv" style="display: block;">togglediv</div>

    现在看起来您的页面上有动态生成的元素。因此,如果您尝试绑定任何不起作用的直接事件,则必须委托给页面加载时可用的最近的静态父级或document 本身。试试这个:

    $(document).on("click", ".grid-1of1", function(event) {
      var $this = $(event.currentTarget);
      $this.siblings('.togglediv').toggle();
    });
    

    【讨论】:

    • $('.grid-1of1').off('click').on("click", function(event) { var $this = $(event.currentTarget); $this.兄弟姐妹('.togglediv').toggle() });
    • @newtextJS 你有任何控制台错误吗?检查您是否在此脚本上方添加了 jQuery 库。
    • 控制台没有错误。如果我在 jsfiddle 中单独尝试它的工作但不在我的应用程序中
    • @newtextJS 好的!!!似乎您缺少文档就绪块。尝试将其包装在文档就绪块$(document).ready(function(){ //put all the code here });
    • @newtextJS 是所有这些元素由一些库代码或一些自定义 js 代码动态生成的。
    猜你喜欢
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多