【问题标题】:hashchange only when not from clickhashchange 仅当不是点击时
【发布时间】:2012-04-21 06:38:08
【问题描述】:

我正在使用这个

$(window).bind('hashchange', gotohash);

为我的应用添加深层链接。

我的问题是,当我单击带有 href=#whatever<a> 时,它也会触发 我只想在用户使用浏览器的后退和前进按钮或直接转到其中包含哈希的 url 时使用它。

我正在考虑hashChangeEnabled=true/false,然后每次点击都将其关闭

但是有没有更简单的方法来检测它是否是由点击引起的?

最佳做法是什么?


我的解决方案

var disableHashChange = false;

$(window).bind('hashchange', function(){
  if(!disableHashChange ){
    gotohash();
  }
  disableHashChange = false;
});

$('.link').click(function(){
  disableHashChange = true;
}

回答由imsky

var lastLinkEvent;

$(window).bind('hashchange', function(){
  if(lastLinkEvent != window.location.hash){
    gotohash();
    lastLinkEvent = "";
  }
});

$('.link').click(function(){
    lastLinkEvent = $(this).attr('href');;
}

谢谢

【问题讨论】:

  • 重新考虑应用程序的流程可能会更好...
  • Miro,在上面的“答案”部分 - 如果变量 lastLinkEvent 不在全局范围内,那么它也可以通过'hashchange' 事件?谢谢。
  • 是的。 lastLinkEvent 应该在全局范围内:)

标签: jquery hash click


【解决方案1】:

hashchange 事件将在您更改位置时触发,因此如果您不希望在单击链接时触发它,请更改链接 href 属性或添加使用 preventDefault 的点击处理程序。

编辑:鉴于您希望您的链接工作,您应该设置一个仅限于链接事件的应用程序变量,例如lastLinkEvent,并将其设置为包含在其 URL 中的哈希值。然后在你的处理函数中,检查lastLinkEvent是否已经是hash,如果是,阻止执行。

【讨论】:

  • 但我确实希望更改我的网址。我只是不想触发 hashchange 事件。我的点击处理程序已经完成了 hashchange 事件所做的事情。所以现在它做了两次同样的事情。
  • 它适用于我在 lastLinkEvent!=hash 时执行的唯一异常,而不是阻止执行。
  • 所以基本上发生的事情是 lastLinkEvent 比 hashchange 快,它说...“嘿,这个 hashchange 正在形成一个链接。不要开火”?正确的 ? :)
  • 这就是我的意思(当 lastLinkEvent 不是哈希时执行)。关于执行顺序:您可以通过使用preventDefault和手动更改document.location来保证正确的执行顺序。或者,您可以将处理程序更改为使用mousedown,这将使hashchange 在单击处理程序之前几乎不可能触发。
【解决方案2】:

只需检查当前目标是否是 hashchange 内的锚标记

http://api.jquery.com/event.currentTarget/

【讨论】:

  • 这行不通,因为对于 onhashchange 事件,目标始终是“窗口”,即使 hashchange 是由锚标记触发的。
猜你喜欢
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2016-04-13
  • 1970-01-01
  • 2012-02-22
  • 1970-01-01
相关资源
最近更新 更多