Chrome DevTools 协议:如何获取节点的单击事件处理程序名称

2024-01-09

Problem

我有一个相同节点的列表,这些节点附加了相同的处理程序或函数。

我需要单击 DOM 中存在的每个交互式节点(这是功能或要求)。

如果已经单击了要单击的节点或者该节点附加了相同的处理程序,我想跳过要单击的节点。

请参阅下面的屏幕截图以供参考。其中事件侦听器有一个带有附加处理程序名称的单击事件。我们可以获得点击处理程序或函数的名称吗?

我在用DOMDebugger.getEventListeners({ objectId: remoteObjectId })但它不会返回handler and originalHandler不为什么。


有提到一个怪癖here https://github.com/puppeteer/puppeteer/issues/3349#issuecomment-548428762: 你需要objectGroup设置以获取处理程序。以下是一些获取名称的方法:

const html = `
  <!doctype html>
  <html>
    <head>
      <meta charset='UTF-8'>
      <title>Test</title>
      <script>
        function main() {
          document.body.addEventListener('click', logClick);
        }

        function logClick() {
          console.log('click');
        }
      </script>
    </head>
    <body onload='main();'>Text.</body>
  </html>`;

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto(`data:text/html,${html}`);

    const cdp = await page.target().createCDPSession();

    const nodeObject = (await cdp.send('Runtime.evaluate', {
      expression: "document.querySelector('body')",
      objectGroup: 'foobar',
    })).result;

    const listenerObject = (await cdp.send('DOMDebugger.getEventListeners', {
      objectId: nodeObject.objectId,
    })).listeners[0].handler;

    const listenerName1 = (await cdp.send('Runtime.callFunctionOn', {
      functionDeclaration: 'function() { return this.name; }',
      objectId: listenerObject.objectId,
      returnByValue: true,
    })).result.value;

    const listenerName2 = (await cdp.send('Runtime.getProperties', {
      objectId: listenerObject.objectId,
      ownProperties: true,
    })).result.find(property => property.name === 'name').value.value;

    await cdp.send('Runtime.releaseObject', { objectId: listenerObject.objectId });
    await cdp.send('Runtime.releaseObject', { objectId: nodeObject.objectId });
    await cdp.send('Runtime.releaseObjectGroup', { objectGroup: 'foobar' });

    console.log(listenerName1);
    console.log(listenerName2);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

Output:

logClick
logClick

UPD匿名处理程序:

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('https://jqueryui.com/resources/demos/datepicker/inline.html');

    const cdp = await page.target().createCDPSession();

    const nodeObject = (await cdp.send('Runtime.evaluate', {
      expression: "document.querySelector('a.ui-datepicker-next')",
      objectGroup: 'foobar',
    })).result;

    const listenerObject = (await cdp.send('DOMDebugger.getEventListeners', {
      objectId: nodeObject.objectId,
    })).listeners[0].handler;

    console.log(listenerObject);

    await cdp.send('Runtime.releaseObject', { objectId: listenerObject.objectId });
    await cdp.send('Runtime.releaseObject', { objectId: nodeObject.objectId });
    await cdp.send('Runtime.releaseObjectGroup', { objectGroup: 'foobar' });

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

output:

{
  type: 'function',
  className: 'Function',
  description: 'function( e ) {\n' +
    '\n' +
    '\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n' +
    '\t\t\t\t// when an event is called after a page has unloaded\n' +
    '\t\t\t\treturn typeof jQuery !== "undefined" &&\n' +
    '\t\t\t\t\t( !e || jQuery.event.triggered !== e.type ) ?\n' +
    '\t\t\t\t\tjQuery.event.dispatch.apply( eventHandle.elem, arguments ) :\n' +
    '\t\t\t\t\tundefined;\n' +
    '\t\t\t}',
  objectId: '{"injectedScriptId":3,"id":2}'
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Chrome DevTools 协议:如何获取节点的单击事件处理程序名称 的相关文章

  • 单击时获取元素的 id(php、jquery、ajax、javascript)

    抱歉 这是我的第一个项目 我学到了很多东西 因此 如果有人可以帮助我 我将不胜感激 我的项目中有这个侧边栏 其中包含 rss 链接 我必须使用 ajax 因此每次用户单击任何 rss 链接时 提要都会出现在屏幕上 这是我的侧边栏代码 div
  • 使用 jquery 淡入/淡出

    我正在研究我的学生项目 我是新的 jquery 对于该项目 我必须使用 jquery 来增强一些功能 并且我已经学到了很多来执行基本任务 但我陷入了一些非常令人困惑的事情 我的一个脚本实际上在鼠标悬停在功能上时更改了 div 容器的图像 功
  • 重新排序 Magento JavaScript 包含 (addJs)

    我会保持简单 在我的产品页面上 我需要删除prototype js 文件并将其替换为最新版本的prototype 到目前为止 我已经使用 local xml 成功替换了它
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • 将其作为参数传递给 addEventListener()

    我想添加change一组复选框的事件 我如何访问this在我的事件函数中 这样当我执行事件时我可以访问复选框的值 这是我当前的代码 var checkboxes document getElementsByClassName cb Arra
  • 获取 pdf 第 1 页(共 2 页)的图像

    我正在使用 html2canvas 和 jsPDF 以及 Angular4 创建图像 我想将此图像放置在 2 页生成的 pdf 的第 1 页上 但似乎这条线 doc save test pdf 需要在函数内部htm2canvas 因为如果我
  • 强制执行 show.bind

    我有一个包含数据的表 当从另一个视图触发事件时 我希望视图检查 show bind 语句 问题是该事件没有更改当前视图中的任何数据 foo html tr p canBeRemoved p tr 我正在使用 EventAggregator
  • 内联执行生成的汇编程序

    我正在阅读以下演示文稿 http wingolog org pub qc 2012 js slides pdf http wingolog org pub qc 2012 js slides pdf其中讨论了 4 10 19 内联 ASM
  • 无法提取 Typescript 中的对象值

    我一直在尝试将 JavaScript Web 表单转换为 Typescript 但无法弄清楚如何处理以下内容 在 JavaScript 中有效 let fieldValues JSON parse cookieData let keys O
  • 它们是“相同的”吗?代码大战

    这是完整的问题描述 给定两个数组 a 和 b 编写一个函数 comp a b Clojure 中的 compSame a b 来检查这两个数组是否具有 相同 元素以及相同的重数 这里 相同 意味着 b 中的元素是 a 平方中的元素 无论顺序
  • 如何使用javascript从特定标签获取HTML文档中的所有textNode?

    如何在不使用xpath或treewalker的情况下从单个数组中的一组特定标签中获取所有textNodes blockquote em h4 h6 p IE不允许您使用xpath和treewalker 请帮助我 如果脚本仅适用于 IE 那就
  • Webpack:如何将 javascript 注入 HTML 而不是单独的 JS 文件

    有没有办法让 webpack 将输出注入 HTML 而不是单独的文件 我不得不使用html webpack inline source plugin https github com DustinJackson html webpack i
  • D3 时间解析返回 null

    根据此页面上的说明 https github com mbostock d3 wiki Time Formatting https github com mbostock d3 wiki Time Formatting我正在尝试解析 ISO
  • javascript 中一次仅选中一个复选框

    I have 3复选框 我只想1一次选中的复选框 下面是我的 html 小提琴 JS小提琴 https jsfiddle net n03jLhqa 我想要这个工作在IE8还请建议如何做 这个怎么样 fiddle http jsfiddle
  • 如何与使用 child_process.spawn 创建的新创建的服务器交互

    我正在尝试为我的私人托管的 反恐精英全球攻势 服务器制作一个前端 当我点击运行服务器时 在前端 一切正常 服务器启动并记录到控制台 但是如何查看服务器IP地址 服务器中的玩家等信息呢 这是我到目前为止运行服务器的内容 router post
  • 加载 angularjs 路由后运行 javascript 代码

    我需要在 angularjs 加载路线后显示警报 显示警报的代码位于 angularjs 异步加载的视图中 视图加载后 我希望它能够运行 但它没有 我知道我可以广播并告诉它稍后运行等 但我需要一个更通用的解决方案 假设您正在谈论基于以下内容
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • Modernizr 未将类应用于 html 标签

    我目前正在构建一个网站 我需要使用 Modernizr 但由于某种原因 它没有将类应用到 html 标签 因为它应该 我的代码如下所示
  • python 函数返回 javascript date.getTime()

    我正在尝试创建一个简单的 python 函数 它将返回与 javascript 相同的值new Date getTime 方法 如所写here http www w3schools com js js dates asp javascrip
  • javascript:获取带有单位的CSS prop值[重复]

    这个问题在这里已经有答案了 我的代码是这样的 image 1 position absolute top 3vw 我的尝试 http jsfiddle net z8k6t3fb 1 http jsfiddle net z8k6t3fb 1

随机推荐

  • 如何从另一个函数返回生成器

    我有一个生成器函数 我想从另一个函数调用它并返回获得的生成器 我在这里可以看到两种方法 请注意 以下函数是简单的虚拟函数 用于说明目的 请不要想出更好的方法来实现这些功能本身 Method 1 def fun a n for i in ra
  • 如何制作热图并使用 NA 值进行聚类?

    我正在尝试使用我的数据制作热图 但很难正确编码 我的矩阵充满了 log x 1 值 这样我就不会遇到 log 0 错误 但是由于数据的性质 我有一堆 0 值 它们掩盖了热图的任何趋势可能正在展示 因此 我想将任何 0 值着色为灰色或黑色 然
  • 所选图像未显示在画布上

    我正在开发一个应用程序 用户可以从提供的图像列表中选择图像 当用户单击列表中的图像时 所选图像应作为背景显示在画布上 我正在使用reactjs redux 和fabricjs 开发它 当我这样做时 我没有得到选定的图像 this props
  • 从 Firebase 数据库异步方法返回值

    我想检查 Firebase 中是否已有具有所选用户名的用户并且我已经创建了一个函数checkUsernameAlreadyTaken username String gt Bool做这个的 这是该函数的代码 func checkUserna
  • 参数超过256字节的CUDA内核调用思路

    我有几个结构 它们的总大小超过了允许在内核调用中作为参数传递的 256 字节大小 这两个结构都已分配并复制到设备全局内存 1 如何在同一个内核中使用这些结构而不将其作为参数传递 更多细节 这些结构可以单独作为参数传递 例如 在不同的内核中
  • 从命令行查看表格文件,例如 CSV [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 异常:oauth 状态丢失或无效。 (ASP.NET Core 外部标识符 OAuth)

    我正在尝试在 Asp Net Core 中实现外部 OAuth https github com aspnet contrib AspNet Security OAuth Providers https github com aspnet
  • 在 iframe 中加载另一个域网站

    我想使用 iframe 在我的网站上加载另一个网站 我在其他一些网站中使用 iframe 加载时遇到了一些其他问题 那么我们不能实现iframe来加载其他域网站页面吗 如果是这样 我们是否有其他方法来加载网站 以下是我测试的方法 我已经尝试
  • 从 Azure DevOps 获取已通过 JavaScript 合并到分支中的所有工作项

    The idea 我目前正在使用 NodeJS 开发一个 发行说明 应用程序 该应用程序调用各种 Azure DevOps REST API 端点来获取基于特定标签的工作项 我现在拥有的 我现在所拥有的工作原理如下 SomeAzure De
  • 将 Github 存储库移植到另一种语言

    我想将别人的存储库移植到另一种语言 就我而言 SCSS gt Stylus 但它很可能是Javascript gt Coffeescript 解决这个问题的最佳方法是什么 我是不是该 分叉存储库并编辑文件 而不是拉取请求 在这里 我只会分叉
  • 在引导程序中,如何使图像成为下拉菜单?

    在引导程序中 如何使图像成为下拉菜单 您好 我在引导程序中创建了一个下拉列表 我想放置一个图像 使其成为单击的项目以查看下拉列表 下面是我的代码
  • C++ 模板和内联

    当我编写一个简单 非模板 类时 如果函数实现 就地 提供 它会自动被视为inline class A void InlinedFunction int a 0 the same as inline void InlinedFunction
  • 输入(...)提示后显示%?

    假设我们使用的是 python3 3 和多平台 Linux 和 WIndow 如果我执行以下操作 gt gt gt eval input enter a percent from 1 100 I get enter a percent fr
  • 在 MongoDB 中查询相似数组

    我想在 MongoDB 集合中搜索具有相似数组的文档 并按相似值排序 Example 我会寻找 chars a b c 我已经存储了这些文件 1 chars s e c 2 chars i l d 3 chars b a c 4 chars
  • 如何断言 C# 异步方法在单元测试中引发异常? [复制]

    这个问题在这里已经有答案了 可能的重复 如何使用 NUnit 测试异步方法 最终使用另一个框架 https stackoverflow com questions 12191831 how do i test an async method
  • Jupyter Notebook 同时显示和捕获输出

    我试图找到一种方法来 保存 jupyter 笔记本中的变量 同时捕获丰富的输出 主要是由于 ssh 断开连接等原因 仅分配给变量是行不通的 因为某些库会打印进度条等信息 到目前为止 最有希望的方法是使用 capture然而 在最近的版本中
  • Table Row,可以将高度设置为零吗?

    可以将表格行高设置为 0 吗 IE 8 Chrome 火狐 Opera 你为什么问 好吧 我有一行是在用户单击父行时动态构建和显示的 问题是 如果没有行 当单击时 它仍然显示一个空的 1 像素高的行 这是子网格视图
  • 摆脱 Google api lib 中不必要的依赖项

    背景 我已经在客户端和服务器端使用 Google 服务成功实现了用户身份验证 我用过适用于 PHP 的 Google API 客户端库 https github com googleapis google api php client为此目
  • Nullable 是“预定义值类型”吗?或者 Equals() 和 == 在这里如何工作?

    对于我自己的 Equals 方法的实现 我想检查一堆内部字段 我这样做 myNullableInt obj myNullableInt myString obj myString 我假设 这会比较值 包括 null 是否相等 而不是对象地址
  • Chrome DevTools 协议:如何获取节点的单击事件处理程序名称

    Problem 我有一个相同节点的列表 这些节点附加了相同的处理程序或函数 我需要单击 DOM 中存在的每个交互式节点 这是功能或要求 如果已经单击了要单击的节点或者该节点附加了相同的处理程序 我想跳过要单击的节点 请参阅下面的屏幕截图以供