几个问题:
这是一个无效的匹配模式,因为它们只指定了 URL路径(之前的部分?
)。
更改matches
为:
"matches": ["https://groups.google.com/forum/*"],
整体 URL ( https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussions
) 不实用,因为 Google 会随意更改 URL 参数。例如,fromgroups
不经常出现,并且可能没有=
如果它存在。附加参数,例如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 添加的,并且不会立即在“新”页面上可用。在 a 中检查此元素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
);
}