我的应用程序动态地将HTML内容构建为字符串,并在完成后将内容附加到DOM。但是在WinJS中,一旦我尝试将字符串附加到DOM,就会引发异常。为了解决这些异常,我必须通过toStaticHTML运行HTML来清理HTML,toStaticHTML在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>
最佳答案
这是因为出于安全考虑,需要在文档中插入HTML的随机位,并可能允许在 protected 上下文(您的应用程序,具有对WinRT的完全访问权限的应用程序和用户文档)中执行不安全的代码。toStaticHtml
旨在在不断发展的HTML / web模式下保持“安全”,因此它是白名单而不是黑名单。
考虑到您在这里遇到的挑战,我看到以下选项:
msExecUnsafeLocalFunction
中(请参见下文)。这意味着在该 call 的整个生命期内,所有Dom插入都可以。这不需要更改jquery,只需更改您的代码即可。 msExecUnsafeLocalFunction
进行调用的任何DOM调用WinJS.Binding.Template
呈现内容而不是Jquery。这将克隆节点,而不是对HTML setAttribute
设置属性。 msExecUnsafeLocalFunction的用法示例:
MSApp.execUnsafeLocalFunction(function() {
$('#container').html(html);
});
关于javascript - 为什么toStaticHTML删除data- *属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12234931/