在弹出窗口中显示当前URL - Safari Extension

时间:2017-02-05 19:28:51

标签: javascript html safari-extension

我正在尝试创建一个非常基本的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时,它需要:

  1. 获取当前标签的网址。
  2. 对它做一些神奇的分析。
  3. 动态显示popover.html中的结果(通过DOM操作)。
  4. 我在这里缺少什么?

    编辑我解决了。 我想要的预期流量是:

    1. 拨打global.js以捕获网页的网址
    2. 等待来自global.js
    3. 的回复
    4. 收到回复后,请使用网址
    5. 更新popover.html

      实际发生的流程是:

      1. 拨打global.js以捕获网页的网址
      2. 立即使用空内容调用modifyBody()(因为我们尚未收到来自global.js的回复)。因此页面保持空白。
      3. 最后收到global.js的回复 - 但现在已经太晚了。
      4. 要解决这个问题,我有多种选择。几个选项是:

        1. 一旦我们收到global.js
        2. 的回复,请使用promises等待更新popover.html
        3. 或者,创建一个popoverHandler并将其添加到事件监听器中,如下所示:

          safari.application.addEventListener("popover", popoverHandler, true);

        4. 单击工具栏项时会立即调用此选项,并在显示弹出窗口时正确调用。

          所以代码看起来像这样:

          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>

          希望这有帮助。

1 个答案:

答案 0 :(得分:1)

您正试图从全局页面中访问实际页面上下文 - 我猜Safari会阻止您这样做。您可以从条形图和弹出窗口访问全局页面,但不能从实际页面访问。

使用消息传递,请参阅例如扩展程序教程中的Support Logic for Injected Scripts。您需要两个简单的函数来询问URL并返回其值。