style.display='none' 不适用于 chrome 中的选项标签,但它适用于 Firefox

IT技术 javascript firefox coding-style google-chrome
2021-02-05 20:28:05

好的,这是一些演示问题的示例代码。如果我单击 Firefox 中的按钮,第一个选项就会消失。如果我单击 chrome 中的按钮,没有任何react,或者更确切地说,如果我检查第一个选项,它确实具有属性“style='display:none'”,但 html 页面上的选项本身并未隐藏。

<form>
<select>
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<input type="button" onclick="document.getElementsByTagName('option')[0].style.display='none'" value="hide option 1">
</form>

为什么这在 chrome 中不起作用?

6个回答

解决方法是删除option元素以响应您的事件,并在需要时将它们添加回来。IIRC,IE 将不允许您元素设置displayto 我建议将删除的元素存储在一个数组中,以便您可以轻松地将它们添加回来。noneoption

有趣的是,Chrome Canary(至少 40.0.2179.0)在选项上尊重 display:none。我认为 Firefox 也是如此。
2021-03-12 20:28:05
@JonathanSampson,当删除是暂时的时,您应该这样做。删除display:none比重新附加整个列表要快得多。
2021-03-30 20:28:05
Chrome 现在在发布版本中支持 display:none。有趣的是,当设置为不显示时 <option> 不会隐藏。我个人认为它不应该遵循与 dom 中的每个其他元素不同的规则,即使它是浏览器表单元素。
2021-04-04 20:28:05
@GEverding Firefox 最初不会显示该元素,但您仍然可以使用键盘选择隐藏的元素(此时它们将被显示)。你可以在这里测试:jsfiddle.net/gefz928j底线是你不应该display:none用来从列表中删除选项。
2021-04-10 20:28:05

您可能必须删除<option>而不是“隐藏”它。如果这不是您的解决方案,请尝试禁用它。

document.getElementsByTagName('option')[0].disabled='disabled'

PS:您可能需要重新考虑使用getElementsByTagName('option'), 如果您有更多<select>元素,可能会变得混乱

只是使用该命令作为一个简单的例子来演示问题
2021-03-24 20:28:05
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script>
removeIt = function()
{
    var theSelect = document.getElementById("theSelect");
    var theOption = document.getElementById("theOption");
    theSelect.removeChild(theOption);
};
</script>
</head>
<body>
<select id="theSelect">
<option>1</option>
<option id="theOption">2</option>
<option>3</option>
</select>
<input type="button" onclick="removeIt()" value="remove it!"/>
</body>
</html>

我通过简单地将它从它的 parentNode 中删除它很快就让它工作了......显然这将是一个黑客。
我会尽力为您找到更好的解决方案 =)

顺便说一句,欢迎来到 Stack Overflow

更新:可悲的是,我想不出更好的方法。也许,当您第一次执行 removeChild() 选项时,您可以将 childNodes 复制到另一个数组,这样您就可以保持秩序。然后,当您重新追加时,您必须删除所有内容并重新追加所有内容。效率低下,但我想不出更好的方法>_>
2021-03-13 20:28:05
它不是删除它。它只是将其从父节点中删除。您可以稍后调用 theSelect.appendChild(theOption); ..虽然这可能会搞砸顺序 [在我的例子中它会变成 1, 3, 2] 仍然试图想出一个解决方案。
2021-03-16 20:28:05

问题是为什么这在任何浏览器中都有效?

这些选项不用作页面中的元素,它们包含要在选择元素中显示的信息。某些浏览器允许您将某些样式应用于选项,但通常您根本无法真正期望跨浏览器支持任何样式。

如果您想不显示某个选项,只需将其从选择中删除即可。

为什么投反对票?如果你不说你不喜欢什么,它不能改善答案。
2021-03-20 20:28:05
@Denis Otkidach:是的,在 HTML 中,但这不再是 HTML,而是 DOM 中的对象。您必须用新的 HTML 替换整个 select 元素才能再次解析它。
2021-03-20 20:28:05
根据 HTML 规范显示属性适用于所有元素,包括 option 和 optgroup。
2021-03-26 20:28:05

要从选择表单中删除一个选项,可以使用 jQuery 的 $().eq().remove() 或 $().remove()。

类似的是我从表中删除了一个表行:

$('form table tr').eq(1).remove();

在哪里:

$('form table tr')

说删除的元素将是表格(表格表格)中表格中的表格行(tr)。

eq(1)

说删除的将是第二个元素(索引号为 1 的元素)

remove()

说该元素将被删除。

但是当这应该用于选项时,那么所有需要的是(例如):

$('select option[value="1"]').remove();

因为按值查找选项比按索引号查找选项更简单(除非您有更多具有相同值的 ioption - 但拥有这样的选项是无稽之谈)。如果您没有其他可用于查找已删除元素的索引号,则使用索引号是很好的。

当然,您也可以在元素标识中添加表单名称或表单名称并选择名称(或 ID 或类)

$('form[name="date"] selection[name="day"] option[value="1"]').remove();
$('form#date selection#day option[value="1"]').remove();

但是第一个选项更好 - 并且更合乎逻辑,因为服务器端进程,您需要使用属性名称而不是idclass

$('select option[value="1"]').remove(); 工作中
2021-04-02 20:28:05