jQuery передача параметров в .ajax () - PullRequest
2 голосов
/ 23 января 2011

У меня проблемы с передачей параметров / переменных в функцию ajax ().

Приведенная ниже функция принимает два параметра.Одним из них является 'element' - опция успеха .ajax (), которая отлично работает, поэтому не нужно фокусироваться на этом.«Tx» - это либо одно значение, например «menu», либо пара значений, разделенных двоеточием, например: «menu: Categories: бренды»

Если в «tx» есть только одно значение, то толькоОдин AJAX-запрос должен быть отправлен, и это прекрасно работает.Если в «tx» имеется более одного значения, функция разделяет его, используя «:», как разделитель, а затем передает смещение [0] как значение «tx» в запрос AJAX, а затем сохраняет остальные значения в «x '.

У меня возникли проблемы с рекурсивным выполнением этой функции после завершения запроса AJAX для первого значения.Var 'more' хранит значение bool, если для обработки осталось больше значений или нет.Однако, когда я записываю аргумент if, используя 'more == true', в параметр успешности или завершения .ajax (), он не отражает значение, хранящееся в этих переменных, он всегда возвращает false.

Прежде чем кто-то ответит: «Вы должны структурировать функцию, которая вызывает эту функцию, чтобы передавать только одно значение в этот параметр», давайте предположим, что это невозможное предприятие, которое находится за пределами сферы моего контроля.

Я понятия не имею, почему это происходит.Я знаю, что это, наверное, что-то очень простое, что я упускаю из виду, но я проснулся уже около 16 часов, и эта проблема мучила меня как минимум половину этого времени.

Любая помощь здесь приветствуется.Вот функция:

function getContent(element, tx) {
    e = element
    modAmount = tx.split(':')
    if (modAmount.length > 1) {
        x = ''
        tx = modAmount[0]
        for (i=1;i<modAmount.length;i++) {
            x = x + modAmount[i]
            if (i != (modAmount.length)-1){
                x = x+":"
            }
        }
        more = true
    }
    else {
        more = false
        tx = modAmount[0]
    }
    $.ajax({  
        type: "POST",  
        url: "getModule.php",  
        data: "modName="+tx+"&DB=<?php echo DB ?>",  
        success: function(data){  
            if ($( element ).find('p').text() == "No Content"){
                $( element ).find('p').remove();
                $( element ).html("<div onclick='destroy(this)' id='destroy' class='ui-corner-all destroy' title='Remove Module'>"+data+"</div>")
            }
            else {
                $( element ).append("<div onclick='destroy(this)' id='destroy' class='ui-corner-all destroy' title='Remove Module'>"+data+"</div>");
            }
        },
        complete: function() {
            if (more == true) {alert(x)} // always returns false
        }
    });

}

Ответы [ 2 ]

1 голос
/ 23 января 2011

Здесь уже есть одна явная ошибка: вы не объявляете свои локальные переменные, используя ключевое слово var . Это означает, что существует только один экземпляр любой из этих переменных в глобальном контексте.

Я не уверен, что это ваша проблема, но, похоже, это так и есть. Рассмотрим случай, когда вы вызываете getContent "foo: bar". Первый вызов устанавливает more в true , но затем второй рекурсивный вызов устанавливает more обратно в false . Когда первый XmlHttpRequest завершится, обратный вызов завершения будет видеть значение false вместо ожидаемого true , поскольку эти два вызова совместно используют одну и ту же переменную для more .

Вы должны прочитать о том, как работает область видимости JavaScript / ECMAScript, и получить полное представление о том, как замыкания работают в языке. Это предотвратит много царапин в будущем. Гугл вокруг для работ Дугласа Крокфорда; это хорошая отправная точка.

tl; dr: определите свои локальные переменные, используя ключевое слово var .

0 голосов
/ 23 января 2011

Поскольку "more" не ограничено вашими обратными вызовами.

Я рекомендую использовать свойство context, которое вы можете отправить в вызов ajax, чтобы установить переменную "this" в обратных вызовах success / complete:

http://api.jquery.com/jQuery.ajax/

...