いくつかの問題:
これは、URLパス(の前の部分)までしか指定されていないため、無効な一致パターンです。?
次のように変更matches
します。
"matches": ["https://groups.google.com/forum/*"],
https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussions
GoogleはURLパラメータを意地悪に変更するため、全体的なURL( )は実用的ではありません。たとえば、fromgroups
は存在しないことが多く、存在する場合は存在しない可能性があり=
ます。comeandgoなどの追加パラメーターhl=en
。(これが、私の以前の回答が私には有効でしたが、あなたには有効ではなかった理由です。)
したがって、include_globs
マニフェストで使用することは、厄介でエラーが発生しやすい演習になります。解決策は、コンテンツスクリプト内
をチェックすることです。location.hash
スクリプトはに設定されて"run_at": "document_start"
いるため、IDを持つノードが存在する前にコンテンツスクリプトが実行されますp-s-0
。
マニフェストをに変更し"run_at": "document_end"
ます。
新しいGoogleグループはAJAX主導型です。したがって、「新しいトピック」ページは通常、まったく新しいページを実際にロードすることなく「ロード」されます。これは、コンテンツスクリプトが再実行されないことを意味します。「新しい」AJAXがロードされたページを監視する必要があります。
イベントを監視して、hashchange
「新しい」ページを確認します。
さらに、この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
);
}