确定元素是不是可选

Posted

技术标签:

【中文标题】确定元素是不是可选【英文标题】:Determine if element is selectable确定元素是否可选 【发布时间】:2018-08-03 00:18:51 【问题描述】:

选择元素的所有子子时,我有时会在Gecko / Waterfox中收到以下错误:

错误:NS_ERROR_FAILURE

这意味着(以一种非常无益的方式)该元素是(出于某种原因)可选择的。以下是此类代码的示例:

var e = document.getElementById('example');

if (e.childNodes.length > 0)

 window.getSelection().removeAllRanges();
 window.getSelection().selectAllChildren(e);

我如何确定一个元素是否可选? 显然,正如 javascript 所暗示的,我的测试中有子元素暗示该元素应该是可选的。绝对没有框架/库/等。

【问题讨论】:

var sel = window.getSelection(); if (sel.anchorNode) ... 是否有所作为 你有没有例子表明它失败了? @epascarello 这是一个蹩脚的 Gecko 错误,请参阅我在下面发布的答案。感谢您的询问! 【参考方案1】:

有便宜的,负担得起的和昂贵的。绝大多数时候,人们应该争取一个负担得起的答案。不幸的是,在这种情况下,便宜似乎是合适的。对setTimeout 使用 1 毫秒延迟似乎已经解决了这个问题。

var e = document.getElementById('example');

if (e.childNodes.length > 0)

 window.getSelection().removeAllRanges();
 setTimeout(function() window.getSelection().selectAllChildren(e);,1);

在提交 几十个 质量 错误报告后,这显然是一个关于内部计时机制的 Gecko 错误然而在 Mozilla 工作了十多年,但在我接管 Mozilla 之前,任何遇到此问题的人都只能再浪费几个字节。

类似的错误...

错误消息非常笼统,因此要确定错误是否与 JavaScript 引擎的内部计时机制有关(使用 JavaScript 的开发人员应该永远不必关心)它是关键 以确保每次鼠标移动、单击等都以相同的顺序重现。如果看起来完全相同的操作有时会失败而没有任何可预测性,而只是以非确定性方式发生,那么使用setTimeout 可能有助于缓解这些问题,尽管最终它是一个浏览器错误 应该修复。

【讨论】:

以上是关于确定元素是不是可选的主要内容,如果未能解决你的问题,请参考以下文章

list(列表)中的元素是否先进先出?

通过“Yair even or”将编号 ID 分配给可选网格的动态创建元素

reactjs中如何将可选元素作为prop传递给组件

确定元素是不是在另一个后面

确定两个整数列表是不是包含公共元素(c ++)

通过 XSD 限制基于另一个元素的 XML 元素