Comment ouvrir le popup en boucle et exécuter le rappel en conséquence pour renvoyer l'état? (Script Greasemonkey)

Je ne pourrais pas formuler un titre approprié pour ces questions, donc je vais décrire l'idée / le problème ici.

Donc, j'ai actuellement 2 scripts pour une tâche:

Premier script: supprime toutes les images sur un site Web spécifique et si elles n'ont pas été votées avant d'ouvrir le popup de vote fourni par le portail (maximum 20 images à l'heure).

Deuxième script: Définit le vote pour l'image et le formulaire de soumission, après la présentation des formulaires, ferme le popup.

Le problème ici est que, après un certain temps, la fenêtre contextuelle définit le champ captcha pour éviter ce genre de choses :). Donc, la vraie question est: puis-je combiner deux scripts en un seul et dans ma boucle, attendez que le popup s'ouvre et vérifie si le champ captcha est là? Je pourrais alors arrêter la boucle et dire à l'utilisateur d'entrer manuellement le captcha et de recharger la page après cela. Le script actuel (ofc) va simplement s'exécuter et ouvrir des fenêtres contextuelles (comment puis-je attendre en boucle pour ouvrir et charger DOM)?

Bah, vraiment difficile à expliquer, s'il vous plaît, dites-moi si vous avez besoin de plus d'informations.

EDIT: Ok, changeons-le: comment ouvrir le popup en boucle et attendre le rappel à partir du script contextuel et seulement alors, selon l'état de retour, procédez?

Tous les scripts GM:

// ==UserScript== // @name Open image popups and vote // @namespace Popuopener // @description Open image popups and vote // @include http://example.com/friend/* // @include http://example.com/window/friend/* // @require http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js // ==/UserScript== // Loop options var start_Script = true; var loop = 0; // Photo rating options var formProcessedAlready = false; if(start_Script){ $('form[name="form_gallery"] .img img').each(function(i,e){ 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'; wondows = window_open(urlStr, 700, 630); if(wondows.getElementById("vte_mark_5")){ // Trows me with wondows.getElementById is not a function alert("Popup loaded"); // Does not getting so far }else if(wondows.getElementsByName("captcha")[0]){ alert("Captcha inside"); return false; } if($('input[name="captcha"]').length > 0){ alert('Enter captcha then (F5)!'); return false; }else{ if($('#vte_mark_5').length > 0){ $('#vte_mark_5').attr('checked', true); $('form[name="popup_form"]').submit(); }else{ formProcessedAlready = true; } if(formProcessedAlready){ window.close(); } } }else{ loop++; } alert("End"); } } function window_open(url, width, height, name, scroll_bar, location){ _top = Math.ceil((screen.height - height)/2); _left = Math.ceil((screen.width - width)/2); if(scroll_bar != true){ var scroll = 'no'; }else{ var scroll = 'yes'; } if(typeof location != "undefined" && location == true){ var location = 'yes'; }else{ var location = 'no'; } if(name == undefined){ name = Math.round(999999 * Math.random()); } return window.open(url, name , 'width=' + width + ',height=' + height + ',location='+ location +',status=no,toolbar=no,menubar=no,resizable=yes,scrollbars=' + scroll + ',top=' + _top + ',left=' + _left); } 

Les fenêtres contextuelles se chargent et se ferment de manière asynchrone, de sorte que des choses comme " wondows.getElementById("vte_mark_5") " ne fonctionneront pas tout de suite. Vous devez attendre l'événement de chargement du popup.

Dans Greasemonkey, vous utiliserez quelque chose comme: PopupWin.addEventListener("load",...) (Quelle est la meilleure pratique de toute façon, contre onload=... )

De même, une boucle ordinaire ouvrirait toutes les fenêtres contextuelles à la fois. Pour ouvrir les popups séquentiellement, utilisez une file d'attente. Puisque vous utilisez déjà jQuery, passez à la version 1.5.1 pour utiliser les fonctions de file d'attente de jQuery .
Notez que Greasemonkey fonctionne avec jQuery 1.5.1 à partir de la version GM 0.9.

~~~
Supposons que vous disposiez d'un éventail d'URL contextuelles …

 var URL_Array = [ "http://jsbin.com/omuvu5/#111", "http://jsbin.com/omuvu5/#222", "http://jsbin.com/omuvu5/#333" ]; 

Ensuite, vous pouvez établir une file d'attente avec:

 var PopupQueue = $({}); //-- jQuery on an empty object - a perfect queue holder //--- Load up the queue. $.each (URL_Array, function (PopupNum, PopupURL) { PopupQueue.queue ('Popups', function (NextQ_Item) { OpenPopupFromQueue (NextQ_Item, PopupNum+1, PopupURL); } ); } ); 

OpenPopupFromQueue ouvre une fenêtre contextuelle et configure les gestionnaires d'événements ouverts et fermés …

 function OpenPopupFromQueue (NextQ_Item, PopupNum, PopupURL) { var PopupWin = window.open (PopupURL, "_blank"); /*--- Only after the popup has loaded can we do any processing. See PopupMain() for examples of manipulation via jQuery. */ 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 ); //--- Now process the popup, as desired. PopupMain (PopupWin, PopupNum); }, false ); } 

Le gestionnaire d'événements de charge montre comment manipuler la fenêtre contextuelle à l'aide des jQuery de la page principale (GM) …

 function PopupMain (PopupWin, PopupNum) { //--- This manipulates the main window. $("#PopupStatus").append ("<li>Popup Loaded.</li>"); //--- This manipulates the popup window. $("#PayloadTarget", PopupWin.document).prepend ('<h3>This is popup number: ' + PopupNum + '.</h3>'); } 

Le gestionnaire d'événements proches doit déclencher l'élément suivant dans la file d'attente …

 function PopupClosed (NextQ_Item) { NextQ_Item (); } 

Enfin, vous lancez la file d'attente avec:

 PopupQueue.dequeue ('Popups'); 

Vous pouvez voir une démo qui rassemble tout cela sur jsBin.com .

Cela équivaut à spam OO Mais ehh, été là.

 wnd=window_open('etc'); if(wnd.getElementById('recaptcha_response_field')){ }else{ }; 

En supposant que recaptcha soit votre problème, voici comment ouvrir la fenêtre contextuelle: -?