Имитация нажатия кнопки «Дополнительно» в новостной ленте 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="/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