将 window.location.href 从扩展程序复制到剪贴板
Copy window.location.href to clipboard from extension
我正在尝试复制 '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(例如,如果当前选项卡)
从您上面的代码 (Extensionbar html) 来看,您似乎编写了遗留的 Safari 扩展 (.safariextz),并且它已被弃用。参见 What’s New in Safari and WebKit" session on WWDC18
我建议您按照以下流程将代码重写到 Safari App Extension 中,可以写在 Swift 中。我不确定为什么错误的 URL 被复制到您的代码中的剪贴板,但重写您的代码会解决问题。
正在创建应用程序扩展项目
通过[文件] -> [新建] -> [项目...] 创建应用扩展,然后在Xcode 上选择[Safari 扩展应用]。项目模板包含菜单栏实施示例。
正在通过单击菜单栏按钮复制 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
我正在尝试复制 '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(例如,如果当前选项卡)
从您上面的代码 (Extensionbar html) 来看,您似乎编写了遗留的 Safari 扩展 (.safariextz),并且它已被弃用。参见 What’s New in Safari and WebKit" session on WWDC18
我建议您按照以下流程将代码重写到 Safari App Extension 中,可以写在 Swift 中。我不确定为什么错误的 URL 被复制到您的代码中的剪贴板,但重写您的代码会解决问题。
正在创建应用程序扩展项目
通过[文件] -> [新建] -> [项目...] 创建应用扩展,然后在Xcode 上选择[Safari 扩展应用]。项目模板包含菜单栏实施示例。
正在通过单击菜单栏按钮复制 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