我们有一个 Backbone / Marionette Web 应用程序。该应用程序在现代浏览器中运行良好,但在 IE8 中死亡
SCRIPT1010: Expected identifier
调试器指向 Underscore.js 库中的一行,而不是我的代码中的一行。显然库中没有问题——我们的代码触发了这个问题。线是这个
var render = new Function(settings.variable || 'obj', '_', source);
问题可能是什么?
我们有一个 Backbone / Marionette Web 应用程序。该应用程序在现代浏览器中运行良好,但在 IE8 中死亡
SCRIPT1010: Expected identifier
调试器指向 Underscore.js 库中的一行,而不是我的代码中的一行。显然库中没有问题——我们的代码触发了这个问题。线是这个
var render = new Function(settings.variable || 'obj', '_', source);
问题可能是什么?
事实证明,这是我们的一个模板中的一个特定情况,这意味着当模板被编译时,代码在现代浏览器中很好,但在 IE8 中却出现了不稳定。
我们使用 serializeData 函数从我们的视图中传递一些有用的字符串数据,就像这样(coffeescript,但你明白了):
...
serializeData: ->
data = super()
data.messages = {
intro: "Welcome to the app"
continue: "Click here to continue"
}
return data
...
然后像这样在模板中引用它
<h1>{{ messages.intro }}</h1>
<a href="...">{{ messages.continue }}</h1>
问题来自“继续”是保留字这一事实。Coffeescript 很好,它允许您将其用作对象定义中的键而无需引用,并且看起来在更现代的浏览器中的常规 JS 中,他们可以不加引号地使用它(尽管通常会建议这样做)。
然而,在 IE8 中,您可能不会像 obj = { continue: "foo" } 那样设置它,并且您可能不会像 obj.continue 那样得到它,它必须是 obj["continue"]。
将 {{ messages.continue }} 替换为 {{ messages["continue"] }} 或重命名属性可解决问题。
希望对某人有所帮助:)
抢