1

GitHubのニュースフィードのアラートのリストを自動的に拡張するGreaseMonkeyスクリプトを作成しようとしていますが、機能しません。

これが私のコードです(この投稿からインスピレーションを得ています):

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

ログインしたときのメインページで、あなたのコードは私にとって完璧に機能します。ただし、誤検知を避けるために、より具体的なセレクターを使用することをお勧めします。

EG、使用:

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

  • Firefox と Greasemonkey のどのバージョンを使用していますか?
  • NoScript、Adblock、または同様のものが実行されていますか?
  • リンクに関連付けられたjavascriptまたはonClickイベントがないように見えるとのことですが...どうやって確認しましたか? Firebug は、そのノードにいくつかのイベント リスナーを表示します。
  • CtlShiftJGitHub が生成する無数の CSS 警告以外に、Firefox のエラー コンソール ( ) に表示されるエラーは何ですか?
  • あなたのスクリプトはページに対して何か他のことをしていますか? 特に、コンテンツの追加または削除、またはinnerHTML? その場合は、スクリプト全体を投稿またはリンクしてください。

新しい情報の更新:

  1. さらなるテストでは、より多くの環境から、Greasemonkey スクリプトが起動するまでに GitHub のページネーションが常に初期化されていないように見えるようになりました。これを回避するには、リンクをクリックする前に、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 に答える