3

バックボーン/マリオネット Web アプリケーションがあります。アプリケーションは最新のブラウザーでは正常に動作しますが、IE8 では停止します。

SCRIPT1010: Expected identifier

デバッガーは、コードではなく Underscore.js ライブラリの深い行を指しています。明らかに、ライブラリに問題はありません。コードがこの問題を引き起こしています。ラインはこれ

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

問題は何でしょうか?

4

1 に答える 1

12

これはテンプレートの 1 つの特定のケースであることが判明しました。つまり、テンプレートがコンパイルされたとき、コードは最新のブラウザーでは問題なく動作しましたが、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>

問題は、「continue」が予約語であることにあります。Coffeescript は優れており、引用符なしでオブジェクト定義のキーとして使用できます。最近のブラウザーの通常の JS では、引用符なしで使用しても問題ないように見えます (ただし、一般的にはそうすることをお勧めします)。

ただし、IE8 では obj = { continue: "foo" } のように設定できず、obj.continue のように取得できない場合があります。それは obj["continue"] でなければなりません。

{{ messages.continue }} を {{ messages["continue"] }} に置き換えるか、プロパティの名前を変更すると、問題が修正されました。

誰かを助けることを願っています:)

ロブ

于 2013-05-03T14:40:39.103 に答える