Как открыть всплывающее окно в цикле и выполнить обратный вызов соответственно, чтобы вернуть статус? (Скрипт Greasemonkey) - PullRequest
2 голосов
/ 02 апреля 2011

Я не смог сформулировать правильное название для этих вопросов, поэтому я опишу идею / проблему здесь.

Итак, в настоящее время у меня есть 2 сценария для задачи:

Первый сценарий:Зацикливает все изображения на определенном веб-сайте, и если за них не проголосовали до того, как мы откроем всплывающее окно голосования, предоставляемое порталом (максимум 20 изображений одновременно).

Второй сценарий: устанавливает голосование за изображение и отправляет форму после закрытия формы, закрывающей отправкуpopup.

Проблема здесь в том, что через некоторое время всплывающее окно устанавливает поле капчи, чтобы предотвратить подобные вещи :).Итак, реальный вопрос: могу ли я объединить два скрипта в один, и в моем цикле дождаться открытия всплывающего окна и проверить, есть ли поле капчи?Затем я могу остановить цикл и сказать пользователю, что нужно вручную вводить капчу и перезагрузить страницу после этого.В настоящее время (ofc) скрипт просто запустит и откроет всплывающие окна (как я могу ждать в цикле, пока всплывающее окно не откроет и не загрузит DOM)?

Бах, очень сложно объяснить, пожалуйста, сообщите мне, если вам нужна дополнительная информация.

РЕДАКТИРОВАТЬ: Хорошо, давайте изменим это: Как открыть всплывающее окно в цикле и ждать обратного вызова из всплывающего сценария, и только затем, в зависимости от состояния возврата, продолжить?

Весь сценарий 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);
}

Ответы [ 2 ]

1 голос
/ 03 апреля 2011

Всплывающие окна загружаются и закрываются асинхронно, поэтому такие вещи, как "wondows.getElementById("vte_mark_5")", не будут работать сразу.Вам нужно дождаться события загрузки всплывающего окна.

В Greasemonkey вы должны использовать что-то вроде: PopupWin.addEventListener("load",...) (что в любом случае является наилучшей практикой, а не onload=....)

Аналогично обычномуцикл просто откроет все всплывающие окна одновременно.Чтобы открыть всплывающие окна последовательно, используйте очередь.Поскольку вы уже используете jQuery, переключитесь на версию 1.5.1, чтобы использовать функции очереди jQuery .
Обратите внимание, что Greasemonkey работает с jQuery 1.5.1 начиная с версии GM 0.9.

~~~
Предположим, у вас есть массив всплывающих URL-адресов ...

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

Затем вы можете создать очередь с помощью:

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 открываетвсплывающее окно и устанавливает обработчики событий открытия и закрытия ...

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


Обработчик события загрузки показывает, как вы можете манипулировать всплывающим окном с помощью jQuery главной страницы (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>');
}


Обработчик события закрытия должен вызывать следующий элемент в очереди ...

function PopupClosed (NextQ_Item)
{
    NextQ_Item ();
}


Наконец, вы запускаете очередь с помощью:

PopupQueue.dequeue ('Popups');


Вы можете увидеть демонстрацию, которая собирает все это на jsBin.com .

1 голос
/ 02 апреля 2011

Это равносильно рассылке спама. Но эхх, был там.

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

Предполагается, что recaptcha является вашей проблемой, и вот как вы открываете всплывающее окно: -?

...