我的应用程序动态地将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模式下保持“安全”,因此它是白名单而不是黑名单。

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

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

  • msExecUnsafeLocalFunction的用法示例:
    MSApp.execUnsafeLocalFunction(function() {
        $('#container').html(html);
    });
    

    关于javascript - 为什么toStaticHTML删除data- *属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12234931/

    10-08 21:47