javascript - 如何在 safari 扩展上获取选定的文本?

标签 javascript safari safari-extension

我想编写一个翻译用户选择的文本的插件。但我在“获取所选文本”上停滞不前。我尝试了很多选择,但没有一个不起作用(可能是我的错)。

现在我的 global.html 看起来像这样:

<script >

// Set up Listener(s)
safari.application.addEventListener("command", performCommand, false);  

// Functions to perform when event is received
function performCommand(event) {
    if (event.command === "contextmenutranslate") {
        alert("first");
        alert(window.getSelection());
    }
}

</script>

第二个警报返回空字符串。
我做错了什么?
我该怎么办?

最佳答案

出于安全原因,全局页面无法直接与任何网页交互。因此,要从页面获取选定的文本,您需要使用注入(inject)的脚本。然后您可以使用 messages在全局页面和注入(inject)的脚本之间进行通信。

例如:

global.js

safari.application.addEventListener('command', performCommand, false);
safari.application.addEventListener('message', handleMessage, false);

function performCommand(event) {
    if (event.command === 'contextmenutranslate') {
        safari.application.activeBrowserWindow.activeTab.page.dispatchMessage('getselection');
    }
}

function handleMessage(msg) {
    if (msg.name === 'theselection') {
        alert(msg.message);
    }
}

注入(inject).js

safari.self.addEventListener('message', handleMessage, false);

function handleMessage(msg) {
    if (msg.name === 'getselection') {
        var sel = window.getSelection()+'';
        safari.self.tab.dispatchMessage('theselection', sel);
    }
}

请记住在 Safari Extension Builder 中将injected.js 设置为开始或结束脚本。

关于javascript - 如何在 safari 扩展上获取选定的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15903488/

相关文章:

css - 如何删除输入文本元素上的边框突出显示

caching - Post/Redirect/Get 上的整页重新加载忽略缓存控制

javascript - 如何在运行时更改 safari 扩展的高度?

javascript - 使用 Safari 扩展替换页面加载前的请求 URL

javascript - 从 JavaScript 正确设置全局变量

javascript - 创建通过客户端计算机路由的代理

javascript - 当用户向下滚动时,如何使侧边栏停在特定的 div 处?

Javascript - 如何获取所有浏览器名称?

javascript - D3 - 折线图给出错误的工具提示

javascript - 在 Safari 扩展中使用 javascript 注入(inject)与网页交互