【发布时间】:2015-08-21 20:01:22
【问题描述】:
我想知道是否可以使用 MutationObserver 来监控 window.location.pathname(或 window.location.hash)的变化。
【问题讨论】:
标签: javascript
我想知道是否可以使用 MutationObserver 来监控 window.location.pathname(或 window.location.hash)的变化。
【问题讨论】:
标签: javascript
变异观察者观察的是 DOM,而不是对象,与这里无关。
对象观察者不能观察location.hash,不能因为location是系统对象或安全风险,但因为hash是内部管理的综合属性相当于 getter 和 setter。
在您的情况下,您不需要任何这些。您可以使用 popState 事件观察哈希变化。
window.onpopstate=function() { console.log("foo"); };
location.hash = "bar";
"foo"
我不知道您关注location.pathname 的变化的意图是什么。这将在您的处理程序有机会做任何事情之前导致页面重新加载。
【讨论】:
不 - 你不能使用 MutationObservers
新的 EcmaScript 7(预览版,草稿)将拥有Object.observe,这将允许您监控任何对象。但是,这行不通:观察全局对象存在安全风险,我怀疑任何浏览器都会允许这样做 (Chromium issue 494574)。
另外,正如其他人指出的那样,window.location 是一个系统对象(位置对象类型),因此Object.observe 没有涵盖它。
您可以使用已经支持 Object.observe 的 Chrome 43 进行测试:kangax.github.io/compat-table/es7/#Object.observe
所以唯一的解决方案是使用超时机制观察变化或使用window.onpopstate(如果您只需要监控哈希)。
【讨论】:
location,作为快速测试将验证。你不能做的是观察location.hash 和大多数其他属性或location,因为它们不是常规属性。
location,它适用于foo 等非标准属性。它只是不适用于 hash 等“神奇”属性。
window,确实不是不可观察,不是window.location。
Object.observe 一直是deprecated,我目前不确定是否有替代方案可以涵盖这种情况。
window.location.path 不是 DOM 的一部分,因此不能在其上使用 MutationObservers。
但您可以执行“脏检查”:
function watchPathChanges () {
var currentPath = window.location.pathname;
setInterval({
if(window.location.pathname !== currentPath) {
currentPath = window.location.pathname;
//do something when it has changed
}
}, 50);
}
使用 EcmaScript 7,Object.observe() 原生支持监视属性更改:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/observe
【讨论】: