Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Safari扩展将消息发送到特定选项卡_Javascript_Safari_Add On_Safari Extension_Browser Extension - Fatal编程技术网

Javascript Safari扩展将消息发送到特定选项卡

Javascript Safari扩展将消息发送到特定选项卡,javascript,safari,add-on,safari-extension,browser-extension,Javascript,Safari,Add On,Safari Extension,Browser Extension,是否有方法将消息从全局页面发送到特定选项卡 我目前正在做的是,在创建选项卡时,注入的脚本创建一个唯一的id,并将带有此编号的消息发送到全局页面,全局页面保存此编号 如果全局页面需要向选项卡发送一些数据(即:选项卡#3),则全局页面将向所有选项卡“广播”一条消息,该消息的编号为#3,作为传递给选项卡的数据的一部分(遍历所有选项卡并向每个选项卡发送消息) 是否有类似Chrome的东西:(即:Chrome.tabs.sendRequest(tabID,{action:'respond',params:

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

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


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

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

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

// later...
myTabs[someId].page.dispatchMessage('haveSomeCake');
Safari扩展API没有选项卡ID,但您可以将每个选项卡保留在关联数组中,然后使用其索引对其进行寻址。例如:

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

// later...
myTabs[someId].page.dispatchMessage('haveSomeCake');
狩猎回答

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

// 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);
-


我认为,你还需要做一些额外的工作来处理新的safari,提前获取很多页面