【问题标题】:Why does my first snippit work, but my second doesn't?为什么我的第一个片段可以工作,而我的第二个却不行?
【发布时间】:2013-09-10 11:20:27
【问题描述】:

我正在尝试将点击事件绑定到 jQuery 中的新 <div />。以下代码片段有效(当我单击 div 时,我看到“点击”消息)但是,第二个没有。

谁能告诉我为什么?

工作 sn-p :

'use strict';

(function () {
    $(document).ready(function () {
        var $display = $('#display'),
            $drawingArea = $('<div />')
                .attr('id', 'drawing-area')
                .click(function() {
                    alert('clicked');
                });

        $display.wrap($drawingArea);
    })
})();

不工作 sn-p : (警报“准备”被触发,但不是点击“)

'use strict';

(function () {
    $(document).ready(function () {
        var $display = $('#display'),
            $drawingArea = $('<div />')
                .attr('id', 'drawing-area');
        $display.wrap($drawingArea);

        $drawingArea.ready(function() {
            alert('ready');
            $drawingArea.click(function() {
                alert('clicked');
            })
        });

    })
})();

更新

刚刚尝试了以下方法:

(function () {
    $(document).ready(function () {
        var $display = $('#display'),
            $drawingArea = $('<div />')
                .attr('id', 'drawing-area');
        $display.wrap($drawingArea);

        $drawingArea.ready(function() {
            alert('ready');

        });

        $drawingArea.click(function() {
            alert('clicked');
        })
    })
})();

“就绪”警报已触发,但没有“已点击”警报。

HTML

<section id="main">
    <svg id="display" xmlns="http://www.w3.org/2000/svg">

    </svg>
</section>

更新 2 刚刚注意到,当我用 chrome 开发工具疯狂点击时,在 &lt;/html>

之前打开了这个appeads
<div id="gdx-bubble-container">
   <div id="gdx-bubble-main" style="left: 0px; top: 1023.4375px;">
      <div id="gdx-bubble-close"></div>
      <div id="gdx-bubble-query-container" class="gdx-display-block">
         <div id="gdx-bubble-query">not</div>
         <div id="gdx-bubble-audio-icon" class="gdx-display-block"></div>
         <div id="gdx-bubble-query-container-end"></div>
      </div>
      <div id="gdx-bubble-meaning">Used with an auxiliary verb or “be” to form the negative</div>
      <div id="gdx-bubble-options-tip" class="gdx-display-block">Tip: Didn't want this definition pop-up? Try setting a trigger key in <a href="chrome-extension://mgijmajocgfcbeboacabfgobmjgjcoja/options.html" target="_blank">Extension Options</a>.</div>
      <div id="gdx-bubble-attribution" class="gdx-display-none">
         <a target="_blank"></a>
         <div></div>
      </div>
      <div id="gdx-bubble-more" class="gdx-display-block"><a target="_blank" href="http://www.google.com/search?q=define+not">More »</a></div>
   </div>
   <div id="gdx-arrow-container">
      <div id="gdx-arrow-main" style="top: 1145.4375px; left: 10px;">
         <div id="gdx-bubble-arrow-inner-down"></div>
         <div id="gdx-bubble-arrow-outer-down"></div>
      </div>
   </div>
</div>

【问题讨论】:

  • 您是否尝试从 $drawingArea.ready 中取出 $drawingArea.click(function() { ?
  • div 里面是什么?如果 div 为空,则没有可点击的内容。
  • @LiadLivnat 这就是第一个示例的作用,但是当问题是为什么它不起作用时并不重要。
  • @JanVladimirMostert div 里面有一个svg,我会将 HTML 添加到问题中。
  • 仅供参考,将ready 侦听器绑定到$drawingArea 是多余的,因为它包含在已经执行的$(document).ready 处理程序中。

标签: javascript jquery dom


【解决方案1】:

答案就在.wrap()的功能之内:

.wrap() 函数可以采用任何可以传递给 $() 工厂函数的字符串或对象来指定 DOM 结构。这个结构可以嵌套好几层,但应该只包含一个最里面的元素。 此结构的副本将环绕匹配元素集中的每个元素。

换句话说,当您说$display.wrap($drawingArea); 时,您正在创建$drawingArea副本。当您稍后将点击事件添加到它时,它不会被添加到实际在 DOM 中的副本中。

第一个 sn-p 有效,因为您要在.wrap() 操作之前添加点击事件,因此点击事件会与元素的其余部分一起复制。

【讨论】:

  • 好地方!谢谢
【解决方案2】:

正如Juhana (+1) 中指出的那样, wrap 创建结构的副本,因此您的 div $display 不会被对象本身包装。

您可以使用元素$display 的父元素来制作您的选择器:

'use strict';

(function () {
    $(document).ready(function () {
        var $display = $('#display'),
            $drawingArea = $('<div />')
                .attr('id', 'drawing-area');
        $display.wrap($drawingArea);

        $display.parent().ready(function() {
            alert('ready');
            $display.parent().click(function() {
                alert('clicked');
            })
        });
    })
})();

演示:http://jsfiddle.net/5ch9W/1/

【讨论】:

    【解决方案3】:

    这里少了一个分号:

            drawingArea.click(function() {
                alert('clicked');
            });
           ---^
    

    【讨论】:

    • 我不知道 Javascript 即使在严格模式下也允许丢失;
    • 不是downvoter,但这不是问题,在某些情况下可以省略分号 - 它们会在代码运行时自动插入。这可能会导致问题,所以这不是最佳实践,这是一篇好文章:mislav.uniqpath.com/2010/05/semicolons
    最近更新 更多