- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写 Chrome 扩展程序。我需要将一个元素对象从内容脚本传递到后台脚本。
目标:
该扩展是关于记录和重播用户操作的。
数据保存在扩展程序的本地存储中,每个选项卡的不同对象(按选项卡 ID)。
数据结构是一个列表{x: x, y:y, element: element}
当用户想要重播时,我为列表中的每个对象使用一个循环,并在元素上使用 .click()
内容脚本中的代码:
向后台脚本发送消息的函数:
function addToEventHistory(cords) {
console.log(cords)
chrome.runtime.sendMessage({action: "addToEventHistory", cords: cords}, function(response) {
return response;
});
}
获取元素并感知它的函数:
mouseClick: function(e) {
var target = e.target || e.srcElement
var clickEvent = {x: e.pageX, y: e.pageY, element: target}
addToEventHistory(clickEvent)
}
后台脚本中的代码:
var tabId = sender.tab.id;
var existingRecords = JSON.parse(localStorage.getItem('record_'+tabId)) || [];
existingRecords.push(request.cords)
console.log(request.cords)
localStorage.setItem('record_'+tabId, JSON.stringify(existingRecords));
sendResponse();
问题是我发送的元素被接收为一个空对象。在发送和接收时通知 console.log
。输出是:
发送:
Object {x: 1205, y: 1067, element: div#content.snippet-hidden}
接收:
Object {x: 1205, y: 1067, element: Object}
* 元素对象是空的,只有_proto_
这是什么原因?
我该如何解决这个问题?
看起来问题不是序列化 DOM 对象,因为对象在发送前看起来正常,但在接收时看起来不正常。
最佳答案
runtime.sendMessage()
发送留言runtime.sendMessage()中的消息必须是“一个 JSON 化的对象”。 DOM 元素/节点不是 JSON 化的。因此,您不能发送它们。在您的情况下,您正在尝试发送 click
事件的 target
。
最终,您需要做什么而不是尝试序列化 DOM 元素,这取决于您在后台脚本中需要此信息的原因。
如果要标识元素,则需要确定唯一的选择器。一种方法是为元素分配一个唯一 ID 并在您的消息中传递该 ID。但是,只有当您希望在该选项卡中加载该页面时引用 DOM 节点时,这才会有效。显然,一旦浏览器离开页面或将其加载到不同的选项卡中,您分配的任何 ID 都将不可用。因此,该替代方案仅适用于在当前页面的生命周期内标识元素。但是,对于您只想存储实际 DOM 元素的应用程序,分配唯一 ID 将是一个有效的解决方案。换句话说,存储 DOM 元素仅在页面的生命周期内有效,因此分配唯一 ID 将在同一时间段(当前页面的生命周期)内有效。
如果您想要在重新加载页面时唯一标识元素的方法,则需要使用与分配 ID 不同的方法。使用什么在很大程度上取决于您打算如何选择要使用的元素以及您希望选择相对于页面结构变化的弹性(例如,在结构是动态的页面上,您可能需要使用除静态页面之外的其他方法)。
对于您的应用程序,如果您想记录和回放用户操作,您需要根据鼠标在页面中的位置或根据用户启动事件的元素来确定是否要记录这些操作.这是用于记录/回放/模拟用户操作的应用程序/语言的常见问题。通常,用户可以选择他们希望如何记录此类用户交互(例如,通过位置或元素)。如果您选择仅通过事件发生时鼠标的位置来存储用户操作,那么您可以使用 Document.elementFromPoint()
确定此时哪个元素现在并将事件发送到该元素。但是,这样做时,您还需要跟踪文档的滚动状态,并根据鼠标在当前显示中的位置或相对于文档的位置来确定是否要存储鼠标的位置。
关于javascript - 通过 chrome.tabs.sendMessage 发送 DOM 节点对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40062328/
我在看 Tabs UI 的选项。默认行为是它们水平堆叠。有没有办法改变它? 我想堆叠Tabs垂直。它将节省大量的 UI“不动产”,尤其是在移动应用程序 UI 中。 最佳答案 尝试这个: Tabs ta
问题:在 Zsh 中使用 TAB 向后导航,类似于在 Firefox 中 Shift-TAB Shift-TAB 应该执行的操作示例 我在终端中运行以下代码 ls 我明白了 A B C D E F
有很多人想知道如何完成制表符。这不是这些问题之一。问题是如何将 tab 键分配给 tab 补全? alt-tab/esc-tab 很痛苦。在面板禁用模式选项卡完成工作,这让我暂时...但我仍然希望面板
所以我有一个带有 3 个屏幕的 TabNavigator。 import React from 'react'; import {TabNavigator,createBottomTabNavigat
我想触发一个事件,例如当我在文本框中按 Tab 键时显示警报消息。 $("input").blur(function (e) { if (e.which == 9) alert(
我将这段代码设置为创建一个选项卡式菜单,它显示为一个选项卡式菜单,但当我加载网站时,选项卡在单击时不会改变。在“检查元素”中它说 $( "#tabs").tabs();不是函数。我不知道下一步要解决这
表单中有多个输入字段的示例,因为有一些字段在此之前会自动填充,如果我按 Tab 键,那么它应该跳过该自动填充的输入字段并应转到空白输入字段 我尝试过,但是当我开始在空白输入中写入时会发生什么,它也会自
我想写一个小的 chrome 扩展程序,它应该从网页 A(当前网页)获取信息,将选项卡更新到网页 B,然后将代码注入(inject)网页 B。不幸的是,以下代码正在将网页更新到 B 但注入(injec
如果当前事件选项卡中的表单很脏,我试图阻止 mat-tab 的选项卡更改。 但是我找不到拦截选项卡更改事件的方法。 // Tab 0 Content // Tab
我已从 MacOS Mojave 上的默认终端切换到 iterm2 .我有一个关于从当前选项卡打开新选项卡的问题。 确实,我希望与上一个当前选项卡处于同一路径。 为此,我执行了经典程序,即转到 ite
我在我的网站的两页上有此代码,但在一页上该功能不起作用。 Firebug 向我显示“$(...).tabs 不是函数”。我不明白为什么,谁能告诉我什么是错的? 这是有效的: http://www.in
我需要可靠的方法来为 Windows 和 XP 创建 %tab% (包含一个制表符)。 SET TAB=" " 应该适用于 Windows 7(未测试)但不适用于 Win XP(已测试)。 这个 fo
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我正在尝试使用 RMarkdown 制作静态网页。我想定义一个 UI,它有第一层选项卡,然后是第一层下面的选项卡。我已经在 RMarkdown: Tabbed and Untabbed heading
我在使用 chrome.tabs.create 方法打开多个选项卡时遇到问题。我正在尝试使用 chrome.tabs.create 循环打开大约 9 个选项卡,但打开的选项卡数量仅限于 4 个。看起来
我正在使用 Material ui 的标签,并且能够对标签的指示器进行更改。但是,我正在尝试使用样式将每个选项卡的指示器宽度减小到某个固定宽度。但似乎指标以一些计算值定位在左侧,并且给它一个宽度不会使
我在 OS X 终端中使用 emacs 24.3,并且遇到了一些奇怪的事情。 在 markdown-mode.el 中,tab 键通过 (define-key map (kbd "") 'markdo
在 Chrome 开发者工具上 Uncaught (in promise) Error: There is no clipping info for given tab at E._handleRes
在vim中,我想将:tabnew缩短为:tn,将:tabp缩短为:th,将:tabn缩短为:tl在我的.vimrc中。知道我将如何重新映射这样的命令吗? 最佳答案 使用cabbrev: ca tn t
我读过几个主题,讨论 IE 中的地址栏在使用 TAB 时基本上是第一个获得焦点的主题(MSDN 自己的文档讨论了这一点)。 然而,我也见过一些情况,但情况并不总是如此...... 我有一个母版页,内容
我是一名优秀的程序员,十分优秀!