.append()、选择列表和 Chrome 81 的问题

Dan*_*iel 6 jquery google-chrome

从 Chrome 81 版本开始,从选择列表中提取选项并重新添加它们.append()似乎无法按预期工作。此行为在 Chrome 80 中有效,并且在其他浏览器中继续有效。我做错了什么,还是 Chrome 中的错误?

示例代码步骤

  • 获取选择列表
  • 从中获取选项(在生产代码中我正在操作它们,但在本例中不是)
  • 从列表中删除选项
  • 将选项重新添加到列表中

预期行为

列表有选项

实际行为

没有显示选项,尽管 DOM 检查器显示它们存在

片段

function test() {
   var selectItem = $("#selectOne");
   var items = selectItem.find('option');
   selectItem.empty();
   selectItem.append(items);  
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<select id="selectOne" multiple>
  <option>A</option>
  <option>B</option>
  <option>C</option>
  <option>D</option>
  <option>E</option>
</select>

<br/>

<button onclick="test()">Go</button>
Run Code Online (Sandbox Code Playgroud)

将以下行添加到我的 javascript 末尾确实“修复”了问题:

selectItem.get(0).innerHTML = selectItem.get(0).innerHTML;
Run Code Online (Sandbox Code Playgroud)

然而,这显然不是一个实际的修复。我只将它包含在这里,以防它有助于比我更了解这一点的人查明问题。

编辑 4 月 21 日:https : //bugs.chromium.org/p/chromium/issues/detail? id =1073172(感谢打开这个的人!)

Jua*_*llo 3

克隆你的option,这样做会再次呈现选项,

这是您唯一需要更改的行

var items = selectItem.find('option');
Run Code Online (Sandbox Code Playgroud)

对此

var items = selectItem.find('option').clone();
Run Code Online (Sandbox Code Playgroud)

var items = selectItem.find('option');
Run Code Online (Sandbox Code Playgroud)
var items = selectItem.find('option').clone();
Run Code Online (Sandbox Code Playgroud)

  • 确实如此,但它只是作为 https://bugs.chromium.org/p/chromium/issues/detail?id=1072475 的副本而关闭。绝对是一种回归。 (3认同)
  • 同意 @trebla 的观点,这似乎确实有效,尽管我同样担心 Chrome 中的回归。对于具有数千个元素的选择列表来说,这也不是理想的(性能、内存),但公平地说,这些列表一开始就不是特别理想。谢谢指点! (2认同)