Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么toStaticHTML会删除data-*属性_Javascript_Jquery_Html_Internet Explorer_Winjs - Fatal编程技术网

Javascript 为什么toStaticHTML会删除data-*属性

Javascript 为什么toStaticHTML会删除data-*属性,javascript,jquery,html,internet-explorer,winjs,Javascript,Jquery,Html,Internet Explorer,Winjs,我的应用程序将HTML内容动态构建为字符串,完成后内容将附加到DOM。然而,在WinJS中,一旦我尝试将字符串附加到DOM,就会抛出异常。为了解决这些异常,我必须通过toStaticHTML对HTML进行清理,toStaticHTML是WinJS和internetexplorer中全局定义的。我面临的问题是,大量使用数据-*html5属性。一旦我通过toStaticHTML,它们就被剥光了。为什么toStaticHTML会删除data-*属性?他们真正的安全顾虑是什么 请注意,我无法在MSApp

我的应用程序将HTML内容动态构建为字符串,完成后内容将附加到DOM。然而,在WinJS中,一旦我尝试将字符串附加到DOM,就会抛出异常。为了解决这些异常,我必须通过toStaticHTML对HTML进行清理,toStaticHTML是WinJS和internetexplorer中全局定义的。我面临的问题是,大量使用数据-*html5属性。一旦我通过toStaticHTML,它们就被剥光了。为什么toStaticHTML会删除data-*属性?他们真正的安全顾虑是什么

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

var html = "<ul><li data-role='list-node'>My list node</li></ul>";
$('#container').html(toStaticHTML(html));
var html=“
  • 我的列表节点”
”; $('#container').html(toStaticHTML(html));
产生:

<ul>
    <li>My list node</li>
</ul>
  • 我的列表节点

此处未列出
数据角色
-属性:


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

如文档
数据中所述,这是不允许的:

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

toStaticHtml
旨在在不断演变的HTML/web模式中保持“安全”,因此它是一个白名单而不是黑名单

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

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

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

$(“#容器”).html(html)
不起作用
html
无论如何都是一个字符串……我仍然不明白为什么所有数据的win-*属性都被允许,而其他数据的win-*属性则不被允许。其余的安全问题是什么?我想是标准信息:这里没有适用的标准。@提供了一个线索。@Konstantin Dinev:不允许“所有”数据win-*-属性,只允许列出。在这种情况下,我的问题可以改写为“当我尝试将html字符串附加到包含数据-*属性的DOM时,为什么WinJS中会出现异常,因为根据规范,它们不应该是安全问题?”:*-属性w3c规范在这里毫无意义。我相信我曾尝试在MSApp.execUnsafeLocalFunction中包装调用,但仍然遇到异常。我必须在周一确认这一点。如果JQuery工作被“推迟”,例如,在实际设置之前,执行被提交给浏览器,那么这可能解释了这一点。看看代码,这似乎没有发生。更新后添加了另一个选项。实际上jQuery应该使用它,在这种情况下是延迟的。事实上,在某些情况下,只有当我使用MS Promise时,我才会收到错误,如果我不使用MS Promise,那么我不会收到任何错误,而是收到警告。明天我会更新进一步的发现。我已经更新了上面的帖子。也许将所有实现更改为使用attr(setAttribute)就足够了,但是如果不这样做是可能的,因为我需要修改的代码的大小,那就更好了。您的编辑没有调用内部的函数。调用JSQuery函数,并将结果传递给msExecUnsafeLocalFunction。让我添加一个示例。如果引用数据属性,我可以确认允许动态插入这些属性,而无需采取额外措施。