【问题标题】:Attach JQuery Click Event to Anchor Id将 JQuery 点击事件附加到锚点 ID
【发布时间】:2012-06-28 23:21:54
【问题描述】:

我有一个简单的 SO。为什么我不能将点击事件直接附加到锚点 ID?我应该指出我也在使用 JQuery Mobile。

            <div id="foobarNavbar" data-role="navbar" style="display:none;">
                <ul>
                    <li><a id="foo" href="#foo" data-icon="plus">New Event</a></li>
                    <li><a id="bar" href="#bar" data-icon="grid">Events</a></li>
                </ul>
            </div><!-- /foobarNavbar-->

我正在尝试将点击事件附加到 foo。这不起作用:

        $('#foo').bind('click', function(e) 
        {   
            e.preventDefault();
            console.log("You clicked foo! good work");
        });

这确实有效,但给了我 foo 和 bar 的点击事件。是无法绑定到锚 Id 还是我犯了菜鸟错误?

        $('#foobarNavbar ul li a').bind('click', function(e) 
        {   
            e.preventDefault();
            console.log("You clicked foo! good work");
            console.log(e);
        });

【问题讨论】:

  • 第一个should work fine。代码执行时 DOM 准备好了吗?
  • jsfiddle.net/cwyRb 第一个确实有效。
  • 它是 JQuery Mobile。页面未加载到文档准备好的 dom 中

标签: javascript jquery jquery-mobile jquery-click-event


【解决方案1】:

重要提示:使用 $(document).bind('pageinit'),而不是 $(document).ready()

在 jQuery 中学习的第一件事是在 $(document).ready() 函数,所以一切都会在 DOM 已加载。然而,在 jQuery Mobile 中,Ajax 用于加载 导航时将每个页面的内容放入 DOM,并且 DOM 准备就绪 处理程序仅对第一页执行。每当一个 新页面加载并创建后,您可以绑定到 pageinit 事件。 此事件在本页底部有详细说明。

我尝试使用 document ready 而不是 pageinit 进行绑定。第一个函数

$('#foo').bind('click', function(e) 
        {   
            e.preventDefault();
            console.log("You clicked foo! good work");
        });

移动到“pageinit”事件时工作正常。但是,我仍然不确定为什么第二个代码示例有效但第一个无效。

【讨论】:

    【解决方案2】:

    我想它会起作用的......

    $('#foobarNavbar').on('click','#foo', function(e) {   
       e.preventDefault();
       e.stopPropagation();
       console.log("You clicked foo! good work");
       console.log(e);
    });
    

    【讨论】:

      【解决方案3】:

      将该代码包装在文档 ready 中,如果您没有任何其他脚本错误并且您已加载 jQuery,它应该可以工作。

      $(function(){
         $('#foo').click(function(e) 
         {   
            e.preventDefault();
            console.log("You clicked foo! good work");
         });
      });
      

      【讨论】:

      • 我同意这是正确的做法,但如果 OP 中的第二个示例有效,则必须是他已经在使用“就绪”处理程序或其他东西来确保 DOM准备好了。
      • 从 jQuery 1.7 开始,你应该使用 .on(event, handler) 而不是 bind
      • @Pointy;我同意。我猜可能还有其他一些脚本错误。或者另一种可能性是他在 1 mnt 之后单击了第二个示例(DOM 应该已经加载)然后匆忙单击了第一个!
      • 它已经准备好包装在文档中。我认为问题可能出在 JQuery Mobile 上。我只是将绑定移动到“pageinit”事件并且它可以工作。
      • @CrimsonChin:你没有在他提问的任何地方提到它是 jQuery Mobile!也总是尝试使用正确的标签。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多