2015-03-31 24 views
1

我需要在页面变化的散列,我知道有很多方法可以知道什么时候喜欢使用jQueryObject.observe上document.location

$(window).on('hashchange', function() { 
    // do something 
}); 

哈希值发生变化我试图执行一个js脚本使用Object.observe但它不起作用,我只是想知道为什么它没有,为什么在更新document.location对象后回调不起作用。

Object.observe(document.location, function(changes) { 
    console.log(changes); 
}); 

回答

2

document.location与许多其他DOM对象一起陷入其中按规格没有表现得像普通本地JS对象主机对象的类别。尽管Object.observe可能适用于其中一些对象,但它不可靠并且不会为document.location工作。

又如它不工作是:

var el = document.createElement('div'); 
 
document.body.appendChild(el); 
 
Object.observe(el, function(change) { console.log('changed ', change[0].name); }) 
 

 
el.id = "hello"; 
 
el.foo = "bar";

+0

,使sens。在你的例子中,它适用于属性'foo'而不是'id',我尝试过'document.location',它对一个随机属性起作用,但对'.hash'不起作用。感谢您的回答 – Khalid 2015-03-31 14:55:12

0

我相信你无法使用Object.observe()是因为document.location返回Location Object类型的对象(这是特殊的只读接口),而不是“标准”的对象,观察document.location的原因。

从Mozilla的文档:

的Document.location只读属性返回Location对象。 Document对象的位置属性是指位置 对象。 Window.location是一个只读的Location对象。

位置接口: https://developer.mozilla.org/en-US/docs/Web/API/Location

实施例:

console.log(document.location.__proto__); // returns Location {} 
console.log(window.location.__proto__); // returns Location {} 
window.location === document.location // always true 

的Object.observe()方法被用于观察的变化的一个对象。

例子:

var o = { name: ''}; 
Object.observe(o, function(changes){ 
    changes.forEach(function(change) { 
    console.log(change.type, change.name, change.oldValue); 
}); 
}); 
o.name = 'foo'; // name is being observed 

看,如果你测试对象是否在其原型链有一个构造函数,你可以得到的原型属性在他们的__proto__

console.log(document.location.__proto__); // returns Location {} 
console.log(window.location.__proto__); // returns Location {} 
console.log(o.__proto__);     // returns Object {} 

足够有趣的差异:代码示例:

var o = { 
 
    name: '' 
 
}; 
 
Object.observe(o, function(changes) { 
 
    changes.forEach(function(change) { 
 
    console.log(change.type, change.name, change.oldValue); 
 
    }); 
 
}); 
 

 
o.name = 'foo'; 
 

 

 
console.log(document.location.__proto__); // returns Location {} 
 
console.log(window.location.__proto__); // returns Location {} 
 
console.log(o.__proto__); // returns Object {} 
 

 

 
console.log(document.location instanceof Object); // true 
 
console.log(o instanceof Object); // true

+0

能请你阅读我的文章?我知道我不能在'document.location.hash'上做,我在'document.location'上做了。它不会返回一个错误,但它不起作用 – Khalid 2015-03-31 14:18:01

+0

我不认为这是正确的 - 最初的问题是观察document.location而不是document.location.hash。 – Jasvir 2015-03-31 14:18:22

+1

谢谢你,我会仔细检查,并且我会编辑我的答案,谢谢你的评论.... – GibboK 2015-03-31 14:24:23

相关问题