我正在尝试创建一个非常基本的Safari扩展程序,一旦您单击工具栏图标,就会在弹出框中显示当前选项卡的URL。
到目前为止,我有以下代码:
global.html:
<!doctype html>
<html>
<head>
<script src="global.js"></script>
</head>
<body>
</body>
</html>
global.js:
function getCurrentURL() {
return safari.application.activeBrowserWindow.activeTab.url;
}
popover.html:
<!doctype html>
<html>
<head>
<script src="popover.js"></script>
</head>
<body>
<div class="bodyContainer" id="status"></div>
</body>
</html>
popover.js
var main = function() {
var currentURL = safari.extension.globalPage.contentWindow.getCurrentURL();
console.debug("TTLogs: Current URL in Popover: " + currentURL);
modifyBody(currentURL);
};
var modifyBody = function(link) {
var body = document.getElementById("status");
body.innerHTML = "Hello world. Link is " + link; // I get error here. body is returned as null.
};
main();
我想要的是,当我点击popover图标时,我希望popover显示“Hello world.Link is”。
实际发生的是当我点击popover图标时,在控制台中,我看到我收到了正确的URL但是,我收到了错误:
[Error] TypeError: null is not an object (evaluating 'body.innerHTML = "Hello world. Link is " + link')modifyBody (popover.js:9)
扩展的想法是当我点击popover时,它需要:
我在这里缺少什么?
编辑我解决了。 我想要的预期流量是:
global.js
以捕获网页的网址global.js
popover.html
醇>
实际发生的流程是:
global.js
以捕获网页的网址modifyBody()
(因为我们尚未收到来自global.js的回复)。因此页面保持空白。global.js
的回复 - 但现在已经太晚了。要解决这个问题,我有多种选择。几个选项是:
global.js
或者,创建一个popoverHandler
并将其添加到事件监听器中,如下所示:
safari.application.addEventListener("popover", popoverHandler, true);
单击工具栏项时会立即调用此选项,并在显示弹出窗口时正确调用。
所以代码看起来像这样:
var popoverHandler = function(event) {
console.debug("Opening popup. Identifier");
var currentURL = safari.extension.globalPage.contentWindow.getURL();
// update my page.html here.
};
您还可以在"activate"
中注册"open"
,"navigate"
或global.js
个处理程序 - 然后在触发后调用popover.js
更新html函数。< / p>
希望这有帮助。
答案 0 :(得分:1)
您正试图从全局页面中访问实际页面上下文 - 我猜Safari会阻止您这样做。您可以从条形图和弹出窗口访问全局页面,但不能从实际页面访问。
使用消息传递,请参阅例如扩展程序教程中的Support Logic for Injected Scripts。您需要两个简单的函数来询问URL并返回其值。