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”开头。这是否意味着您不能将 javascript 注入其 URL 不以“www”开头的安全页面,还是有其他方法?这在过去从来都不是问题,因为我的扩展使用版本 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. 整体 URL ( https://groups.google.com/forum/?fromgroups=#!newtopic/opencomments-site-discussions) 不实用,因为 Google 会随意更改 URL 参数。例如,fromgroups不经常出现,并且可能没有=如果它存在。附加参数,例如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 添加的,并且不会立即在“新”页面上可用。在 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
    );
}
于 2012-11-25T22:21:41.750 回答