2

この問題は、JavaScriptを挿入するページのURLが。で始まる限り、ある程度解決されたようですwww。そうでない場合はどうしますか?これが私のマニフェストの関連部分です:

"content_scripts": [
  {
  "run_at": "document_start",
  "matches": ["https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussions"],
  "js": ["postMsg.js"]
  }
],

別のstackoverflowの投稿によると、問題はページのURLが「www」で始まらないためです。これは、URLが「www」で始まらない安全なページにJavaScriptを挿入できないことを意味しますか、それとも別の方法がありますか?私の拡張機能はバージョン1のマニフェストで実行されていたため、これは過去に問題になることはありませんでした。

コンテンツスクリプトを追加するのを忘れました:

var subject = document.getElementById("p-s-0");

subject.setAttribute("value", "foo");   

IDが「ps-0」の要素はGoogleグループの投稿ページの件名フィールドであるため、フィールドには「foo」と表示されます。

4

1 に答える 1

0

いくつかの問題:

  1. これは、URLパス(の前の部分)までしか指定されていないため、無効な一致パターンです。?

    次のように変更matchesします。

    "matches": ["https://groups.google.com/forum/*"],
    


  2. https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussionsGoogleはURLパラメータを意地悪に変更するため、全体的なURL( )は実用的ではありません。たとえば、fromgroupsは存在しないことが多く、存在する場合は存在しない可能性があり=ます。comeandgoなどの追加パラメーターhl=en。(これが、私の以前の回答が私には有効でしたが、あなたには有効ではなかった理由です。)

    したがって、include_globsマニフェストで使用することは、厄介でエラーが発生しやすい演習になります。解決策は、コンテンツスクリプト内
    をチェックすることです。location.hash

  3. スクリプトはに設定されて"run_at": "document_start"いるため、IDを持つノードが存在する前にコンテンツスクリプトが実行されますp-s-0

    マニフェストをに変更し"run_at": "document_end"ます。

  4. 新しいGoogleグループはAJAX主導型です。したがって、「新しいトピック」ページは通常、まったく新しいページを実際にロードすることなく「ロード」されます。これは、コンテンツスクリプトが再実行されないことを意味します。「新しい」AJAXがロードされたページを監視する必要があります。

    イベントを監視して、hashchange「新しい」ページを確認します。

  5. さらに、このp-s-0要素はAJAXによって追加され、「新しい」ページですぐに利用できるわけではありません。内のこの要素を確認してくださいsetInterval


すべてをまとめると、
manifest.jsonは次のようになります。

{
    "manifest_version": 2,
    "content_scripts": [ {
        "run_at":           "document_end",
        "js":               [ "postMsg.js" ],
        "matches":          [ "https://groups.google.com/forum/*" ]
    } ],
    "description":  "Fills in subject when posting a new topic in select google groups",
    "name":         "Google groups, Topic-subject filler",
    "version":      "1"
}


コンテンツスクリプト(postMsg.js)は次 のようになります。

fireOnNewTopic ();  // Initial run on cold start or full reload.

window.addEventListener ("hashchange", fireOnNewTopic,  false);

function fireOnNewTopic () {
    /*-- For the pages we want, location.hash will contain values
        like: "#!newtopic/{group title}"
    */
    if (location.hash) {
        var locHashParts    = location.hash.split ('/');
        if (locHashParts.length > 1  &&  locHashParts[0] == '#!newtopic') {
            var subjectStr  = '';
            switch (locHashParts[1]) {
                case 'opencomments-site-discussions':
                    subjectStr  = 'Site discussion truth';
                    break;
                case 'greasemonkey-users':
                    subjectStr  = 'GM wisdom';
                    break;
                default:
                    break;
            }

            if (subjectStr) {
                runPayloadCode (subjectStr);
            }
        }
    }
}

function runPayloadCode (subjectStr) {
    var targetID        = 'p-s-0'
    var failsafeCount   = 0;
    var subjectInpTimer = setInterval ( function() {
            var subject = document.getElementById (targetID);
            if (subject) {
                clearInterval (subjectInpTimer);
                subject.setAttribute ("value", subjectStr);
            }
            else {
                failsafeCount++;
                //console.log ("failsafeCount: ", failsafeCount);
                if (failsafeCount > 300) {
                    clearInterval (subjectInpTimer);
                    alert ('Node id ' + targetID + ' not found!');
                }
            }
        },
        200
    );
}
于 2012-11-25T22:21:41.750 に答える