проблемы Ajax jQuery, периодически получая дублирующиеся запросы

Прямо тогда я приезжаю в конец переписывания нашей системы JavaScript, мы перемещаемся от Прототипа до jQuery. У нас есть загрузка запросов Ajax, которые стреляют, когда определенный элемент, который события имеют место, то в примере ниже, является новым событием на календаре, но это происходит в другом месте также.

Проблема, которую я получаю, состоит в том, когда событие иногда запускается выполнены, два запроса Ajax. Первый возвращает правильное значение, но (как Вы видите) это все еще говорит, что обработка, никогда не возвращается, успех обмениваются сообщениями, мой JavaScript требует. Второй запрос возвращает корректный результат И завершается правильно.

Проблемой, которую я имею, является наш экранный блокировщик jQuery, настраивается для предотвращения ввода данных пользователем во время тяжелых запросов Ajax, очевидно, потому что там запрос Ajax все еще живет, экран никогда не разблокировал. Если я должен был обновить этот экран, все будут работать, как желаемый.

Может любой проливать любой свет на то, почему это поведение происходит.

сопроводительный текст http://archive.ilmv.co.uk/images/jquery-duplicate-ajax-request.png

Править

"запросы, которые стреляют, когда определенный элемент события имеют место" - это - ключевая фраза, я думаю. Обеспечьте некоторую информацию о том, как Вы устанавливаете свои события. Возможно, это стреляет дважды, потому что у Вас есть несколько наборов обработчиков? – Igor Zinov'yev

Хорошо, вещь состоит в том, когда я совершил нападки, обновляются, проблема обычно разрешает себя, таким образом, не уверенный, как это могло быть проблемой обработчика, вот обработчик событий, мы обычно используем для изменения избранного поля.

$("#my_select","#context").change(function(){
            // uz_ajax is a wrapper function, keeps most of the same functionality as $.ajax()
    uz_ajax({
        target:"#my_target",
        data:{
            module:'my_module',
            controller:'my_controller',
            action:'my_action',
            id:$(this).val(),
            ajax:''
        }
    });
});

Проблема, которую я имею, я понятия не имею, как копировать проблему, таким образом, я не знаю, запускается ли событие многократно или запрашивает ли Ajax дважды.

РЕДАКТИРОВАНИЕ 2

При перезагрузке элементов, которые связываются затем, события изменения могли быть инициированы рекурсивно... Мы действительно должны видеть больше кода (что Вы делаете на успехе вызова ajax и т.д.) – redsquare

Спасибо redsquare, на успешный Ajax запрашивает, чтобы я обычно применил ответ (обычно HTML s) к цели. Я никогда не инициировал изменение от элемента, который запустил Ajax, но я иногда инициировал изменение на целевом элементе, для обеспечения каскадных запросов Ajax. Если бы это было проблемой, то конечно, это произошло бы все время? Моя функция обертки uz_ajax ниже:

var ajax_count = 0;
var ajax_response = null;

function uz_ajax(options) {

    // set default options
    var defaults = {
        async: true,
        type: "GET",
        data: {},
        url: "/",
        cache: false,
        force_change: true,
        highlight: true,
        action: "normal",
        dataType: "html",
        selected: {
            value: null,
            disabled: false
        }
    };

    // merge the passed options with the defaults
    var options = $.extend(defaults, options);

    // start the jQuery ajax method
    $.ajax({
        async: options.async,
        type: options.type,
        url: options.url,
        data: options.data,
        beforeSend: function() {
            // we only want to block the screen on the first pass
            if(++ajax_count==1) {
                $.blockUI({message:'Loading data, please wait'});
            } 
        },
        success: function(responseText) {           
            if(options.target!==undefined) {
                // if target isn't an array, make it one
                if(!$.isArray(options.target)) {
                    options.target = new Array(options.target);
                }

                var targets = options.target;

                for ( var i in targets ) {
                    console_info("uz_ajax() --> Applying contents to "+targets[i]);

                    switch(options.action) {
                        case "normal":
                            if($(targets[i]).is("input")) {
                                $(targets[i]).val(trim(responseText));
                            } else {
                                $(targets[i]).html(trim(responseText));
                            }
                            break;
                        case "selected":
                            // preserve the current target value (e.g. list of options), but 
                            // set the selected value to the ajax response
                            console_warn("Changing selected value of "+targets[i]+" to '"+responseText+"'");
                            // trim the response so we don't get any smarty induced errors such as '    7'
                            $(targets[i]).val(trim(responseText));
                            break;
                    }

                    // set selected value
                    if(options.selected.value!=null) {
                        $(targets[i]).val(options.selected.value);
                    }

                    // highlight the target
                    // we don't want to highlight the target if it's a hidden input, as this will force a .show(
                    if($(targets[i]).attr('type')!='hidden' && options.highlight===true) {
                        $(targets[i]).effect("highlight",{},2000);
                    }

                    // force the target to change
                    if(options.force_change===true) {
                        $(targets[i]).trigger("change");    
                    }

                    /* rebind certain elements that do not use conventional events */
                    /* We probably need to get all of these rebinds in a single function */
                    createDatePickers(targets[i]);
                }
            } else {
                ajax_response = responseText;
                console_warn("uz_ajax -> no targets specified");
                // Well... we have no element to target, we need to return the value instead
                // of course if we return here we're going
                // we probably also need to check the ajax count as this will be the last executed part before we return
            }
        },
        complete: function () {
            /* if all ajax requests have completed, unblock screen */
            if(--ajax_count===0) {
                $.unblockUI();
                /* could use this callBack to return a value *dun dun duuuuun* */
                if (options.ajaxComplete) {
                    options.ajaxComplete(ajax_response);
                }
            }
        },
        cache: options.cache,
        dataType: options.dataType
    });

}

другой способ остановить несколько запросов ajax к heck jQuery.active до вызова. jQuery проводит внутренний подсчет 'живых' запросов ajax с помощью этого свойства. – redsquare

Я изучу это.

РЕДАКТИРОВАНИЕ 3

Таким образом, это - результат $ ('элемент') .data (), но я не могу понять то, что он пытается сказать, делает это означает, что существует два, связывает с ним. Раз так, как делают я узнаю то, что они связывают, и почему делают они оба не стреляют, когда событие запущено.

сопроводительный текст http://archive.ilmv.co.uk/images/firebug-jquery-data-events.png

РЕДАКТИРОВАНИЕ 4

Вот другой снимок экрана проблемы, на этот раз в другом месте в системе. Зеленая стрелка является элементом, это - триггеры три запроса ajax, не в поджигателе, как существует шесть, и что они разделяют на пары и совместно используют метки времени вниз к миллисекунде?

Лучшие три - те, которые не завершились, нижняя часть три имеют, возвращают корректный результат.

сопроводительный текст http://archive.ilmv.co.uk/images/jquery-duplicate-ajax-request-v2.png

РЕДАКТИРОВАНИЕ 5

Изображение ниже демонстрирует то, что происходит, когда избранное поле изменяется, оно запускает три различных запроса ajax.

Мне удалось сделать немного больше отладки, и я могу сказать Вам следующее:

  1. Проблема происходит независимо от того, сколько ajax запрашивает начальные вызовы элемента
  2. Проблема происходит независимо от того, какие плагины используются
  3. Это событие определенно только запускается однажды
  4. Моя uz_ajax функция обертки только запускается однажды на цель (см. консоль поджигателя, "Строка 29: uz_ajax ()".
  5. Я добавил console.info на каждом jQuery $.ajax() обратные вызовы для наблюдения, что стреляет и когда, заметьте, как единственный обратный вызов для увольнения beforeSend().

сопроводительный текст http://archive.ilmv.co.uk/images/jquery-duplicate-ajax-request-v3.png

РЕДАКТИРОВАНИЕ 6

Прямо тогда, после @redsquare предложенный через Твиттер об использовании console.trace() узнать, "где второе событие стреляет из", как я всегда поддерживал, я уверен, что нет двух событий, стреляющих, таким образом, я вставил трассировку $.ajax() метод, вот то, что произошло:

сопроводительный текст http://archive.ilmv.co.uk/images/jquery-duplicate-ajax-request-v4.png

Поскольку Вы видите, что я получаю дубликат ajax проблема запроса даже при том, что $.ajax() метод только стрелял однажды, снова метки времени идентичны. Я столкнулся с ошибкой с jQuery?

РЕДАКТИРОВАНИЕ 7

Это происходит на StackOverflow также!

сопроводительный текст http://archive.ilmv.co.uk/images/jquery-duplicate-ajax-request-v5.png

6
задан Ben Everard 7 July 2010 в 08:26
поделиться

3 ответа

Итак, я пришел к выводу, я почти уверен, что моя проблема связана с Firebug, поскольку я тестировал его приложение на FF без включенного Firebug и он работает так, как должен.

Это не первый раз, когда что-то связанное с JavaScript привело меня в веселый танец, когда симптомы проблемы не предлагают разумного намека на решение, но вот оно.

Большое спасибо @redsquare, который оказал здесь огромную помощь, но через твиттер и IRC-канал jQuery, большое спасибо, чувак!

1
ответ дан 17 December 2019 в 20:28
поделиться

Вы пробовали использовать вместо этого .click ()? У меня были проблемы с нерегулярной активностью при использовании .change () в javascript. Попробуйте.

1
ответ дан 17 December 2019 в 20:28
поделиться

Попробуйте добавить return false в вашу функцию onchange. Это остановит jQuery от всплытия события.

Убедитесь, что $ ("# my_select", "# context"). Change (function () { вызывается только один раз.

0
ответ дан 17 December 2019 в 20:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: