【问题标题】:How to check if HTML element is contenteditable from within Chrome Extension如何从 Chrome 扩展程序中检查 HTML 元素是否可编辑
【发布时间】:2014-09-10 07:33:59
【问题描述】:

我正在编写一个 Chrome 扩展程序,它需要在我的 上下文脚本 被注入的页面上检测contenteditable HTML 元素(或用户可以输入的元素)。 p>

我目前正在这样做:

var objAll = document.getElementsByTagName("*");
for(var i = 0; i < objAll.length; i++)
{
    obj = objAll[i];

    if(obj.contentEditable &&
        obj.contentEditable != 'inherit' &&
        obj.contentEditable != 'false')
    {
        //Yes, this is a content editable element!
    }
}

但我的方法似乎不适用于我测试过的所有网站。

我很好奇,我错过了什么?

PS。因为它是一个内容脚本,所以我没有使用 jQuery 来使其更健壮。

【问题讨论】:

  • 您是否尝试过使用类似document.querySelectorAll('[contenteditable]') 的方式一次选择所有您想要的元素?

标签: javascript html css google-chrome-extension contenteditable


【解决方案1】:

contentEditablecontenteditable 属性所隐含的属性。您真正需要检查的是 isContentEditable 属性,它是一个布尔值,用于判断元素是否具有可编辑的内容:

if (obj.isContentEditable) {
    // do stuff
}

但不是获取所有元素并过滤它们,只需选择所有 contenteditable 元素:

var contEditables = document.querySelectorAll('[contenteditable]');
for (var i = 0; i < contEditables.length; i++) {
    // do stuff
}

事实上,一个元素具有可编辑内容当且仅当它具有contenteditable 属性,无论是否为空字符串。

Live demo

【讨论】:

  • 谢谢。你知道,出于某种原因document.querySelectorAll('[contenteditable]') 不这样做。只有当我做if (obj.isContentEditable) 而不是我所拥有的并保留document.getElementsByTagName("*") 时,它才适用于我的特定测试页面。知道为什么吗?
  • @c00000fd 实际上,没有。该查询应该和does work,虽然我没有在扩展中测试它,但我不明白为什么它应该表现不同。
  • 感谢演示。我知道。但我在一个实时页面(来自 Chrome 扩展程序)中使用一个更复杂的示例对其进行测试,而我上面所说的 确实 有所作为。如果有人能解释原因,我将不胜感激?
  • 为什么?也许元素是动态创建的?你什么时候运行该代码?
  • @c00000fd 啊,小心,那是不同的东西!这是可编辑的整个文档(在&lt;iframe&gt; 中)。这不依赖于 contenteditable 属性,而是依赖于在 document 上设置为 "on"designMode property,而不是单个元素.这就是选择器失败的原因。
猜你喜欢
  • 2012-12-13
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2011-09-11
  • 2012-12-18
相关资源
最近更新 更多