确定元素是不是可选
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
可能有助于缓解这些问题,尽管最终它是一个浏览器错误 应该修复。
【讨论】:
以上是关于确定元素是不是可选的主要内容,如果未能解决你的问题,请参考以下文章