0

こんにちは、みんな。

現在、Chrome ブラウザーの拡張機能を開発しようとしていますが、問題が発生しています。

私の拡張機能は機能しますが、統合されているJS関数はページの読み込み時または更新時にしか機能しません。しかし、ブラウジング時に、ページに戻ったり、テキストを修正する必要がある場合、JS関数は適用されなくなります。

これは、自分自身をよりよく説明するための例です;) 機能は、テキストを別のテキストに置き換えることです:

マニフェスト.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/

毎回ページを更新する必要はありません。

誰かが私を助けることができますか?ありがとう ;) テスラ

編集/ このメッセージの後に返信を投稿しました

4

1 に答える 1

0

コメントで述べたように、AJAX 駆動のページを扱っているため、物事がややこしくなります (Ajax サイトの扱い方について、誰かからのアドバイスをいただければ幸いです)。
そのページで気づいたことの 1 つは、ページのコンテンツを取得し、実行するページにレンダリングした後です。そのSurface.Renderer.invokeUsedComponentsため、window.location が mod を適用する URL と等しい場合、その関数をハイジャックして mod をやり直すことができます。
その関数をハイジャックする方法の簡単な例は次のようになります....

(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');

});
于 2012-04-13T16:30:43.233 に答える