首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object.observe on document.location

Object.observe on document.location
EN

Stack Overflow用户
提问于 2015-03-31 14:03:33
回答 2查看 828关注 0票数 1

当页面的散列发生变化时,我需要执行js脚本,我知道有许多方法可以知道哈希何时发生变化,比如使用jQuery。

代码语言:javascript
复制
$(window).on('hashchange', function() {
   // do something
});

我试着使用Object.observe,但它不起作用,我只是想知道为什么它不起作用,为什么在更新document.location对象之后回调没有启动。

代码语言:javascript
复制
Object.observe(document.location, function(changes) { 
    console.log(changes);
});
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-31 14:45:55

document.location和许多其他DOM对象都属于宿主对象的范畴,按照规范,这些对象的行为不必像常规的原生JS对象。虽然Object.observe可能适用于其中的一些对象,但它的行为并不可靠,而且碰巧不适用于document.location。

另一个不起作用的例子是:

代码语言:javascript
复制
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";

票数 2
EN

Stack Overflow用户

发布于 2015-03-31 14:15:29

我认为,您不能使用document.location来观察Object.observe()的原因是,document.location返回一个Location Object类型的对象(这是特殊的只读接口),而不是“标准”对象。

来自Mozilla文档:

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

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

示例:

代码语言:javascript
复制
console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__);   // returns Location {}
window.location === document.location // always true

Object.observe()方法用于观察对象的更改。

示例:

代码语言:javascript
复制
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__的不同之处

代码语言:javascript
复制
console.log(document.location.__proto__); // returns Location {}
console.log(window.location.__proto__);   // returns Location {}
console.log(o.__proto__);                 // returns Object {}

如果您测试一个对象的prototype链中是否包含构造函数的prototype属性,那么非常有趣:

代码语言:javascript
复制
console.log(document.location instanceof Object); // true
console.log(o instanceof Object); // true

代码示例:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29370477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档