首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Object.observe()不工作本机图像对象

Object.observe()不工作本机图像对象
EN

Stack Overflow用户
提问于 2014-12-11 16:42:30
回答 2查看 149关注 0票数 0

这不起作用(在OSX上的chrome 39中):

代码语言:javascript
复制
var x = new Image();
Object.observe(x, function(){console.log('i never run');})
x.src = 'http://www.foo.com';
console.log('has been set: ' + x.src);

但这将:

代码语言:javascript
复制
var x = new function nonNative(){};
Object.observe(x, function(){console.log('i will run');})
x.src = 'http://www.foo.com';

这一点也是如此:

代码语言:javascript
复制
var x = new XMLHttpRequest();
Object.observe(x, function(){console.log('so will i');})
x.src = 'http://www.foo.com';

因此,这个问题并不直接与图像是一个本地构造函数有关(因为XMLHttpRequest按预期工作)--它似乎是特定于设置img.src的。我只能猜测这是因为设置src非常类似于一个方法(因为它会导致请求的发出)。JS中是否有这样一种方法,可以像属性一样调用?

假设不是这样的话,是否有人知道/能够猜测这是否是Object.observe的理想行为(在mdn文档中什么都看不见),如果没有,我可以在哪里报告它是一个bug呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-11 16:48:11

x.src =x.setAttribute('src', ...的一种缩写,设置属性不会触发Object.observe--这是DOM世界,而不是JS对象世界。HTMLElements上的属性是而不是 JS对象属性(尽管有时它们假装是;实际上它们隐藏在attributes属性中作为NamedNodeMap),JS对象属性是Object.observe观察到的。您可以通过在图像上设置一个非属性属性来验证这一点,并看到观察者函数的触发。

XMLHttpRequest上设置XMLHttpRequest是可行的,因为XMLHttpRequest只是一个普通的旧JS对象,而src只是它上的一个普通的旧属性。

如果要观察属性更改,可以使用突变观察者。

票数 1
EN

Stack Overflow用户

发布于 2014-12-11 17:02:05

正如其他人所提到的,src不是一个属性,它是一个已定义的getter/setter对,因此通过分配它,您实际上是在调用一个函数。

因为这是一个DOM元素,所以最好使用MutationObserver

代码语言:javascript
复制
var x = new Image();
var observer = new MutationObserver(function(){
    console.log('i will run');
});

observer.observe(x, {attributes: true});

x.src = 'http://www.example.com.com'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27428000

复制
相关文章

相似问题

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