2013-05-03 57 views
2

我们有一个Backbone/Marionette Web应用程序。该应用程序工作正常,在现代浏览器,但IE8死与下划线模板IE 8中的“意外标识符”失败

SCRIPT1010: Expected identifier 

调试器指向深处Underscore.js库,而不是我的代码行。显然,图书馆没有问题 - 我们的代码触发了这个问题。线路是这样的

var render = new Function(settings.variable || 'obj', '_', source); 

问题是什么?

回答

11

事实证明,这是我们模板中的一个特定情况,这意味着模板编译时,代码在现代浏览器中很好,但在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}}或重命名该属性解决了问题。

希望帮助这里有人:)

罗布

+1

同样的问题。我正在使用'默认'保留字 – 2013-07-01 12:07:58

+0

干杯!我挠了一下头,然后我看到了这一点,并改变了4个字符 - 整个网站再次运作!我们在模板中使用原始对象。新查找而不是对象['new']。 作为一个旁注,它说明了CommonJS模块确实全部被加载,不像AMD模块那样“根据需要异步加载”。尽管我看到了异议,但我们测试过的移动设备的性能似乎没有明显下降。但是,从任何页面捕获错误都会带来一定的无法预料的好处。 – trojjer 2013-09-25 12:01:02