【问题标题】:Safari extension send message to a specific tabSafari 扩展将消息发送到特定选项卡
【发布时间】:2012-03-26 17:53:35
【问题描述】:

有没有办法将消息从全局页面发送到特定选项卡
我目前正在做的是,在创建选项卡时,注入的脚本会创建一个唯一的 id 并将带有此编号的消息发送到全局页面,并且全局页面会保存此编号。
如果全局页面需要将一些数据发送到选项卡(即:选项卡#3),那么全局页面将“广播”一条消息到所有带有编号#3 的选项卡,作为传递给选项卡的数据的一部分(迭代在所有选项卡上并向每个选项卡发送消息)。
有没有类似 Chrome 的东西:(即:chrome.tabs.sendRequest(tabID, {action: 'respond', params:[channel,msg,async]});)?

现在我正在做的是在注入脚本方面,每个脚本都有一个侦听器来捕获此消息。如果内容脚本唯一编号等于全局页面发送的编号,则此消息是给它的,否则doNothing

在 Safari 中是否有更简单、更优雅的方式来执行此操作?

【问题讨论】:

    标签: javascript safari add-on safari-extension browser-extension


    【解决方案1】:

    在全局页面的消息事件处理程序中,event.target 指的是从中接收消息的选项卡。例如:

    function handleMessage(e) {
        if (e.name === 'whatIsMyUrl?') {
            e.target.page.dispatchMessage('yourUrlIs', e.target.url);
        }
    }
    safari.application.addEventListener("message", handleMessage, false);
    

    Safari 扩展 API 没有标签 ID,但您可以将每个标签保存在一个关联数组中,然后使用其索引来处理它。例如:

    function handleMessage(e) {
        if (e.name === 'hereIsMyId') {
            myTabs[e.message] = e.target;
        }
    }
    safari.application.addEventListener("message", handleMessage, false);
    
    // later...
    myTabs[someId].page.dispatchMessage('haveSomeCake');
    

    【讨论】:

      【解决方案2】:

      Safari 答案

      在您的全局页面中直接保存到选项卡.. 例如来自注入脚本的消息

      // global page
      safari.application.addEventListener("message", function(event){
          switch(event.name){
              case "saveData":
                  event.target.page.tabData = { data: myData }
              break;
              case "getData":
                  event.target.page.dispatchMessage("tabData", myData);
              break;
          }
      }, false);
      

      -

      // injected page
      
      // first save data
      safari.self.tab.dispatchMessage("saveData", {firstname:"mike", age: 25} );
      
      // setup listner to recevie data
      safari.self.addEventListener("message", function(event){
          switch(event.name){
              case "tabData":
                  // get data for page
                  console.debug(event.message);
                  // { firstname: "mike", age: 25 }
              break;
          }
      }, false);
      
      // send message to trigger response
      safari.self.tab.dispatchMessage("getData", {} );
      

      【讨论】:

      • 而且你必须做一些额外的事情来处理新的 safari 我认为提前获取了许多页面
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      相关资源
      最近更新 更多