1

我正在尝试创建一个 GreaseMonkey 脚本,该脚本会自动扩展 GitHub 新闻源中的警报列表,但这不起作用。

这是我的代码(灵感来自这篇文章):

var moreLink = $("a:contains('More')");
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
moreLink[0].dispatchEvent(evt);

但是,它不会像手动单击它时那样扩展警报列表,它只会打开链接指向的页面(https://github.com/organizations/my_organization?page=2

我怎样才能做到这一点?

编辑:这是链接的 HTML 源代码,看起来没有与之关联的 javascript 或 onClick 事件:

<a href="/organizations/my_organization?page=2">More</a>

编辑2:这是我完整的greasemonkey脚本:

// ==UserScript==
// @name        test
// @namespace   test
// @description test
// @include     https://github.com
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js
// @version     1
// ==/UserScript==

var moreLink = $("#dashboard div.news div.pagination a:contains('More')");
var evt = document.createEvent("MouseEvents");
evt.initEvent("click", true, true);
moreLink[0].dispatchEvent(evt);
//alert($(".alert").length);
4

1 回答 1

1

您的代码非常适合我——登录后在主页上。虽然我建议您使用更具体的选择器,以避免误报。

例如,使用:

var moreLink = $("#dashboard div.news div.pagination a:contains('More')");

  • 您使用的是哪个版本的 Firefox 和 Greasemonkey?
  • NoScript、Adblock 或类似软件是否正在运行?
  • 您说该链接似乎没有 javascript 或 onClick 事件...您是如何检查的?Firebug 在该节点上显示了几个事件侦听器。
  • CtlShiftJ除了 GitHub 生成的无数 CSS 警告之外,Firefox 的错误控制台 ( ) 中还会出现哪些错误?
  • 您的脚本是否对页面做其他事情?特别是添加或删除内容或使用innerHTML?如果是这样,请发布或链接到完整的脚本。

更新新信息:

  1. 在更多环境的进一步测试中,现在似乎 GitHub 的分页并不总是在 Greasemonkey 脚本触发时初始化。要解决这个问题,请使用waitForKeyElements() 实用程序并在尝试单击链接之前检查分页引擎是否准备就绪。见下文。

  2. Greasemonkey 0.9.19 是错误的,因为所有的退出 - 因此它只活跃了几天。转到Greasemonkey 版本历史页面安装 0.9.20 或 0.9.18 版本。

  3. @include指令可能不会在您需要时触发。它至少需要:

    // @include https://github.com/
    

    // @include https://github.com/*
    

    可能会更好,并且选择器足够具体,以至于更广泛的包含应该不会造成伤害。

  4. 升级到 jQuery 版本 1.7.2——我们已经广泛使用它,没有任何问题。(1.5.1 可能不是问题,但最好消除该变量。)


将所有这些放在一起,以下脚本适用于我,来自各种(Windows)环境。我留下了大部分调试代码,以防万一......

// ==UserScript==
// @name        _GitHub "news" item auto-paging
// @namespace   _pc
// @include     https://github.com/
// @require     http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js
// @require     https://gist.github.com/raw/2625891/waitForKeyElements.js
// ==/UserScript==

if (typeof unsafeWindow.console.clear != 'undefined') {
    unsafeWindow.console.clear ();
}
unsafeWindow.console.log ("Start...");  //-- Does not require Firebug.

waitForKeyElements (
    "#dashboard div.news div.pagination a:contains('More')",
    clickAjaxMoreLink,
    true    //-- Stop on first successful click.
);

function clickAjaxMoreLink (jNode) {
    this.numRuns    = this.numRuns || 1;

    unsafeWindow.console.log (
        "moreLink:", jNode,
        " | Parent classes:", jNode.parent ().attr ("class"),
        " | Run:", this.numRuns
    );
    this.numRuns++;
    /*--- COMMENT THIS NEXT CHECK OUT, if waitForKeyElements is set to
        continually click via clickAjaxMoreLink. (The last param is false.)
    */
    if (this.numRuns > 25) {
        unsafeWindow.console.log ("*** Excessive runcount, abort! ***");
        return false;
    }

    if (jNode.parent ().hasClass ("loading") ) {
        return true;    //-- Cancel the "found" status.
    }
    var unsfJQ_Body = unsafeWindow.$(document.body);
    if (    ! unsfJQ_Body
        ||  ! unsfJQ_Body.length
        ||  document.readyState != "complete"   //-- Order is important here
        ||  (typeof unsfJQ_Body.pageUpdate) != "function"
    ) {
        return true;
    }

    unsafeWindow.console.log ("Num news items, start:", $(".alert").length);

    setTimeout ( function () {
        unsafeWindow.console.log (
            "Num news items, after AJAX delay:", $(".alert").length
        );
    }, 2333);

    var evt = document.createEvent ("MouseEvents");
    evt.initEvent ("click", true, true);
    jNode[0].dispatchEvent (evt);

    return false;
}

unsafeWindow.console.log ("Setup complete...");
于 2012-05-17T06:29:29.310 回答