Simular click el button "Más" de suministro de noticias de GitHub en JavaScript no funciona

Intento crear un script de GreaseMonkey que extienda automáticamente la list de alertas en el suministro de noticias de GitHub, pero eso no funciona.

Aquí está mi código (inspirado de esta publicación):

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

Pero en lugar de gastar la list de alertas como lo hace cuando hace clic manualmente en ella, simplemente abre la página que también señala el enlace ( https://github.com/organizations/my_organization?page=2 )

¿Cómo puedo hacer esto?

Editar: Aquí está el código fuente HTML del enlace, parece que no hay javascript o evento onClick asociado a él:

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

Edición 2: Aquí está mi script completo de 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); 

Tu código funciona perfectamente para mí, en la página principal, cuando inicias session. Aunque te recomendaría que uses un selector más específico, para evitar falsos positivos.

Por ejemplo, use:

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

  • ¿Qué versión de Firefox y Greasemonkey estás usando?
  • ¿Se ejecuta NoScript, Adblock o similar?
  • Usted dice que parece que no hay javascript ni evento onClick asociados con el enlace … ¿Cómo lo verificó? Firebug muestra varios oyentes de events en ese nodo.
  • ¿Qué errores aparecen en la console de error de Firefox ( Ctl Shift J ), además de los trucos de advertencia de CSS que genera GitHub?
  • ¿Su script está haciendo algo más en la página? Especialmente agregar o eliminar contenido o usar innerHTML ? Si es así, publique o vincule al guión completo.

Actualización para nueva información:

  1. En posteriores testings, desde más entornos, ahora parece como si la pagination de GitHub no siempre se inicializara en el momento en que se inicia el script de Greasemonkey. Para evitarlo , use la utilidad waitForKeyElements () y verifique la disponibilidad del motor de pagination antes de intentar hacer clic en el enlace. Vea abajo.

  2. Greasemonkey 0.9.19 tenía errores al salir, por lo que solo estuvo activo durante unos días. Vaya a la página de historial de versiones de Greasemonkey e instale la versión 0.9.20 o la versión 0.9.18.

  3. Es posible que la directiva @include no se active cuando lo desee. Tiene que ser al less:

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

    Pero

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

    podría ser mejor, y el selector es lo suficientemente específico para que una inclusión más amplia no cause ningún daño.

  4. Avance a la versión 1.7.2 de jQuery: lo hemos usado extensamente sin problemas. (1.5.1 probablemente no sea el problema, pero lo mejor es eliminar esa variable).

Poniendo todo junto, la siguiente secuencia de commands funciona para mí, desde una variedad de entornos (Windows). Dejé la mayoría del código de debugging, por si acaso …

 // ==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...");