IE11 不存储<option>内部 HTML



从我正在进行的MSDN线程中复制pasta,但它并没有真正取得任何进展。。。

我有一个jQuery的级联下拉插件,它创建了子级中每个可筛选项的数组,当父级更改时,子级将被清除,然后重新添加每个匹配项。任何地方都没有任何问题。。。直到IE11,它不保存innerHTML。子级正确地进行了筛选,因为每个值都被保留,但文本没有,结果是:https://i.stack.imgur.com/0ALGc.png

类似地,您可能会注意到寻呼机显示有4个项目,但没有显示任何内容。这些数据是通过AJAX调用加载的,构建了一个HTML字符串,然后用jQuery.HTML()插入。我已经输入了调试代码来验证IE11是否正确构建了字符串,然而,实际上只有元素被注入到DOM中。这可以在这里看到:[1]

控制台中选择的行是在插入DOM之前通过console.log()行打印的构造HTML字符串。从我的椅子上看,IE11只是错误地实现了HTML控制功能。当使用HTML字符串或限定对象时,完全相同的行为是显而易见的。

这是一个破坏系统的问题。因此,我们的CRM在IE11中无法使用,而这是IE6甚至没有问题的功能。不出所料,Firefox和Chrome可以正常工作。

此后,我修改了插件,使其在操作时仅使用vanillaJS,但行为保持不变。下面[2]是一个屏幕截图,它表明IE11实际上是过滤正确的,并且在创建初始cascades对象时没有存储的innerHTML,因为SO不允许我发布所有需要的链接。

现场演示也包含在下面的评论中。

有人见过这个吗?有什么想法吗?

想明白了。在IE中,.innerHTML是一个引用调用;在其他所有浏览器中,它都返回一个平面值。

我遇到了timeshifter08描述的类似问题。我做了一个基本的场景,在这个场景中,这个意想不到的结果很容易被复制。

如前所述,IE11将清空/清除其innerHTML属性设置为"的元素的子节点。事先删除元素的子元素(ren)可以作为一种可能的解决方法,用于您可能仍然想要这样做的情况。

与IE11相比,这个fiddle在Chrome和Firefox中产生了不同的结果https://jsfiddle.net/gv2xqt6d/7/

<div id="div">
<span id="span">
Span
<p id="p">P</p>
</span>
</div>
------------------------
var div = document.querySelector('#div')
var span = document.querySelector('#span')
var p = document.querySelector('#p')  
// div.removeChild(span); // <- Workaround
div.innerHTML = '';
div.appendChild(span);
console.log(span.innerHTML); // Logs nothing in IE11 :(

如果您计划使用innerHTML=''删除子节点;然后使用appendChild插入-这在IE11中不起作用,因为IE11会清除变量中存储的任何子节点的innerHTML。

例如

<div id="parent">
<div id="child">
<div id="grandchild">
</div>
</div>
</div>
var child = document.getElementById('child');
var parent = document.getElementById('parent');
parent.innerHTML = ''; // this line will clear the innerHTML of child object
parent.appendChild(child); // will be broken

//在线阅读代码中的注释因此,请使用parent.textContent='';而是

对于IE11,如果您也想获得任何替换/appendChild的子级html内容,请使用textContent,而不是innerHTML

最新更新