javascript Chrome扩展:将消息从注入脚本发送到内容脚本

vkc1a9a2  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(175)

我正在尝试开发一个chrome扩展,它必须使用OnUpdatedOnActivated事件侦听器注入脚本。
我的脚本可以正确注入,但问题是如何使用注入的脚本与后台/service_worker脚本通信
这是我注入脚本的图像,其中包含某种按钮Injected Script
我已尝试将这些元素访问到content-script中,将消息发送到后台/service_worker,但在我的content-script中无法访问这些元素
当我尝试在没有注入脚本的情况下访问元素时,这些元素在content-script与background/service-worker Web page之间正确传递消息
这是Manifest MV3清单.json

"content_scripts": [
    {
      "matches": [
        "<all_urls>"
      ],
      "css": [
        "css/all.min.css",
        "css/camera.css"
      ],
      "js": [
        "js/content-script.js"
      ],
      "run_at": "document_end",
      "all_frames": false
    }
  ],
  "web_accessible_resources": [
    {
      "resources": [
        "*"
      ],
      "matches": [
        "<all_urls>"
      ],
      "use_dynamic_url": true
    }
  ]

这是我的内容脚本.js

var startRecording = document.getElementById('start-recording');
var stopRecording = document.getElementById('rec-stop'); 

if(startRecording){
    startRecording.addEventListener('click',()=> {
        chrome.runtime.sendMessage({recording_started: true}, function(response){
            console.log(response.result);
        })
    })
}
if(stopRecording){
    stopRecording.addEventListener('click',()=>{
        console.log('im stop')       
    })
}

startRecording正在访问正在工作的非注入脚本中的元素,并且
stopRecording正在从注入的脚本访问元素,该脚本运行不正常
毕竟这是我的service_worker.js,我用它来监听来自内容脚本的消息

chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
    console.log('Service Workder ',message);
    if(message.recording_started){
        sendResponse({result: 'hello Im going from service worker'});
    }
    if(message.notification){
        sendResponse({result: 'Notification from service worker'});
    }
})

基本上,我的问题是访问content-script中注入脚本的元素,并在单击注入元素时将消息传递给service_worker.js

也许我使用了错误的消息传递方法,您应该建议我一个更好的方法来在注入脚本和内容脚本之间传递消息,谢谢

xlpyo6sf

xlpyo6sf1#

根据提供的有限代码和您的解释,如果stopRecording是通过注入的脚本添加的,那么您的代码实际上似乎没有添加stopRecording元素。用户单击“startRecording”后,在尝试“getElementId”并为其分配onclick事件之前,应该首先将stopRecording元素注入DOM。在startRecording onClick事件中,您应添加代码,将startRecording按钮替换为stopRecording按钮,然后查找“rec-stop”:

var startRecording = document.getElementById('start-recording');
 
 if(startRecording){
    startRecording.addEventListener('click',()=> {
    //Replace startRecording Button with stopRecording Button
    const stopRecordingElement = document.createElement("div");
    stopRecordingElement.id = "rec-stop";
    //Add any image or styling to button
    startRecording.replaceWith(stopRecordingElement);
    //Now that the DOM has the 'rec-stop' element you can call
    var stopRecording = document.getElementById('rec-stop'); 
    if(stopRecording){
       stopRecording.addEventListener('click',()=>{
          console.log('im stop')       
       })
    }
    chrome.runtime.sendMessage({recording_started: true}, 
        function(response){
            console.log(response.result);
        })
    })
 }

相关问题