2017-08-12 190 views
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。

循環圖片,你可以看到它能夠抓住文本第一次,然後它不斷髮出,我認爲該消息。

enter image description here

什麼我真的失蹤了?

+0

您正在使用,以獲得選擇的代碼是不夠的。使用可在代碼片段中找到的更復雜的代碼:[獲取突出顯示/選定文本](https://stackoverflow.com/a/5379408)。正如你應該能夠測試的那樣,在某些情況下,你使用的代碼將無法在Firefox中得到選擇。 – Makyen

+0

*請*,使用一個[縮進風格(https://en.wikipedia.org/wiki/Indent_style)一直在你的代碼。這樣做使得**更容易閱讀/維護。作爲一個副作用,如果您在Stack Overflow上放置代碼,那麼您更有可能讓人們投票選舉您的帖子,並使人們更有可能花時間回答您的問題。選擇哪種風格並不重要(雖然IMO有些比JavaScript更適合JavaScript)。但是,選擇一個並且一致地用於單個項目中的所有代碼。 – Makyen

+0

調整您的代碼以在我提供的鏈接中包含更強大且必要的代碼可能會(也可能不會)解決您的特定問題。目前還不清楚這是否是您的實際問題,或者不是。您提供的信息太少,您無法真正瞭解您使用這些信息的情況。但是,不使用更強大的代碼*會導致無法獲取選定文本的問題。請包含更健壯的代碼並重新測試。 – Makyen

回答