【问题标题】:Hash change cancel double trigger("click")哈希更改取消双触发(“点击”)
【发布时间】:2013-05-23 21:56:53
【问题描述】:

我这里有一些循环,代码下的解释。

        $(document).ready(function(){
            var newHash      = "";
            $('a').click(function(event) {
                var id = $(this).attr('href');
                alert(id);
                //Do something with selector with id that is clicked

                window.location.hash = $(this).attr("href");
                event.preventDefault(); 

            });
            $(window).bind('hashchange', function(){

                newHash = window.location.hash.substring(1);

                if (newHash) {
                   $("ul li." + newHash + " a").trigger("click");
                };

            });

            $(window).trigger('hashchange');
        })


    <ul>
        <li class="first"><a href="#first">first</a></li>
        <li><a href="#second">second</a></li>
        <li><a href="#third">third</a></li>
    </ul>

我正在使用 Ben Alman 的 ba-hashchange 插件 这是现场示例 -> EXTERNAL LINK ON MY SERVER

请注意,当您单击“#first”时,您会收到 2 个警报 但是当粘贴带有更改哈希的链接时 ->CHANGED HASH 您只有一个警报。

它就像一个循环,当您点击链接时,您会从点击中获得警报,并从更改 URL 触发新哈希。 所以你收到了 2 个警报。

我只想要 1 个警报。 在这种情况下。您粘贴链接其触发器链接,该链接假定来自哈希名称,您收到 1 个警报。 当您单击链接时,它会更改哈希,但不会触发它更改此哈希。

【问题讨论】:

    标签: javascript jquery hash triggers hashchange


    【解决方案1】:

    问题毫无意义,现在解决了。在这种情况下,我只需要。

    $(document).ready(function(){
            var newHash      = "";
            $('a').click(function(event) {
    
                //Do something with selector with id that is clicked
    
                window.location.hash = $(this).attr("href");
                event.preventDefault(); 
    
            });
            $(window).bind('hashchange', function(){
    
                newHash = window.location.hash.substring(1);
    
                if (newHash) {
    
                alert(newHash);
                };
    
            });
    
            $(window).trigger('hashchange');
        })
    

    这是微不足道的,因为我的问题很复杂,但我需要和它一起睡觉才能理解

    【讨论】:

      【解决方案2】:

      您收到两个警报,因为当您加载没有哈希的页面时,您实际上点击了两次“第一个”链接。这就是正在发生的事情:

      1. 访问your site
      2. 您的 'hashchange' 处理程序被调用(因为某些原因您调用了 $(window).trigger('hashchange'),但是因为没有 newHash 值,所以没有任何反应
      3. 点击“第一”
      4. 您的点击处理程序被调用,您调用alert()(第一个警报!)然后更改哈希
      5. 因为哈希是从您的点击处理程序中更改的,所以会调用您的“hashchange”处理程序,现在因为 newHash 具有有效值,您的处理程序再次(以编程方式)单击链接,您会收到第二个警报。

      当您使用预设哈希加载页面时,会发生一组类似的事件:

      1. 使用哈希集访问your site
      2. 您的 'hashchange' 处理程序已被调用,但与以前不同的是,现在有一个非空的 newHash 值,因此您的代码以编程方式单击第一个链接并收到警报。哈希值设置为与之前相同的值,因此 hashchange 处理程序不执行任何操作。
      3. 点击“第一”
      4. 您的点击处理程序被调用,alert() 被调用,但您的哈希值保持不变,因此您的 hashchange 处理程序不会被调用。因此,在这种情况下,您只会收到 1 个警报。

      不完全清楚你想要完成什么......因为如果你只是想操纵哈希值,你可以从 hashchange 处理程序中这样做 - 为什么你的 hashchange 处理程序点击你的链接?同样,如果您只想操作与链接相关的某些属性,您可以在点击处理程序中执行此操作 - 为什么还要麻烦将其粘贴到哈希中?

      【讨论】:

      • 我知道我所做的毫无意义,因为它是某种圆圈。我想创建一些函数来触发 hashchange 上的警报并单击链接,而不是像它发生的那样加倍。我不知道该怎么做。这就是我写这个问题的原因。我想要更改哈希值,例如当我复制一些链接并获得位置和操作时滚动网页。
      • 好吧,这些问题现在很愚蠢,我得到了我想要的以及如何去做。谢谢
      猜你喜欢
      • 2012-02-13
      • 1970-01-01
      • 2012-07-07
      • 1970-01-01
      • 2014-06-06
      • 2020-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-02-28
      相关资源
      最近更新 更多