2015-10-15 84 views
0

我正在製作Chrome擴展程序,它需要從網頁獲取一些值。 頁面有一個功能的腳本元素:獲取Chrome擴展程序的網頁函數返回值

<script>D.setConst({"TIME":1444940082,"LANG":"En","ID":1463887,"DEV":false,"DEV_NAME":...... 

當我在瀏覽器控制檯D.TIME型,我得到的時間值。 在那個函數中有很多變量,我需要它們中的很少一些用於我的擴展。

我已經完成的步驟: 1. manifest文件擁有所有權限,聲明瞭內容腳本。 2.有一個按鈕,它從我的內容腳本執行代碼的popup.html窗口:

function click(e) { 
    chrome.tabs.executeScript(null, 
     {code:'var btn = document.createElement("SCRIPT"); btn.innerHTML = "console.log(D.nonce.name);"; document.body.appendChild(btn);'},function(results){ console.log(results); }); 

    //window.close(); 
} 



document.addEventListener('DOMContentLoaded', function() { 
    var divs = document.getElementById('message'); 
    divs.addEventListener('click', click); 

}); 

結果在我的分機控制檯我得到一個結果[對象],但沒有價值,我需要。我在瀏覽器控制檯中得到了結果,但我無法獲得擴展名。

我試圖找到一個解決方案,但我所發現的是如何在DOM中注入腳本。

請幫忙。

已編輯。

清單文件

{ 
    "name": "tesiting", 
    "description": "generic", 
    "version": "1.0", 
    "permissions": [ 
    "https://www.example.lv/*", 
    "https://*.example.*", 
    "activeTab" 

    ], 


    "content_scripts": [ 
    { 
     "matches": ["https://www.example.lv/*"], 
     "js": ["testevent.js"] 
    } 
    ], 

    "browser_action": { 
    "default_icon": "icon.png", 
    "default_title": "Mhmmm", 
    "default_popup": "popup.html" 
    }, 
    "manifest_version": 2 
} 

popup.html

<!doctype html> 
<html> 
<head> 
</head> 
<body> 
<div id='message'>Geting code</div> 
<script type="text/javascript" src="testevent.js"></script> 
</body> 
</html> 

內容腳本 testevent.js

window.addEventListener("MyCustomEvent", function (e) { 
    var check = e.detail.passback; 
    console.log(check); 
}); 


function click(b) { 
    chrome.tabs.executeScript(null, 
     {file: "eventer.js"}); 

} 
document.addEventListener('DOMContentLoaded', function() { 
    var divs = document.getElementById('message'); 
    divs.addEventListener('click', click); 

}); 

個eventer.js

var scr = document.createElement('script'); 
scr.textContent = '(' + function() { 
    var check = [console.log(D.nonce.name)]; //this is the function which I execute to get the desired values from it, right now it should get a Name. 
    var event = document.createEvent("CustomEvent"); 
    event.initCustomEvent("MyCustomEvent", true, true, {"passback":check}); 
    window.dispatchEvent(event); } + ')();'; 
(document.head || document.documentElement).appendChild(scr); 
scr.parentNode.removeChild(scr); 

回答

0
  1. 只有JSON-序列化的對象(如數字,字符串,數組,簡單{...}對象值)可以被傳遞到回調,而不是一個DOM元素。

  2. 當以交互方式在控制檯中鍵入代碼時,代碼將在頁面的上下文中運行,因此可以訪問頁面變量。在isolated world中運行的擴展程序的內容腳本不是這種情況。

  3. 通過<script>元素注入腳本到頁面本身是一個異步操作,這意味着內容腳本立即返回executeScript的回調與上一語句(document.body.appendChild在返回非序列化的價值碼)。

    您看到的控制檯日誌中的第一個可用值來自內部<script>注入的代碼,而不是回調。

有幾種解決方案:內注入代碼的

+0

謝謝你的答案。我知道這些方法,但我無法將代碼放在一起。查看[鏈接](https://stackoverflow.com/questions/21731635/chrome-extension-access-document-page-variable-from-extension)方法我仍然不能從事件監聽器獲取值。 –

+0

我編輯了原始問題。我無法弄清楚如何獲得用於擴展的值,例如,使用該值更改

Geting code
innerthtml。 –

+0

呃這是錯誤的...你想要注入頁面範圍的腳本('eventer.js')不是一個**內容腳本**,但呃......我們把它稱爲注入頁面腳本。所以你的*內容腳本*應該創建一個'