3

マークアップを動的に追加したいこのWindowStoreアプリがありますが、問題は次のように要約できます。

働く

$('.some-element').append('<input type="radio"><label>Test</label>');

動作しない

$('.some-element').append('<input type="radio" name="test"><label>Test</label>);

VisualStudioは次のように言っています。

JavaScriptランタイムエラー:動的コンテンツを追加できません。スクリプトが動的コンテンツ、または以前に動的に変更された要素を挿入しようとしましたが、これは安全ではない可能性があります。たとえば、innerHTMLプロパティを使用してスクリプトまたは不正な形式のHTMLを追加すると、この例外が生成されます。toStaticHTMLメソッドを使用して動的コンテンツをフィルタリングするか、createElementなどのメソッドを使用して要素と属性を明示的に作成します。

そして、jQueryのappend実装の行を指します。

append: function() {
        return this.domManip(arguments, true, function( elem ) {
            if ( this.nodeType === 1 || this.nodeType === 11 ) {
                this.appendChild( elem ); // Here!
            }
        });
    }

これを回避する方法があるかどうか誰かが知っていますか?(テンプレートエンジンとしてJsRenderを使用したいので、jQueryが必要です)。

4

2 に答える 2

2

ホスト強制セキュリティ機能にヒットしています。文字列から要素を作成する場合、Win8 HTML ホストはそれを好みません。この場合、具体的には、入力要素に name="" 属性を配置すると気に入りません。名前の代わりにIDを設定できますか?

安全と見なされるものの詳細については、http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspxを参照してください。

エラー メッセージには、実際にはエラーを回避するための 2 つのオプションが示されています。

  1. toStaticHTML メソッドを使用して動的コンテンツをフィルタリングする
  2. 要素と属性を明示的に作成する

toStaticHTML を使用すると、次のようになります。

    $('.some-element').append(toStaticHTML('<input type="radio" name="test"><label>Test</label>'));

しかし、その結果、作成された HTML は、渡した文字列とは異なって見える可能性があります。toStaticHTML は、安全でないと見なされる要素と属性を取り除きます。

2 番目のオプションは、問題の要素を作成するために jQuery ではなく DOM API を直接使用することです。あなたはすでにこれはダメだと言っています。

3 番目のオプションがありますが、ストアの確認プロセスを通過できない場合があります。

MSApp.execUnsafeLocalFunction(function() {
    $('.some-element').append('<input type="radio" name="test"><label>Test</label>');
});

これにより、安全でない HTML チェックが一時的に無効になります。セキュリティ分析を行っていない限り、これを行わないでください。特に、XHR から取得した文字列を使用して DOM を作成しないでください。これは、アプリとユーザーのマシン pwnd を取得するための招待状です。

于 2012-10-30T23:32:29.640 に答える