【问题标题】:Copy window.location.href to clipboard from extension将 window.location.href 从扩展复制到剪贴板
【发布时间】:2019-02-10 09:51:58
【问题描述】:

我正在尝试复制“window.location.href”,例如当前页面的 URL 从我的扩展程序到剪贴板。

我的问题是,当我将 URL 复制到剪贴板时,复制的是扩展 URL,而不是我正在访问的页面。

扩展栏:

<!DOCTYPE HTML>
<html>
    <head>
        <button onclick="copyFunction();">Copy</button>
        <script type="text/javascript">
          function copyFunction() {
          var inputDump = document.createElement('input'),
              hrefText = window.location.href;
          document.body.appendChild(inputDump);
          inputDump.value = hrefText;
          inputDump.select();
          document.execCommand('copy');
          document.body.removeChild(inputDump);
          }
        </script>
    </head>
</html>

根据我的理解,解决方案应该是这样的,但我担心我太无能为力了:https://developer.apple.com/documentation/safariservices/safari_app_extensions/passing_messages_between_safari_app_extensions_and_injected_scripts

这就是我(试图)通过创建 global.html 页面和注入脚本来进行的方式。

全球页面:

<!DOCTYPE HTML>
<script>
    safari.application.addEventListener("command", copyFunction, false);

    function copyFunctionEvent(event) {
        if (event.command == "CopyToClipboard") {
            safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("CopyToClipboard", "all");

    }
}
</script>

注入脚本:

function myextension_openAll(event){
    if (event.name == 'CopyToClipboard'){         
       function copyFunction() {
       var inputDump = document.createElement('input'),
           hrefText = window.location.href;
       document.body.appendChild(inputDump);
       inputDump.value = hrefText;
       inputDump.select();
       document.execCommand('copy');
       document.body.removeChild(inputDump);
       }

}
safari.self.addEventListener("message", myextension_openAll, true);

实际: safari-extension://com.myextension-0000000000/abc123/extensionbar.html

预期: http://www.google.com(例如,如果当前选项卡)

【问题讨论】:

  • 也许safari.application.activeBrowserWindow.activeTab.url ?我对 Safari 扩展一无所知,这个答案有 0 票赞成,所以以防万一。
  • 谢谢 Jeto,我也试过这个,但对我来说问题主要是我不确定如何在我的 extensionbar.html、global.html 和注入的脚本之间正确通信。我怕我迷路了。 :)

标签: javascript html safari-extension


【解决方案1】:

从您上面的代码(Extensionbar html)中,您似乎编写了旧版 Safari 扩展程序(.safariextz),但它已被弃用。见What’s New in Safari and WebKit" session on WWDC18

我建议您按照以下流程将代码重写为 Safari App Extension,该流程可以用 Swift 编写。我不确定为什么将错误的 URL 复制到代码中的剪贴板,但重写代码可以解决问题。

创建应用扩展项目

按照 [File] -> [New] -> [Project...] 创建 App Extension,然后在 Xcode 上选择 [Safari Extension App]。项目模板包含菜单栏实现示例。

通过单击菜单栏按钮复制 location.href

当您单击菜单栏按钮时,以下代码将添加复制 location.href 的功能。

只需将其粘贴到 SafariExtensionHandler.swift 中即可。

class SafariExtensionHandler: SFSafariExtensionHandler {

    override func messageReceived(withName messageName: String, from page: SFSafariPage, userInfo: [String : Any]?) {

        // WHen injected script calls safari.extension.dispatchMessage, the message will come here

        guard let href = userInfo?["href"] as? String else { return }

        // Save href to clipboard
        NSPasteboard.general.clearContents()
        NSPasteboard.general.setString(href, forType: .string)
    }

    override func toolbarItemClicked(in window: SFSafariWindow) {
        // Request injected script a message to send location.href
        window.getActiveTab { currentTab in
            currentTab!.getActivePage { currentPage in
                currentPage!.dispatchMessageToScript(withName: "getHref", userInfo: nil)
            }
        }
    }
}

并注入脚本(script.js)如下。

safari.self.addEventListener("message", function(event) {
  console.log("event received");
  safari.extension.dispatchMessage("sendHref", { "href": location.href });
});

工作示例

在这里完成工作代码,这可能对您的工作有所帮助。祝你好运:)

https://github.com/horimislime/safari-extension-menubar-example

【讨论】:

  • 非常感谢!这肯定会让我朝着正确的方向前进。现在看来,我只需要快速阅读一些内容。 :) 将此标记为答案。
猜你喜欢
  • 2012-11-27
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2015-03-08
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多