为什么toStaticHTML删除data- *属性

时间:2012-09-02 09:47:28

标签: javascript jquery html5 internet-explorer winjs

我的应用程序动态地将HTML内容构建为字符串,完成后将内容附加到DOM。但是在WinJS中,一旦我尝试将字符串附加到DOM,就会抛出异常。为了解决这些异常,我必须通过运行toStaticHTML来清理HTML,这是在WinJS和Internet Explorer中全局定义的。我遇到的问题是data- * html5属性的使用非常多。一旦我通过toStaticHTML运行它们就会被剥离。为什么toStaticHTML删除data- *属性?与他们真正的安全问题是什么?

请注意,我无法将DOM插入包装在MSApp.execUnsafeLocalFunction中,因为我使用的是jQuery而且我不允许修改jQuery代码。

var html = "<ul><li data-role='list-node'>My list node</li></ul>";
$('#container').html(toStaticHTML(html));

产地:

<ul>
    <li>My list node</li>
</ul>

3 个答案:

答案 0 :(得分:7)

这是因为安全性担心将HTML的随机位插入到文档中,并且可能允许不安全的代码在受保护的上下文(您的应用程序,可以完全访问WinRT和用户文档)中执行。

在发展HTML /网络模式的情况下,

toStaticHtml旨在保持“安全”,因此它是白名单而不是黑名单

鉴于您在这里遇到的挑战,我看到以下选项:

  • 将调用包装到msExecUnsafeLocalFunction中的jquery(见下文)。这意味着对于该呼叫的生命,所有Dom插入都将没有问题。这不需要更改jquery,只需要更改代码。
  • 完全重写Jquery在封面下使用的任何DOM调用以使用msExecUnsafeLocalFunction
  • 进行调用
  • 将应用程序的安全上下文更改为Web上下文而不是本地上下文。这当然会让您无法直接访问WinRT。你必须通过其他机制(I帧或类似的消息传递)来操作
  • 使用WinJS.Binding.Template呈现内容而不是Jquery。这会克隆节点而不是字符串化HTML
  • 编写自己的节点克隆
  • 在插入安全节点后,使用setAttribute设置属性。

msExecUnsafeLocalFunction的示例用法:

MSApp.execUnsafeLocalFunction(function() {
    $('#container').html(html);
});

答案 1 :(得分:3)

此处未列出data-role - 属性:http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

这是一个未知属性,将被删除。

答案 2 :(得分:0)