【问题标题】:Javascript bug in Chrome and OperaChrome 和 Opera 中的 Javascript 错误
【发布时间】:2013-11-19 22:22:30
【问题描述】:

在为浏览器开发一些 JavaScript 代码时,我在 Chrome 中遇到了奇怪的错误:

var element = document.getElementById('someId');
element.style.customProp = 'my property';

element.addEventListener('click', function() {
    console.log(element.style.customProp);
}, false);

点击控制台打印“未定义”,但是当我将代码更改为:

var element = document.getElementById('someId');
element.style.customProp = 'my property';
var a = element.style;

element.addEventListener('click', function() {
    console.log(element.style.customProp);
}, false);

控制台打印“我的财产”。

代码的第一个版本在 Firefox 和 Internet Explorer 中按预期工作。它不在 Chrome 和 Opera 中。对我来说,这显然是一个错误,但也许我错过了一些东西。这真的是一个错误还是我错过了什么?

【问题讨论】:

  • 所以唯一的区别是您将“a”变量中的引用保存到“style”对象?
  • 我的猜测是 Webkit 浏览器的设计目的不是让您在样式对象上设置任何属性。不知道为什么第二个允许你这样做。
  • 如果我从 Chrome 控制台为“样式”对象设置随机属性,它似乎工作得很好。
  • 在控制台中运行 document.body.style.thisdoesntexist='asdfdf';console.log(document.body.style.thisdoesntexist) 打印未定义。
  • 似乎是一个错误。当我尝试复制时,它工作正常,除非我设置了边界半径。

标签: javascript google-chrome


【解决方案1】:

看起来像一个 WebKit 错误

参见Fiddle 1(有效)与Fiddle 2(无效)

某些属性似乎会阻止 Chrome 中的自定义样式属性。此测试显示边界半径,但其他测试可能显示。

我是否使用似乎并不重要:

var element = document.getElementById('someId');
element.style.customProp = 'my property';

element.addEventListener('click', function() {
    console.log(element.style.customProp);
}, false);

或:

var element = document.getElementById('someId');
element.style.customProp = 'my property';
var a = element.style;

element.addEventListener('click', function() {
    console.log(element.style.customProp);
}, false);    

值得我在 Chrome 31 上看到错误。不确定其他版本可能会受到影响。

已提交报告here

【讨论】:

  • 两个小提琴似乎都不起作用。在你重新运行它之后,它的第一个行为与第二个完全一样。检查这个小提琴jsfiddle.net/Lyb3u当你加载页面时它会正常工作,但重新运行它并检查行为。 Onload alert 工作正常,但 onclick 不行。
  • 我再次检查了你的小提琴,它们的表现和我的完全一样。当您加载页面时它们工作正常(单击时提醒“我的属性”),但在重新运行后,它们开始像描述的错误(提醒“未定义”)一样工作。尽管您可以在 JSfiddle 上重现此错误,但将样式分配给变量的解决方案在那里不起作用。为此,您需要从 html 页面触发脚本。
  • 随意添加更多链接的错误报告。我能做的不多了。 :)
【解决方案2】:

element.styleCSSStyleDeclaration 的一个实例,这意味着它是一个主机对象,而不是本机javascript 对象。

ECMAScript 规范规定宿主对象与本地对象不同,因此我不希望这被定义为“错误”(即使我永远无法复制它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-08
    • 2020-05-14
    相关资源
    最近更新 更多