为什么toStaticHTML删除data- *属性

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

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

var html = "
  • My list node
"; $('#container').html(toStaticHTML(html));

生产:

 
  • My list node

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

toStaticHtml旨在在发展HTML / Web模式的情况下保持“安全”,因此它是白名单而不是黑名单

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

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

msExecUnsafeLocalFunction的示例用法:

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

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

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

如文档中所述,不允许使用data : http : //msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx