3

我有这个 Window Store 应用程序,我想在其中动态添加一些标记,我的问题可以归结为:

在职的

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

不工作

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

Visual Studio 告诉我:

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!
            }
        });
    }

有谁知道是否有办法解决这个问题?(我需要 jQuery,因为我想使用 JsRender 作为我的模板引擎)。

4

2 回答 2

2

您正在使用主机强制安全功能。当您从字符串创建元素时,Win8 HTML 主机不喜欢它;在这种情况下,特别是当您将 name="" 属性放在输入元素上时,它不喜欢它。你可以设置id而不是名称吗?

有关被认为是安全的详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

错误消息实际上为您提供了两个选项来解决该错误:

  1. 使用 toStaticHTML 方法过滤动态内容
  2. 显式创建元素和属性

使用 toStaticHTML 看起来像这样:

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

但这将导致创建的 HTML 看起来可能与您传入的字符串不同;toStaticHTML 将删除被认为不安全的元素和属性。

第二种选择是直接使用 DOM API 而不是 jQuery 来创建有问题的元素,您已经说过这是不行的。

还有第三种选择,尽管它可能不会让您通过商店验证过程:

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

这将暂时禁用不安全的 html 检查。除非您进行了安全分析,否则不要这样做。特别是,不要使用从 XHR 获得的字符串并使用它来创建 DOM,这是获取应用程序和用户机器 pwnd 的邀请。

于 2012-10-30T23:32:29.640 回答
0

也许你可以使用

WinJS.Utilities.setInnerHTMLUnsafe(divName, '<input type="radio"><label>Test</label>');
于 2013-06-10T17:29:16.087 回答