“MutationObserver”上的“观察”:参数 1 不是“Node”类型

2024-03-01

我正在创建一个 Chrome 扩展程序,并尝试在 gMail 撰写框的“发送”按钮旁边包含一个小文本。

我正在使用 MutationObserver 来了解撰写框窗口何时出现。我通过观察带有类的元素来做到这一点no因为撰写框元素是作为该元素的子元素创建的(类no).

当用户单击撰写按钮并出现撰写框窗口时,我使用以下命令在“发送”按钮旁边放置一个元素.after()方法。 SEND 按钮类名称为.gU.Up.

这些是 gMail 的真实类名,也很奇怪。

下面是我正在使用的代码:

var composeObserver = new MutationObserver(function(mutations){ 
    mutations.forEach(function(mutation){
        mutation.addedNodes.forEach(function(node){
            $(".gU.Up").after("<td> <div> Hi </div> </td>");
        });
    });
});

var composeBox = document.querySelectorAll(".no")[2];
var config = {childList: true};
composeObserver.observe(composeBox,config);

问题是我不断收到以下错误:

Uncaught TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'

有人可以帮忙吗?我已经尝试了很多事情,也在这里查看了其他答案,但仍然无法摆脱这个错误。

这是我的清单.json file:

{
    "manifest_version": 2,
    "name": "Gmail Extension",
    "version": "1.0",

    "browser_action": {
        "default_icon": "icon19.png",   
        "default_title": "Sales Analytics Sellulose"    
    },

    "background": {
        "scripts": ["eventPage.js"],
        "persistent": false
    },

    "content_scripts": [
    {
        "matches": ["https://mail.google.com/*"],
        "js": ["jquery-3.1.1.js", "insQ.min.js", "gmail_cs.js"]
    }
],

    "web_accessible_resources":[
        "compose_icon.png",
        "sellulosebar_icon.png" 
    ]
}

附:我已经尝试过 insertquery 库,但它有一些缺点。它不允许我具体说明特定元素的变化。我还没有尝试mutationsummary库,但由于它使用MutationObserver,我认为问题将持续存在。

从评论中添加:
确实,选择器没有给我一个节点。我检查了控制台,它给出了一个对象。我还检查了控制台,它正在选择我想要观察的适当元素。

但是,当我添加console.log对于所选元素,它显示为未定义。这意味着,您关于在节点存在之前执行代码的说法可能是正确的。你能告诉我如何确保延迟发生吗? “setTimeout”会起作用吗? MutationObserver 的情况下它是如何工作的?


正如我在评论中提到的,Xan 给出了答案,该错误清楚地表明document.querySelectorAll(".no")[2]不评估为Node https://developer.mozilla.org/en-US/docs/Web/API/Node.

从您在评论中提供的信息来看,问题很明显是您的代码执行时您想要观察的节点不存在。有很多方法可以延迟代码的执行,直到该节点可用。一些可能性是:

  1. 使用 setTimeout 循环进行轮询,直到检测到要放置的元素变异观察者 https://developer.mozilla.org/en-US/docs/Web/API/MutationObserver可用:

    function addObserverIfDesiredNodeAvailable() {
        var composeBox = document.querySelectorAll(".no")[2];
        if(!composeBox) {
            //The node we need does not exist yet.
            //Wait 500ms and try again
            window.setTimeout(addObserverIfDesiredNodeAvailable,500);
            return;
        }
        var config = {childList: true};
        composeObserver.observe(composeBox,config);
    }
    addObserverIfDesiredNodeAvailable();
    

    当节点存在于 DOM 中后,这将很快找到合适的节点。此方法的可行性取决于插入目标节点后多长时间需要将观察者放置在其上。显然,您可以根据需要调整轮询尝试之间的延迟。

  2. 创建另一个 MutationObserver 来监视 DOM 中较高的祖先节点,以插入要在其上放置主要观察者的节点。虽然这会在插入时立即找到合适的节点,但它可能会占用大量资源 (CPU),具体取决于您必须观察的 DOM 的高度以及 DOM 更改的活动量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“MutationObserver”上的“观察”:参数 1 不是“Node”类型 的相关文章

随机推荐

  • iPhone 上 Objective C 中的静态字符串变量

    如何在 iPhone 中创建和访问静态字符串 目标 c 我声明static NSString str OldValue 在A类 如果我在 B 类中为此分配一些值str NewValue 该值对于 B 类中的所有方法都有效 但是 如果我在 C
  • Java线程中的定时器

    我有一个线程负责执行一些过程 我想让这些处理每 3 秒完成一次 我使用了下面的代码 但是当线程启动时 什么也没有发生 我假设当我为计时器定义任务时它会自动执行ScheduledTask在时间间隔内但它根本不做任何事情 我缺少什么 class
  • Swift 中的快速排序出现错误

    我正在 Swift 中使用高阶函数编写快速排序 但它给出了 error Int is not convertible to Int return quickSort array lesser pivot quickSort array gr
  • 使用 WEBrick 为 PHP Web 应用程序提供服务

    我是一名 PHP 开发人员 已经开始学习 Ruby on Rails 我喜欢启动和运行 Rails 应用程序开发是多么容易 我最喜欢的东西之一是 WEBrick 它使您不必为您正在处理的每个小项目配置 Apache 和虚拟主机 WEBric
  • BitBucket WebHook 詹金斯

    我想配置 bitbucket 来触发 jenkins 构建 我花了一些时间研究这个问题 所有答案都来自几年前 但没有找到任何指南 因为从那以后事情似乎发生了变化 我正在尝试做的事情 将位桶推送到特定分支会触发构建 我有什么 Bitbucke
  • 在 IE 中通过 Iframe 传递参数时出现问题

    我正在尝试从我的网站执行 HTTP GET 到通过 iframe 引入的另一个网站 在 Firefox 上 您可以在源代码中看到 iframe src 中存在正确的 url 及其正确的参数 并且它可以工作 在 IE 上 您可以在源代码中看到
  • 函数参数中没有 LHS 的“双右箭头类型”是什么意思

    我无法解释指定为没有 LHS 左侧 的函数参数的 双右箭头类型 例如 gt Int来自 to Int但什么只是 gt Int意思是 例如请参阅第一个参数foo下面的方法 是什么类型f Is it Int gt Int gt Int 对于定义
  • 何时在 Java 中使用 StringBuilder [重复]

    这个问题在这里已经有答案了 一般认为最好使用StringBuilder用于Java中的字符串连接 情况总是如此吗 我的意思是 创建一个StringBuilder对象 调用append 方法和最后toString 已经较小然后将现有字符串与
  • 我无法再使用 npm 安装

    Npm 工作得很好 然后今天我尝试使用以下命令安装 ngui tab npm install ngui tab save 它给了我以下错误 0 info it worked if it ends with ok 1 verbose cli
  • 错误:点太少,无法用 3 个点计算椭圆? -R

    日安 我正在策划一个pca与factoextra包裹 我对每个因素有 3 分 并且想在每个因素周围画上椭圆 但我收到错误Too few points to calculate an ellipse 可以在 3 个点周围绘制椭圆ggplot2
  • 可以在结构声明*之后派生属性吗?

    我正在使用宏来扩展原始结构 pub struct MyTypedNumber pub u32 struct impl my features MyTypedNumber The struct impl my features宏可以实现以下功
  • 使用 Javascript/jQuery 更改 Telerik RadEditor 的值

    我正在尝试使用 Javascript 手动清理 Telerik RadEditor 的 HTML 但我似乎找不到存储该值的正确位置 以便在回发时保存该值 这是我的JS function jQuery fixHash function htm
  • 如何覆盖功能组件中的导航选项?

    要使用类组件覆盖导航选项 它会是这样的 export default class SomeClass extends Component static navigationOptions navigation gt return title
  • Dart JS Interop 0.6.0 和 JS Promises - 解决

    Interop 或 dart2JS 似乎没有明确拦截 JS Promises ServiceWorkerContainer swContain window navigator serworker swContain register wo
  • Wordpress 开发插件时出错 - “您没有足够的权限访问此页面。”

    我刚刚开始学习 WordPress 插件开发 当我从管理员访问我的插件菜单时出现此错误 这是代码 importer php Admin function function oscimp admin include importer admi
  • 如何检查 GTK+3.0 中小部件的类型?

    I saw this https stackoverflow com questions 60112777 find type of gtk widgets帖子 但它是针对 Python 的 所以这对我没有太大帮助 我正在使用 C 进行编程
  • 如何避免 gen_l10n/app_localizations.dart 的 lint 问题“依赖于引用的包”[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在我的 Flutter 应用程序上 我遇到了 lint 规则的问题 依赖于引用的包 https dart lang gi
  • Intel TBB 可以在 AMD 处理器上运行吗? [复制]

    这个问题在这里已经有答案了 可能的重复 AMD多核编程 https stackoverflow com questions 1623975 amd multi core programming Is 英特尔TBB http threadin
  • C#:从锁定块调用事件

    我通常听说在调用事件侦听器之前解锁所有锁以避免死锁是一个好主意 然而 自从lock 块可以由 C 中的同一线程重入 是否可以从锁定块调用事件 或者我是否需要复制相关状态数据并在锁定块外部调用事件 如果没有 请举例说明何时从某个对象内调用事件
  • “MutationObserver”上的“观察”:参数 1 不是“Node”类型

    我正在创建一个 Chrome 扩展程序 并尝试在 gMail 撰写框的 发送 按钮旁边包含一个小文本 我正在使用 MutationObserver 来了解撰写框窗口何时出现 我通过观察带有类的元素来做到这一点no因为撰写框元素是作为该元素的