2011-04-24 9 views
5

Chciałbym zapytać, czy możliwe jest zbudowanie skryptu Chrome lub Greasemonkey, który mógłby otworzyć wszystkie wyskakujące okienka w kolejce. Jak dotąd mam do tego dwa osobne skrypty, ale to nie działa dobrze, ponieważ wyskakujące okienka mają funkcję antyspamową, która nie pozwala na ich zbyt wiele w tym samym czasie.kolejka jQuery w Chrome usercript z wyskakującymi okienkami?

Co chcę zrobić, to przetwarzać tablicę odnośników w trybie kolejki i otwierać tylko wtedy, gdy poprzednia jest zamknięta. Nie mam wrażenia, gdy przechodzi do kolejek i wszelkiego rodzaju zdarzeń wiążących.

So zasoby mam:

1) Macierz linków już przygotowane

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) skrypt, który głosuje nad obrazem w popup

/*######################################################*/ 
    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(); 
     } 
    } 
}); 

O ile mogę zrozumieć powinien wyglądać następująco:
1) Pobierz wszystkie nieulotowane adresy URL i utwórz tablicę (done)
2) kolejki wszystkie wyskakujące okienka, aby otworzyć
3) Rozpoczęcie pierwszego popup
4) zrobić Głosowanie i okienko zamyka (zrobione)
5) Początek drugiej okienko
6) Kiedy tablica zakończeniu przełączyć się na następnej stronie (zrobione)

Co myślisz?

+1

lepiej zrobić jedno okienko, więc każdy program antywirusowy willn't go zablokować. Rozpocznij pierwsze wyskakujące okienko -> Głosowanie zakończone i wyskakujące odświeżanie z nowym formularzem -> ... –

+0

Jestem gotowy na każde rozwiązanie za każdym razem nowe lub nowe. Będę tylko osobą, która będzie z tego korzystała, więc nie martwię się blokowaniem. – arma

Odpowiedz

2
  • Jakie są dokładne URL strony głównej (ów), a także z pop-upów?
  • Jaką wersję jQuery używasz i jak ją uwzględniasz?

Dokładne adresy URL są ważne, ponieważ skrypt musi obsługiwać zarówno strony główne, jak i podręczne okna oraz działać w różny sposób na każdym z nich.

Są to 2 główne sposoby radzenia sobie z tym. Albo:

  1. Zastosowanie include dyrektyw, aby upewnić się, że skrypt działa zarówno na stronie głównej i popup, ale przełącza swoje zachowanie w zależności od typu strony. Będzie to miało dwa różne wystąpienia skryptu działającego jednocześnie, co nie stanowi problemu.

  2. Zastosowanie include i ewentualnie exclude dyrektyw w celu zapewnienia, że ​​skrypt tylko działa na stronie głównej. Następnie pop-up otwierający kod manipuluje formularzem.


Oto jak to zrobić podejście 1:

(1) Załóżmy, że główne strony były jak:
somewhere.com/main/*
i wyskakujące strony były jak:
somewhere.com/window/friend/gallery_view/*
Upewnij instrukcje zawarte w skrypcie włączają się do obu zestawów stron.

(2) Upewnij się, że jQuery jest dostępny na obu stronach. Zaleca się jQuery 1.5.1. jQuery 1.3.2 prawdopodobnie nie będzie działał dla następującego kodu.

(3) Następnie kod jak poniżej powinno działać:

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 cześć. Tak, twój skrypt wyglądał dobrze, ale w chrome dostaję po prostu 'Uncaught TypeError: Can not call method 'addEventListener' of undefined'. Używam teraz wersji 1.5.2 i wkleiłem ją do mojego skryptu. Adres strony głównej: 'http: // przyjaciele.example.com/friend/28r6afk4bf/gallery/3044094.html' i pasuję do' http://friends.example.com/friend/*/gallery/* 'i popup to:' http: // friends.example.com/window/friend/gallery_view/28r6afk4bf/a4w01kb3i0bg.html' również pasuję do 'http: // friends.boomtime.lv/window/friend/*' – arma

+0

OK, poprawiłem kod. Nie powinno teraz powodować błędów w przypadku nieprawidłowych adresów URL. Scenariusz wyglądał dobrze, ale potem się zepsuł? Czy to znaczy, że działało w Firefoksie? Czy zadziałało to w przypadku kilku wyskakujących okienek, a potem zostało zmanipulowane? Moje testy działają, nie mogę dalej debugować bez znajomości prawdziwej strony docelowej. –

+0

Teraz robi 1 wyskakujące okienko i pluje w konsolę "Bad URL/window/friend/gallery_view/28r6afk4bf/cxa4w065bnz1bg.html". Co rozumiesz przez stronę docelową? – arma

2

Można zrobić coś takiego:

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; 
    }) 

} 

Mam nadzieję, że to pomaga ...

+0

wszystko wygląda dobrze i mam to działa dla pierwszego wyskakującego okienka, ale inne wyskakujące okienka nie są przetwarzane. Prawdopodobnie dlatego, że '$ (window) .bind' as wiąże bieżące okno, które nie jest popupem, ale stroną główną. muszę odświeżyć, aby inne mogły zostać przetworzone. Jak bind to jak '$ (popup) .indd? – arma

+0

Masz rację, to był błąd, zaktualizowałeś odpowiedź. – iwiznia

+0

Wciąż wykonuje tylko ładowanie pierwszej strony. Wygląda na to, że traci on popup i nie może przechwycić z niego żadnych zdarzeń. Mam '// @ match' dla adresu głównego i popup w skrypcie. – arma