Safari扩展 - 响应消息的注入脚本太多

时间:2010-06-16 15:26:54

标签: safari safari-extension

我正在尝试编写类似于Bubble Translate for Chrome的Safari扩展程序。

当您点击工具栏上的按钮时,它会使用Google语言API自动将当前选中的文字翻译为您选择的语言。

我使用以下注入的脚本来获取突出显示的文本并显示结果(作为暂时的警报):http://pastebin.com/bYVuQAmp

如果需要,我使用以下全局脚本来调用注入的脚本:hxxp://pastebin.com/VHaAKM5a

我遇到的问题如下:

该脚本不仅会被注入主页,还会被嵌入到页面中的广告和类似内容中。因此,所选文本会多次翻译,因为一个页面中的所有嵌入脚本都会响应该消息。

如何确保脚本仅注入正确的页面或只有正确的页面响应?

谢谢,

菲利普

2 个答案:

答案 0 :(得分:3)

当全局脚本响应来自注入脚本的消息时,在响应消息中包含目标选项卡的url,如下所示:

var message = {
  translation: result.translation,
  url: event.target.url
}
event.target.page.dispatchMessage("displayTranslation", message);

然后,在注入脚本的消息处理程序中,检查消息中传递的url是否与页面url匹配,如下所示:

if (event.name === "displayTranslation" && 
     event.message.url === window.location.href) {
  alert(event.message.translation);
}

这样,只有发起请求的帧中的脚本才会对响应起作用。

答案 1 :(得分:1)

也许您可以检查注入脚本的页面是否在框架内:

if (window == window.parent) { /* you're not inside a frame! */ }

我不确定它是否适用于嵌入HTML的<object>标签内部。可能是的。