2015-07-15 7 views
-1

Вот мой HTMLнеобычное поведение AJAX

<form id="the_form"> 
      Zip/Postal Code: <input id="zip" type="text" name="zip"><br/> 
      <input type="submit" value="Submit" id="submitButton"> 
</form> 


<div id="output"></div> 

Вот мой JQuery

<script type="text/javascript"> 
    $("document").ready(function() { 

    $("#submitButton").on("click",function(){ 

    var value_to_send_to_php = $.trim($("#zip").val()); 

     if(value_to_send_to_php != "") { 

       $.post("formphptoajax_rb.php", $("#the_form").serializeArray() , function(data) { 
        //#1 doesn't work here 
       }); 
        //#2 doesn't work here   
     }  
        //#3 doesn't work here 
    }); 

     $("#output").text("success"); 

    }); 
</script> 

выше JQuery работает отлично. То есть, щелкнув submit, я получаю «успешный» вывод в div с идентификатором «output».

Что я не могу понять, так это то, почему я не получаю такой же результат, когда я размещаю $("#output").text("success"); в местах, помеченных # 1, # 2 или # 3.

В # 1 и # 2 я не получаю выход. На # 3 я получаю «успех» на долю секунды, а затем исчезает.

+3

Потому что вы не останавливаете поведение кнопки 'submit' по умолчанию. Форма отправляется после выполнения обработчика 'click', который в этом случае совпадает с перегрузкой страницы. – Andreas

+0

Начните смотреть на # 3, потому что если № 3 не произойдет, то остальное тоже не будет. Единственные возможные пути для # 3, чтобы не произойти, были бы, если перед этим возникла ошибка, или ваш обработчик событий никогда не вызван, что не должно быть возможным с учетом вашего кода. закомментируйте теги формы и повторите попытку, наблюдая за своей консолью. ** Моя догадка №3 происходит, вы просто этого не видите. ** –

+1

Вам нужно «вернуть ложь»; в конце функции щелчка, чтобы предотвратить обратную передачу. И ваш вызов «$ (« # output »). Text (« success »); в том объеме, который у вас есть, это не имеет никакого смысла. Он будет вызываться всегда независимо от успеха или ошибки вызова ajax. – paYa

ответ

2

Как и обработчик кликов, страница также отправляется с тех пор, как вы нажали кнопку «отправить».

Используйте вместо этого тип ввода = «кнопка». Это то, для чего оно предназначено для: кнопки без отправки.

+0

Ну технически, поскольку это форма, кнопка отправки правильная. Вам просто нужно предотвратить действие кнопки по умолчанию при ее обработке. –

2

Вам нужно сделать e.preventDefault() или вернуть false из вашего обработчика. Кроме того, то, что у вас там, покажет успех при загрузке, а не после нажатия кнопки.

1

Хорошо, давай прямо. Я полагаю, что $ .post вызывает AJAX async callback (, это важно, потому что, если вы не хотите обратного вызова ASYNC, я плохо понял ваш вопрос, а мои выводы ошибочны).

<script type="text/javascript"> 

    $("document").ready(function() { 

    $("#submitButton").on("click",function(){ 

     var value_to_send_to_php = $.trim($("#zip").val()); 

     if(value_to_send_to_php != "") { 

     // - ok, we have "#zip" value filled, so let's take "#the_form" data and sends them asynchronously to server 

     $.post("formphptoajax_rb.php", $("#the_form").serializeArray() , function(data) { 
      //#1 doesn't work here 

      // - great, our AJAX callback was successful, so we can inform user, that save or whatever operation was successfull 
      // - now we can process "data" returned from server 
      // - and we can show the success message - $("#output").text("success"); 

      // BUT, all this will happen only, when you prevent page from full postback (which refresh the whole page) 
     }); 

     //#2 doesn't work here   


     } 

     //#3 doesn't work here 

     // - in this place you have to prevent page from continue submitting (therefore full page postback is initiated) 
     // - so there should be "return false;" (without quotes of course) 
     // - or you can use "e.preventDefault();" here (as someone already mentioned), but in that case you have to change your click event handler signature from "function()" to "function(e)" 
    }); 

    $("#output").text("success"); 

    }); 

</script> 

Упрощенная postback вызывается при нажатии кнопки передачи - браузер принимает данные формы и обновить страницу (в то время как данные формы отправки на сервер как запрос Params). Это синхронный запрос HTTP POST. Ну, термин «PostBack» используется в основном в ASP или ASP.NET.

Что касается «исходного контекста не существует во время завершения ajax» - я имею в виду, что при отправке асинхронного обратного вызова на сервер, но сразу после этого страница обновляется (из-за обратной передачи), тогда оригинал инициатор асинхронного обратного вызова больше не существует, и нет процедуры, которая может обрабатывать результат этого обратного вызова (успех или неудача).

+0

Благодарим вас за отзыв и отзыв. Здесь происходит «postback», главным образом потому, что тип ввода «submit»? Это не произошло бы, если бы это был тип ввода «кнопки» или просто элемент «кнопка», правильно? –

+0

@ пользователь1883050 - все правильно. Кнопка типа ввода или элемент кнопки не инициирует обратную передачу. – paYa

+0

Gotcha! Это была кнопка типа «отправить», которая вызывала у меня всю эту путаницу. –

Смежные вопросы