2

ページの読み込み時に Backbone.js コレクションを初期化するために、バックエンド テンプレートにブートストラップする一連の JavaScript オブジェクトがあります。これは次のようになります (Twig テンプレートとして):

<script type="text/javascript">
(function() {
    var jobCollection = new App.Collections.Item(
        {% for item in items %}
        {
            name: '{{ item.name }}',
            ...
        },
        {% endfor %}
    );
})();
</script>

私が抱えている問題は、一部のテキスト フィールドに JavaScript を壊す \u200b (ゼロ幅スペース) が含まれていることです。

これらの文字をエスケープする最良の方法は何ですか? バックエンドでそれらをエスケープする必要がありますか (初期テンプレートをレンダリングするために Twig で Symfony 2 を使用しています)、それともクライアントで JavaScript を使用してエスケープする必要がありますか? JavaScript や PHP で幅ゼロのスペース文字などをエスケープするにはどうすればよいですか?

4

1 に答える 1

2

文字が文字列内にのみ表示され、エスケープ\u200bまたはリテラルとして表示される場合は、問題ありません。それらは識別子としてのみ違法です。obj["aaa\u200b"] = "foo"また、添字表記 ( )を使用すれば、識別子としてもオブジェクト プロパティ名として使用できます。少なくともChromeでは、それがどれほど安全/互換性があるかわかりません。

動作するように見えるいくつかの例を見てください。

var escaped = "aaa \u200b bbb";
var unescaped = "bbb ​ ccc";

console.log(escaped.charCodeAt(4));
console.log(unescaped.charCodeAt(4));

var obj = {};
obj[escaped] = "foo";
obj[unescaped] = "bar";
console.log(obj[escaped]);
console.log(obj[unescaped]);
console.log(obj["aaa \u200b bbb"]);
console.log(obj["bbb ​ ccc"]);

http://codepen.io/anon/pen/JqjEK

少し前に Q/AI が書いたこの Q/AI にも興味があるかもしれません。

于 2013-01-29T14:30:17.270 に答える