Chrome突然停止接受insertRule()

时间:2013-11-15 18:22:37

标签: javascript css html5 css3 google-chrome

我的HTML5游戏已经运行了数周。

突然,大约一个小时前,它将不再在Chrome中运行。我将问题缩小到仅在Chrome中出现的JavaScript错误。

我已在此处隔离了所述代码:http://jsfiddle.net/quM3L/

......错误发生在第4行:

var style = document.documentElement.appendChild(document.createElement("style"));
var rule =  "score_10_typing {from {width: 0} to {width: 11em}}";
if (CSSRule.KEYFRAMES_RULE) { // W3C
    style.sheet.insertRule("@keyframes " + rule, 0);
}
else if (CSSRule.WEBKIT_KEYFRAMES_RULE) { // WebKit
    style.sheet.insertRule("@-webkit-keyframes " + rule, 0);
}
else if (CSSRule.MOZ_KEYFRAMES_RULE) { // Mozilla
    style.sheet.insertRule("@-moz-keyframes " + rule, 0);
}

...在Firefox,Internet Explorer,Safari等中运行得很好。

直到一小时前它在Chrome中运行良好。 (在多台计算机上测试过。)

有没有人知道如何解决这个问题?我想,Chrome今天必须更新他们的JS引擎,不支持CSSStyleSHeet.insertRule()

提前感谢您的帮助。

The original game is located here.正如您所看到的,它可以在Chrome以外的所有浏览器中正常运行。)

2 个答案:

答案 0 :(得分:5)

所以,显然,Chrome正在落入第一个if语句(W3C)而不是第三个(Webkit)。因此,他们必须立即更新他们的引擎以同时拥有CSSRule.KEYFRAMES_RULE CSSRule.WEBKIT_KEYFRAMES_RULE(感谢Ithcy)。多么痛苦。

重新排序if语句,代码运行良好(fiddle)

var style = document.documentElement.appendChild(document.createElement("style"));
var rule =  "score_10_typing {from {width: 0} to {width: 11em}}";
if (CSSRule.WEBKIT_KEYFRAMES_RULE) { // WebKit
    style.sheet.insertRule("@-webkit-keyframes " + rule, 0);
}
else if (CSSRule.MOZ_KEYFRAMES_RULE) { // Mozilla
    style.sheet.insertRule("@-moz-keyframes " + rule, 0);
}
else if (CSSRule.KEYFRAMES_RULE) { // W3C
    style.sheet.insertRule("@keyframes " + rule, 0);
}

这不太好,因为Chrome不接受@keyframes,但它接受@-webkit-keyframes。那么为什么他们将引擎改为包括CSSRule.KEYFRAMES_RULE也超出了我的范围。

答案 1 :(得分:0)

CSSStyleSHeet.insertRule()仍受支持,因为您会看到是否尝试插入像"body { color: blue; }"这样的简单内容。这是@keyframes的事情。请改为@-webkit-keyframes