【发布时间】:2021-04-21 17:29:24
【问题描述】:
我正在编写一个 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 对象,因为该对象在发送之前看起来还可以,而在接收时则不行。..
【问题讨论】:
-
看起来问题不在于序列化 DOM 对象,因为该对象在发送之前看起来还可以,而在接收时却不行。..
-
tabs.sendMessage 中的消息必须是“JSON-ifiable object”。 DOM 元素不是 JSON 格式的。因此,您不能发送它们。如果要识别元素,则需要确定(或定义;例如分配 ID)唯一选择器。最终,您需要做什么而不是尝试序列化 DOM 元素取决于您在后台脚本中需要此信息的原因。
-
我需要在扩展的本地存储中保存 DOM 对象。 DOM 对象有时可能没有 ID,因此需要保存整个元素。
-
你不能做你想做的事。因此,您将需要找到其他方法来实现您的实际目标。您尚未说明您的实际目标,因此我们无法就您如何实现该目标提出建议。我们已经达到了XY problem 的位置。
标签: javascript google-chrome google-chrome-extension