0
複製數據我有一個非常奇怪的情況。我有一個擴展名,可以根據用戶的選擇從網頁上覆制內容。但是,如果有多個幀,它就會失敗。例如在Gmail上。如果我選擇Gmail的任何東西,試圖找到它的選擇將最終得到一個錯誤:從網頁Firefox擴展
Error: window.getSelection(...) is null
這裏是我的代碼(這是一個工作的例子,我不包括圖標。):
manifest.json的
{
"description": "Adds a solid red border to all webpages matching mozilla.org. See https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples#borderify",
"manifest_version": 2,
"name": "Borderify",
"version": "1.0",
"homepage_url": "https://github.com/mdn/webextensions-examples/tree/master/borderify",
"icons": {
"48": "icons/border-48.png"
},
"background": {
"scripts": ["myaddone.js"]
},
"browser_action": {
"default_icon": "icons/trash.svg",
"default_title": "Forget it!"
},
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["callHere.js"],
"all_frames": true
}]
}
callHere.js
function logger(msg) {
console.log("=============");
console.log(msg);
console.log("=============");
}
var getSelectedDataFromPage = function() {
logger("fooo");
selec = window.getSelection().toString().trim();
return selec;
}
browser.runtime.onMessage.addListener(request => {
var messageToCopy = request.greeting;
if (messageToCopy == "findCopy") {
var selectedText = getSelectedDataFromPage();
return Promise.resolve({
response: selectedText
});
}
logger(messageToCopy);
return Promise.resolve({
response: "Fail"
});
});
個
myaddone.js
function logger(msg) {
console.log(msg);
}
function onError(error) {
console.error(`Error: ${error}`);
}
function findSelectionTExt(tabs) {
for (let tab of tabs) {
browser.tabs.sendMessage(tab.id, {
greeting: "findCopy"
}).then(response => {
logger(response.response);
}).catch(onError);
}
}
browser.browserAction.onClicked.addListener(() => {
browser.tabs.query({
currentWindow: true,
active: true
}).then(findSelectionTExt).catch(onError);
});
它使用一個消息系統內容腳本來選擇複製的東西。它適用於Stack Overflow和其他站點,但不適用於使用更多框架的站點,比如Gmail。
循環圖片,你可以看到它能夠抓住文本第一次,然後它不斷髮出,我認爲該消息。
什麼我真的失蹤了?
您正在使用,以獲得選擇的代碼是不夠的。使用可在代碼片段中找到的更復雜的代碼:[獲取突出顯示/選定文本](https://stackoverflow.com/a/5379408)。正如你應該能夠測試的那樣,在某些情況下,你使用的代碼將無法在Firefox中得到選擇。 – Makyen
*請*,使用一個[縮進風格(https://en.wikipedia.org/wiki/Indent_style)一直在你的代碼。這樣做使得**更容易閱讀/維護。作爲一個副作用,如果您在Stack Overflow上放置代碼,那麼您更有可能讓人們投票選舉您的帖子,並使人們更有可能花時間回答您的問題。選擇哪種風格並不重要(雖然IMO有些比JavaScript更適合JavaScript)。但是,選擇一個並且一致地用於單個項目中的所有代碼。 – Makyen
調整您的代碼以在我提供的鏈接中包含更強大且必要的代碼可能會(也可能不會)解決您的特定問題。目前還不清楚這是否是您的實際問題,或者不是。您提供的信息太少,您無法真正瞭解您使用這些信息的情況。但是,不使用更強大的代碼*會導致無法獲取選定文本的問題。請包含更健壯的代碼並重新測試。 – Makyen