2

Underscore.jsテンプレートとInternetExplorerに問題があります。問題を引き起こしているテンプレートの一部は次のとおりです。

<p>
  <% if ( typeof description !== 'undefined' ) { %>
    <%- description %>
  <% } else { %>
    No description
  <% } %>
</p>

変数descriptionが未定義の場合(つまり、テンプレートに変数をまったく提供していない場合、変数は存在しません)、これはSafari、Firefox、Chromeで問題なく機能します。

ただし、InternetExplorerは正しく機能しません。No descriptionIE8とIE9のショーを表示する代わりに[object HTMLMetaElement]、IE7はを表示します[object]

typeof descriptionSafari、Firefox、Chromeで返品の結果を確認していますundefinedが、InternetExplorerがobject代わりに返品しているようです。

すでにUnderscore.jsの_.isUndefined(value)関数を試しましたが、変数が存在しない場合は機能しません。

誰かがこの問題の回避策を知っていますか?(変数に値を指定できないことに注意してください-存在するか、存在しないかのどちらかです)

更新Underscore.jsGithubの問題の1つで回避策を見つけましたhttps://github.com/documentcloud/underscore/issues/237#issuecomment-1781951

IEの動作が異なる理由と、回避策が実際に機能する理由を誰かが説明できますか?

アップデート2 @John-DavidDaltonは、以下のコメントで別のより良い回避策を提供しています(直接リンクしても機能しないようです)

4

2 に答える 2

5

細かいマニュアルから:

デフォルトでは、テンプレートwithはデータの値をステートメントを介してローカルスコープに配置します。

コンパイルされたテンプレートのsourceプロパティを使用して、何が起こっているかを確認できます。

​var t = _.template('<%= v %>');
console.log(t.source);​​​​​​​​​​​​​​​​​​​

あなたに与える(明確にするために微調整):

function(obj) {
    var __t, __p = '';
    with(obj || {}) {
      __p += '' + ((__t = ( v )) == null ? '' : __t) + '';
    }
    return __p;
}

これwithが問題の原因です。

JavaScriptは、非修飾名を含むスクリプトまたは関数の実行コンテキストに関連付けられたスコープチェーンを検索することにより、非修飾名を検索します。'with'ステートメントは、ステートメント本体の評価中に、指定されたオブジェクトをこのスコープチェーンの先頭に追加します。本文で使用されている非修飾名がスコープチェーンのプロパティと一致する場合、その名前はプロパティとプロパティを含むオブジェクトにバインドされます。それ以外の場合は、「ReferenceError」がスローされます。

だからこれを考えると:

with(obj) {
    console.log(pancakes)
}

JavaScriptは最初に検索し、にプロパティobj.pancakesがない場合は、グローバルスコープで検索します。どうやらIEにはページのタグの1つを表す値があります。テンプレート内で独自の名前空間を使用すると(回避策のように)、その機能が無効になり、グローバルプロパティにアクセスできなくなります。pancakesobjpancakeswindow.description<meta>withwindow

于 2012-12-07T17:35:35.577 に答える
0

あなたtypeof somethingと何かが の場合nullobjectが返されます。をチェックした後、null をチェックしてみてください'undefined'

于 2012-12-07T17:00:14.653 に答える