2011-04-24 14 views
5

Me gustaría preguntar si es posible crear una secuencia de comandos de Chrome o Greasemonkey que podría abrir todas las ventanas emergentes en la cola. Hasta ahora tengo 2 scripts separados para esto, pero eso no funciona bien ya que los pop-ups tienen una función anti-spam que no permite demasiados al mismo tiempo.jQuery cola en Chrome userscript con ventanas emergentes?

Lo que me gustaría hacer es procesar un conjunto de enlaces emergentes en forma de cola y solo abrir el siguiente cuando el anterior está cerrado. No tengo expirience cuando se trata de colas y cualquier tipo de enlace de eventos.

para que los recursos que tengo:

1) matriz de enlaces ya preparado

var URL_Array = []; 

$('form[name="form_gallery"] .img img').each(function(i,e){ 
    // Format URL array here 
    if($(this).closest('.object').children('.phs_voted_count').length == 0){ 
     var string = e.src; 
     var nowBrake = string.substring(string.length-7,7); 
     var splited = nowBrake.split('/'); 
     var urlStr = '/window/friend/gallery_view/'+splited[3]+'/'+splited[4]+'.html'; 
     URL_Array[i] = urlStr; 
    } 
}); 

2) Script que vota en la imagen en la ventana emergente

/*######################################################*/ 
    var voteBy   = '#vte_mark_12';   // Prefered vote icon 
    var voteDefault  = '#vte_mark_5';    // Default vote icon 
    var voteFormLoc  = 'image_voting';   // Image voting popups form 
    var buyExtraVote  = 'image_voting_buy';  // If run out of votes buy more 
    var captchaLoc  = 'input[name="captcha"]'; // Captcha input field 
    var captchaTxt  = 'Enter captcha text!';  // Captcha alert text 
    var simpatyFormId  = '#sym_send';    // Simpaty window form 

    var startScript   = true; 
    var formProcessedAlready = false; // Used to check if image already was voted 
    /*######################################################*/ 

$(function(){ 
    if(startScript){ 
     if($(captchaLoc).length > 0){ 
      alert(captchaTxt); 
      $(captchaLoc).focus().css('border', '2px solid red'); 
      return false; 
     }else{ 
      if($('#50').length > 0){ 
       $('#50').attr('checked', true); 
       $('form').attr('id', buyExtraVote); 
       $('#'+buyExtraVote).submit(); 
      }else{ 
       $('form').attr('id', voteFormLoc); 
       if($(voteBy).length > 0){ 
        $(voteBy).attr('checked', true); 
        setTimeout("$('#"+voteFormLoc+"').submit()", 2000); 
       }else if($(voteDefault).length > 0){ 
        $(voteDefault).attr('checked', true); 
        setTimeout("$('#"+voteFormLoc+"').submit()", 2000); 
       }else{ 
        // If we have simpaty box autocast submit 
        if($(simpatyFormId).length > 0){ 
         if($(captchaLoc).length > 0){ 
          alert(captchaTxt); 
          $(captchaLoc).focus().css('border', '2px solid red'); 
          return false; 
         }else{ 
          $(simpatyFormId).submit(); 
          formProcessedAlready = true; 
         } 
        }else{ 
         formProcessedAlready = true; 
        } 
       } 
      } 
     } 

     if(formProcessedAlready){ 
      self.close(); 
     } 
    } 
}); 

Por lo que yo puedo entenderlo debería ir así:
1) Obtener todos los urls no votados y formar matriz (hecho)
2) cola todas las ventanas emergentes para abrir
3) Iniciar la primera popup
4) Votación hecho y emergente cierra (hecho)
5) Iniciar segundo elemento emergente
6) Cuando conjunto de conmutadores terminado a la página siguiente (hecho)

¿Qué te parece?

+1

me hace mejor que una ventana emergente, por lo que cualquier programa antivirus willn't bloquearlo. Inicie la primera ventana emergente -> La votación se ha completado y la ventana emergente se actualiza con la nueva forma -> ... –

+0

Estoy listo para cualquier solución, una o nueva cada vez. Seré la única persona que usará esto para no tener que preocuparme por ningún bloqueo. – arma

Respuesta

2
  • ¿Cuáles son la dirección URL exacta de la página principal (s), así como de las ventanas emergentes?
  • ¿Qué versión de jQuery está usando y cómo lo está incluyendo?

Las URL exactas son importantes porque la secuencia de comandos necesita manejar tanto las páginas principales como las ventanas emergentes y operar de manera diferente en cada una.

Sus dos formas principales de manejar esto. O bien:

  1. Uso include directrices para asegurarse de que el script se ejecuta tanto en la página principal y la ventana emergente, pero cambia su comportamiento en función del tipo de página. Esto tendrá dos instancias diferentes de la secuencia de comandos ejecutándose simultáneamente, lo cual no es un problema.

  2. Uso include y posiblemente exclude directivas para asegurar que el guión sólo se ejecuta en la página principal. Luego haga que el código de apertura de ventanas manipule el formulario.


Aquí es cómo hacerlo enfoque 1:

(1) Supongamos que las principales páginas fueron como:
somewhere.com/main/*
y el popup páginas eran como:
somewhere.com/window/friend/gallery_view/*
Asegúrese las directivas de inclusión del guión se activan en ambos conjuntos de páginas.

(2) Asegúrese de que jQuery esté disponible en ambos tipos de páginas. jQuery 1.5.1 es recomendado. jQuery 1.3.2 probablemente no funcionará para el siguiente código.

(3) Luego código como el siguiente debería funcionar:

var URL_Array = []; 
var PopupQueue = $({}); //-- jQuery on an empty object - a perfect queue holder 

//--- Is this a popup window or the main page? 

if (/\/window\/friend\/gallery_view\//i.test (window.location.href)) 
{ 
    //--- This is a popup page 

    /*######################################################*/ 
    var voteBy   = '#vte_mark_12';   // Prefered vote icon 
    var voteDefault  = '#vte_mark_5';    // Default vote icon 
    var voteFormLoc  = 'image_voting';   // Image voting popups form 
    var buyExtraVote  = 'image_voting_buy';  // If run out of votes buy more 
    var captchaLoc  = 'input[name="captcha"]'; // Captcha input field 
    var captchaTxt  = 'Enter captcha text!';  // Captcha alert text 
    var simpatyFormId  = '#sym_send';    // Simpaty window form 

    var startScript   = true; 
    var formProcessedAlready = false; // Used to check if image already was voted 
    /*######################################################*/ 

    $(function(){ 
     if(startScript){ 
      if($(captchaLoc).length > 0){ 
       alert(captchaTxt); 
       $(captchaLoc).focus().css('border', '2px solid red'); 
       return false; 
      }else{ 
       if($('#50').length > 0){ 
        $('#50').attr('checked', true); 
        $('form').attr('id', buyExtraVote); 
        $('#'+buyExtraVote).submit(); 
       }else{ 
        $('form').attr('id', voteFormLoc); 
        if($(voteBy).length > 0){ 
         $(voteBy).attr('checked', true); 
         setTimeout("$('#"+voteFormLoc+"').submit()", 2000); 
        }else if($(voteDefault).length > 0){ 
         $(voteDefault).attr('checked', true); 
         setTimeout("$('#"+voteFormLoc+"').submit()", 2000); 
        }else{ 
         // If we have simpaty box autocast submit 
         if($(simpatyFormId).length > 0){ 
          if($(captchaLoc).length > 0){ 
           alert(captchaTxt); 
           $(captchaLoc).focus().css('border', '2px solid red'); 
           return false; 
          }else{ 
           $(simpatyFormId).submit(); 
           formProcessedAlready = true; 
          } 
         }else{ 
          formProcessedAlready = true; 
         } 
        } 
       } 
      } 

      if(formProcessedAlready){ 
       self.close(); 
      } 
     } 
    }); 
} 
else 
{ //--- This is a main page 

    $('form[name="form_gallery"] .img img').each(function(i,e){ 
     // Format URL array here 
     if($(this).closest('.object').children('.phs_voted_count').length == 0){ 
      var string = e.src; 
      var nowBrake = string.substring(string.length-7,7); 
      var splited = nowBrake.split('/'); 
      var urlStr = '/window/friend/gallery_view/'+splited[3]+'/'+splited[4]+'.html'; 
      URL_Array[i] = urlStr; 
     } 
    }); 

    //--- Load up the queue. 
    $.each (URL_Array, function (PopupNum, PopupURL) { 

     PopupQueue.queue ('Popups', function (NextQ_Item) { 

      OpenPopupFromQueue (NextQ_Item, PopupNum+1, PopupURL); 
     }); 
    }); 

    //--- Launch the Popups, one at a time. 
    PopupQueue.dequeue ('Popups'); 
} 


function OpenPopupFromQueue (NextQ_Item, PopupNum, PopupURL) 
{ 
    var PopupWin = window.open (PopupURL, "_blank"); 
    if (!PopupWin) 
    { 
     console.log ('Bad URL ' + PopupURL) 
     setTimeout (function() { NextQ_Item(); }, 2003); 
     return; 
    } 

    /*--- Only after the popup has loaded can we do any processing. 
    */ 
    PopupWin.addEventListener (
     "load", 
     function() { 
      /*--- Setup the listener for when the popup has closed. 
       We fire the next popup from the queue, there. 
      */ 
      PopupWin.addEventListener (
       "unload", 
       function() { 
        PopupClosed (NextQ_Item); 
       }, 
       false 
      ); 

      /*--- We could process the popup here, but it's better to let another instance of this 
       script do it, instead. 
      */ 
     }, 
     false 
    ); 
} 


function PopupClosed (NextQ_Item) 
{ 
    //--- Launch the next popup from the queue. 
    NextQ_Item(); 
} 
+0

Ah, Brock hola. Sí, su script se veía bien, pero en Chrome simplemente obtengo 'UnEught TypeError: no se puede llamar al método 'addEventListener' de undefined'. Y uso la versión 1.5.2 ahora y la tengo pegada en mi script. URL de páginas principales: 'http: // friends.example.com/friend/28r6afk4bf/gallery/3044094.html' y la comparo con' http://friends.example.com/friend/*/gallery/* 'y popup es:' http: // friends.example.com/window/friend/gallery_view/28r6afk4bf/a4w01kb3i0bg.html' también coincido con 'http: // friends.boomtime.lv/window/friend/*' – arma

+0

Ok, modifiqué el código. No debería error en URLs incorrectas ahora. El guión se veía bien pero luego tenía errores? ¿Eso significa que funcionó en Firefox? ¿O funcionó durante algunas ventanas emergentes y luego tuvo errores? Mis pruebas funcionan, no puedo depurar más sin conocer la página de destino real. –

+0

Ahora hace 1 ventana emergente y escupe en la consola 'URL mala/window/friend/gallery_view/28r6afk4bf/cxa4w065bnz1bg.html'. ¿A qué te refieres con la página de destino? – arma

2

Se podría hacer algo como:

var links = get_your_links(); 
function process_one() { 
    if(links.length > 0) { 
     show_popup(links.pop(), process_one); 
    } 
} 
function show_popup(link, callback) { 
    var popup = window.open(link, "mywindow", "width=100,height=100"); 
    $(popup).bind("beforeunload", function() { 
    process_one(); 
    return true; 
    }) 

} 

espero que ayude ...

+0

todo se ve bien y lo tengo funcionando para la primera ventana emergente, pero otras ventanas emergentes no se procesan. Eso probablemente porque '$ (ventana) .bind' ya que vincula la ventana actual que no es ventana emergente sino página principal. Necesito presionar Actualizar para que otros sean procesados. ¿Cómo lo vincula como '$ (popup) .bind'? – arma

+0

Tiene razón, fue un error, actualizó la respuesta. – iwiznia

+0

Aún se ejecuta solo la primera vez que se carga la página. Parece que está perdiendo ventanas emergentes y no puede detectar ningún evento. Tengo '// @ coincidencia' para la página principal y la dirección emergente en el script. – arma

Cuestiones relacionadas