2011-04-24 31 views
5

Tôi muốn hỏi liệu có thể xây dựng phù thủy kịch bản Chrome hoặc Greasemonkey có thể mở tất cả các cửa sổ bật lên trong hàng đợi hay không. Cho đến nay tôi có 2 kịch bản riêng biệt cho việc này, nhưng điều đó không hoạt động tốt vì các cửa sổ bật lên có tính năng chống spam không cho phép quá nhiều tập lệnh cùng một lúc.Hàng đợi jQuery trong người dùng Chrome có cửa sổ bật lên?

Điều tôi muốn làm là xử lý mảng liên kết bật lên trong thời trang xếp hàng và chỉ mở tiếp theo khi đã đóng trước đó. Tôi không có expirience khi nó đi xuống hàng đợi và bất kỳ loại sự kiện ràng buộc.

Vì vậy, nguồn lực tôi đã nhận:

1) Mảng các liên kết đã chuẩn bị

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 rằng bỏ phiếu về hình ảnh trong cửa sổ bật lên

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

Như xa như tôi có thể hiểu được nó nên đi như thế này:
1) Nhận tất cả các url chưa được bỏ chọn và mảng biểu mẫu (đã hoàn thành).210 2) Sắp xếp các file tất cả các quảng cáo để mở
3) Bắt đầu bật lên đầu tiên
4) biểu quyết thực hiện và popup đóng (thực hiện)
5) Bắt đầu bật lên thứ hai
6) Khi mảng xong chuyển sang trang tiếp theo (thực hiện)

Bạn nghĩ sao?

+1

tôi tốt hơn làm nó trở thành một cửa sổ bật lên, vì vậy bất kỳ chương trình chống virus willn't chặn nó. Bắt đầu cửa sổ bật lên đầu tiên -> Việc bỏ phiếu được thực hiện và làm mới cửa sổ bật lên với biểu mẫu mới -> ... –

+0

Tôi sẵn sàng cho bất kỳ giải pháp nào một hoặc mới mỗi lần. Tôi sẽ là người duy nhất sẽ sử dụng cái này vì vậy tôi không lo lắng về việc chặn. – arma

Trả lời

2
  • là gì URL của chính xác của trang chính (s) và cũng có thể của các quảng cáo?
  • Bạn đang sử dụng phiên bản jQuery nào và bạn bao gồm phiên bản đó như thế nào?

URL chính xác là quan trọng vì tập lệnh cần xử lý cả trang chính và cửa sổ bật lên và hoạt động khác nhau trên mỗi trang.

Đó là 2 cách chính để xử lý việc này. Hoặc:

  1. Sử dụng include chỉ để đảm bảo rằng kịch bản chạy trên cả hai trang chính và các popup, nhưng chuyển hành vi của nó tùy thuộc vào loại trang. Điều này sẽ có hai trường hợp khác nhau của tập lệnh chạy đồng thời, đó không phải là một vấn đề.

  2. Sử dụng include và có thể exclude chỉ thị để đảm bảo rằng tập lệnh chỉ chạy trên trang chính. Sau đó, có mã mở popup thao tác biểu mẫu.


Dưới đây là cách thực hiện phương pháp 1:

(1) Giả sử các trang chính đã được như:
somewhere.com/main/*
và popup trang bị như:
somewhere.com/window/friend/gallery_view/*
Hãy chắc chắn rằng các lệnh bao gồm của tập lệnh sẽ kích hoạt trên cả hai tập hợp các trang.

(2) Đảm bảo rằng jQuery có sẵn trên cả hai loại trang. jQuery 1.5.1 được khuyến nghị. jQuery 1.3.2 có thể sẽ không hoạt động đối với đoạn mã sau.

(3) Sau đó, mã như sau nên làm việc:

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 xin chào. Có kịch bản của bạn đã được tìm kiếm tốt nhưng trong chrome tôi chỉ đơn giản là có được 'Uncaught TypeError: Không thể gọi phương thức 'addEventListener' của undefined'. Và tôi sử dụng phiên bản 1.5.2 bây giờ và tôi đã dán nó vào tập lệnh của mình. url của trang chính: 'http: // friends.example.com/friend/28r6afk4bf/gallery/3044094.html' và tôi đối sánh nó với' http://friends.example.com/friend/*/gallery/* 'và popup là:' http: // friends.example.com/window/friend/gallery_view/28r6afk4bf/a4w01kb3i0bg.html' cũng khớp với 'http: // friends.boomtime.lv/window/friend/*' – arma

+0

Ok, tôi đã chỉnh sửa mã. Nó không nên lỗi trên các URL xấu bây giờ. Các kịch bản đã được tìm kiếm tốt nhưng sau đó bị lỗi? Điều đó có nghĩa là nó hoạt động trong Firefox? Hoặc, nó làm việc cho một vài cửa sổ bật lên và sau đó bị lỗi? Thử nghiệm của tôi hoạt động, tôi không thể gỡ lỗi thêm mà không biết trang đích thực sự. –

+0

Bây giờ nó có 1 popup và spits vào giao diện điều khiển 'Bad URL/cửa sổ/người bạn/gallery_view/28r6afk4bf/cxa4w065bnz1bg.html'. Ý của bạn là gì? – arma

2

Bạn có thể làm một cái gì đó như:

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

} 

Tôi hy vọng nó sẽ giúp ...

+0

mọi thứ có vẻ tốt và tôi đã làm việc đó cho cửa sổ bật lên đầu tiên, nhưng các cửa sổ bật lên khác không xử lý. Đó có thể là vì '$ (cửa sổ) .bind' vì nó liên kết với cửa sổ hiện tại không phải là cửa sổ bật lên mà là trang chính. tôi cần phải nhấn làm mới cho người khác để được xử lý. Làm thế nào để bạn liên kết nó như '$ (popup) .bind'? – arma

+0

Bạn đã đúng, đó là lỗi, đã cập nhật câu trả lời. – iwiznia

+0

Vẫn thực thi chỉ lần tải trang đầu tiên. Có vẻ như nó đang mất popup và không thể bắt được bất kỳ sự kiện nào từ nó. Tôi có '// @ match' cho cả trang chính và địa chỉ popup trong tập lệnh. – arma

Các vấn đề liên quan