2012-04-13 105 views
0

大家好。JS功能不再適用

我目前正在嘗試爲Chrome瀏覽器開發擴展程序,並遇到問題。

我的擴展工作,但集成的JS功能只適用於頁面加載或刷新時。 但是瀏覽時,當您返回到頁面或文本應該修改,在JS功能不再適用:哭:

下面是一個例子,以更好地解釋自己;) 功能是替換文本與其他文本:

manifest.json的:

{ 
    "content_scripts": [ { 
     "js": [ "content.js", "init.js" ], 
     "matches": [ "http://battlelog.battlefield.com/*" ], 
     "run_at": "document_end" 
    } ], 
    "name": "My Extension", 
    "author" : "Tesla", 
    "version": "1.0", 
    "description": "DESCRIPTION COMING !", 
    "key": "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALuyMQ/qwguwISXI8lDNIyQQyuQHQIqLRTekDDomL/UlEv2pWvUKtbnj3yMvNsXu/4KGzKZvcDmCD1W2mEXjk8vrm7rEt3AqXsWooSuqRlWJ3vqiB5/mtA+Hac2whiUSqylC5FJH6LbWNjYAAcHyVxif83GRWfxwPVHFiyQTt5hDAgMBAAECgYEAqYwNRZOKNYSkbL1YJiUn2SxSGily47Nqkxhc8yoLqCYVQY352+AQyBpPNjkwARwjMoUR2EZR2aDiuUp3wqoQllRzLHR61jjUtg+0X5RSgQlIbB/GFVns9/7DqXRBcY5RTmMQZ9H53UrIIfZ9fdwZyQ4yOAc2rv14YnwjjZlU/gECQQD6cjUJv7Ps891z2e0lHE2XALIdpaRa4Q5Isx6GairJKlzv722zK2/ftECE1VV+rElwtEw+teCRI7K8Cawx60iHAkEAv9u/9Fz7ZM7j5bgYSkZx043K+PT8yqNTQKtwpwSRDShje8iQkzW9HjLjxlC6qc8uN0sE+H48TaHslCJ/pQntZQJBAM8sDG3NFASuUoGUQ5TQTerc23qk3EmFJHDFIzojttMD5S9hy0hMZVYTYM/BPeD0mifOLcguYd8OPbtI8RW2QR8CQBb9UQIKBkGtHNfQ+HAmAsuzyOeOC6CIc5hjMquAu5TVCx6xCMnq/Y9Zz7tavxNL9SDBB4ZzMeyng364p4zyJJUCQG2GRV0BiZfcxhT7/YV+E+t037pV/NisdXomDgCbSBpkN/gls0wI/6MkhlrU6YmfaZ/hG2QtGs7VCKRJ8fI36Nw=", 
    "minimum_chrome_version": "14.0" 
} 

content.js:

var head = document.getElementsByTagName("head")[0]; 

var script = document.createElement('script'); 
script.type = 'text/javascript'; 
script.src = chrome.extension.getURL('main.js'); 
head.appendChild(script); 

var css = document.createElement('link'); 
css.type = 'text/css'; 
css.rel = 'stylesheet'; 
css.href = chrome.extension.getURL('main.css'); 
head.appendChild(css); 

main.js:

var modif = { 
    change: 'Text-Change' 
}; 

var original = { 
    change: /Leaderboards/gm, 
}; 

$(document).ready(function() { 
    $('.base-middle').each(function() { 
     var $p = $(this); 
     var html = $p.html(); 
      $p.html(html.replace(original.change, modif.change)); 
    }); 
}); 

功能必須編輯文本:

排行榜

文本更改

此頁上:http://battlelog.battlefield.com/bf3/leaderboard/

,而不必每次刷新頁面。

如果有人能幫助我嗎? 謝謝;) 特斯拉

編輯/ 我張貼了這個消息

+0

您遇到的問題是,該頁面AJAX驅動。因此,在加載頁面並單擊其中一個選項卡後,它不會重新加載頁面,但使用XMLHttpRequest獲取新頁面的內容並將其插入當前加載的頁面。如何處理這是我仍然不完全確定的事情。我正在爲你看看,但突然之間,鏈接正在變得404。 – PAEz 2012-04-13 15:52:57

+0

編輯/我發佈了此消息後的回覆 – Tesla 2012-04-14 05:54:48

回答

0

後的響應正如我在評論,你處理一個AJAX驅動頁,從使事情變得相當棘手的(任何意見提到任何人如何處理ajax網站肯定會受到讚賞)。
我在頁面中注意到的一件事是獲取頁面內容並將它們呈現給它執行的頁面Surface.Renderer.invokeUsedComponents因此,如果window.location等於您想要修改的URL,那麼您可以劫持該功能,然後重做您的修改。
如何劫持該功能看起來像一個簡單的例子....

(function(old){ 
Surface.Renderer.invokeUsedComponents = function(a){ 
    // Check window.location and if it matches then do something 
    alert(a); 
    old.apply(Surface.Renderer, arguments); 
} 
})(Surface.Renderer.invokeUsedComponents) 

要知道,我沒有做測試,堆和如果他們改變自己的API,它會使擴展....
祝您好運!

編輯
我忘了提,你將需要注入代碼到網頁並將其傳送回擴展。
繼承人一些代碼,應該工作(我沒有測試它,只是改裝成一些代碼,我已經)...

// http://code.google.com/chrome/extensions/content_scripts.html#host-page-communication 
var comDiv = document.createElement('div'); 
comDiv.setAttribute("id", "stateChangeDiv"); 
document.documentElement.appendChild(comDiv); 

script = function(old) { 
    // Create the event that the content script listens for 
    var stateChangeEvent = document.createEvent('Event'); 
    stateChangeEvent.initEvent('stateChangeEvent', true, true); 

    // overide the function that gets called after the page is updated 
    Surface.Renderer.invokeUsedComponents = function(a) { 

     var hiddenDiv = document.getElementById('stateChangeDiv'); 
     hiddenDiv.dispatchEvent(stateChangeEvent); 
     //console.debug(c); 
     old.apply(Surface.Renderer, arguments); 
    } 

} 

function override(fn) { 
    var script = document.createElement('script'); 
    script.setAttribute("type", "application/javascript"); 
    script.textContent = '(' + fn + ')(Surface.Renderer.invokeUsedComponents);'; 
    document.documentElement.appendChild(script); // run the script 
    document.documentElement.removeChild(script); // clean up 
} 

override(script); 

document.getElementById('stateChangeDiv').addEventListener('stateChangeEvent', function() { 
// This will get executed everytime Surface.Renderer.invokeUsedComponents does on the page 
    alert('page updated, check your window.location and do something'); 

}); 
+0

編輯/我發佈了此消息後的回覆 – Tesla 2012-04-14 05:55:14