2

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

现在我的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>

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

4

1 回答 1

4

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

例如:

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

注入的.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 中将 injection.js 设置为开始或结束脚本。

于 2013-04-09T17:18:41.727 回答