哈希更改取消双触发(“点击”)

时间:2013-05-28 19:54:46

标签: javascript jquery hash triggers hashchange

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

        $(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插件 这是实例 - &gt; EXTERNAL LINK ON MY SERVER

请注意,当您点击“#first”时,您会收到2条提醒 但粘贴链接时更改了哈希 - &gt; CHANGED HASH 你只收到一个警报。

它就像一个循环,当你点击链接时,你会看到来自更改​​URL的点击和新哈希警报。 所以你有2个警报。

我只想提醒一次。 在这种情况下。你粘贴它的触发链接,这个链接应该来自哈希名称并且你有1个警报。 当你点击链接时,它改变了哈希,但没有触发它改变这个哈希值。

2 个答案:

答案 0 :(得分:0)

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

  1. 访问your site
  2. 你的'hashchange'处理程序被调用(因为某些原因你调用了$(window).trigger('hashchange'),但是因为没有newHash值,所以没有任何反应
  3. 点击“第一个”
  4. 调用您的点击处理程序,调用alert()(第一次警报!)然后更改哈希值
  5. 因为哈希是从您的点击处理程序中更改的,所以您的'hashchange'处理程序被调用并且现在因为newHash具有有效值,您的处理程序再次(以编程方式)单击该链接并获得第二个警报。
  6. 当您使用预设哈希加载页面时,会发生类似的事件集:

    1. 使用哈希集
    2. 访问your site
    3. 您的'hashchange'处理程序已被调用,但与之前不同的是,现在存在非空的newHash值,因此您的代码会以编程方式单击第一个链接并获得警报。散列设置为与之前相同的值,因此hashchange处理程序不执行任何操作。
    4. 点击“第一个”
    5. 调用您的单击处理程序,调用alert(),但您的散列保持不变,因此不会调用您的散列更改处理程序。因此,在这种情况下,您只会收到1个警报。
    6. 目前还不完全清楚你要完成什么...因为如果你只是想操纵哈希的值,你可以从hashchange处理程序这样做 - 为什么你的hashchange处理程序会点击你的链接?同样,如果你只是想操纵一些绑定到链接的属性,你可以在点击处理程序中这样做 - 你为什么要把它粘在哈希中呢?

答案 1 :(得分:0)

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

$(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');
    })

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