Симулирайте щракване върху новинарския канал на GitHub, бутонът Още в JavaScript не работи

Опитвам се да създам скрипт 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="/bg/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);

person nbarraille    schedule 16.05.2012    source източник
comment
Не е ясно какво имате предвид под новинарския канал на GitHub. Връзка към конкретна страница или RSS емисия. Трябва ли да сте влезли, за да го видите?   -  person Brock Adams    schedule 17.05.2012
comment
Да, трябва да сте влезли, за да го видите. Това е страницата, която виждате на адрес https://github.com, когато сте влезли със списъка с всички най-нови актуализации на хранилищата, които гледате.   -  person nbarraille    schedule 17.05.2012


Отговори (1)


Вашият код работи идеално за мен -- на главната страница, когато сте влезли. Въпреки че бих ви препоръчал да използвате по-конкретен селектор, за да избегнете фалшиви положителни резултати.

ПР., използвайте:

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

  • Каква версия на Firefox и Greasemonkey използвате?
  • Работи ли NoScript, Adblock или подобен?
  • Казвате, че изглежда, че няма javascript или onClick събитие, свързано с връзката... Как проверихте? Firebug показва няколко слушатели на събития на този възел.
  • Какви грешки се появяват в конзолата за грешки на Firefox (CtlShiftJ), освен милионите CSS предупреждения, които GitHub генерира?
  • Вашият скрипт прави ли нещо друго със страницата? Особено добавяне или изтриване на съдържание или използване на 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...");
person Brock Adams    schedule 17.05.2012
comment
Актуализирах оригиналната публикация с пълния скрипт. Работя с Firefox 12 с Greasemonkey 0.9.19. В конзолата на Firefox не се появяват грешки, а само CSS предупреждения. Когато стартирам този скрипт, той просто зарежда https://github.com/dashboard/index/2 (което е абсолютно същата страница) - person nbarraille; 17.05.2012
comment
Добре, вижте актуализирания отговор -- който отчита условията на състезание и закъсненията на AJAX (все пак в моите тестове). - person Brock Adams; 18.05.2012
comment
Благодаря ви за помощта, това беше проблемът! Имам обаче още един въпрос: Как мога да получа достъп до новите div елементи, които бяха добавени? $("#dashboard div.news div.alert").length все още връща 30 дори след кликване - person nbarraille; 18.05.2012
comment
Моля, пренебрегнете предишния ми въпрос, аз се сблъсках със същия проблем... (данните все още не бяха заредени). Благодаря за вашата помощ. - person nbarraille; 19.05.2012