1

我正在使用 YUI 浏览器历史管理器来跟踪 Ajax 导航。我正在注册历史对象,例如:

YAHOO.util.History.register("state",init, onStateChange);

当我这样做时,这里会调用 onStateChange

YAHOO.util.History.navigate("state",urlhash);

当我按下后退按钮时。

有没有办法知道 onStateChange 是在后退按钮上调用还是通过调用导航?

4

1 回答 1

1

如果此事件有时可以由外部系统调用(在本例中为浏览器后退按钮)并且有时由您自己的代码调用,您可以通过在您自己的代码调用该方法时要求执行一些特殊操作来区分调用者。在您自己的辅助方法中包装对 navigate() 的调用可以帮助确保您对此保持一致。

在 YUI 文档中,我看到 register() 可以采用可选的第四个参数(以及其他参数),该参数是一个任意对象,它将被传递到您的 onStateChange 处理程序函数中。此对象的属性之一可能是一个标志,表明它是从您的代码调用而不是由浏览器启动,并且在您的 navigate() 包装器中始终设置该标志。请记住将其设置回您的处理程序中。

注意:我对 YUI 不像 ExtJS 那样熟悉,也许一些更了解 API 的大师可以提供帮助,但这是一个可行的通用策略。这个答案做了一个不优雅的假设,即调用 navigate() 将使该处理程序在任何其他导航有机会发生之前可靠地触发,这在单线程 javascript 世界中可能是一个安全的赌注。

于 2012-05-14T18:27:36.027 回答