Javascript and AJAX, only works when using alert() Javascript and AJAX, only works when using alert() ajax ajax

Javascript and AJAX, only works when using alert()


The alert() helps because that delays the processing of the remaining javascript in that function (everything from the alert() down to the bottom), leaving enough time for the AJAX request to complete. The first letter in AJAX stands for "asynchronous" which means that (by default) the response will come in at "some point in the future" but not immediately.

One fix (which you should not implement) is to make the processing synchronous (by changing the third argument of open() to be false) which will stop further processing of your script (and the entire webpage) until the request returns. This is bad because it will effectively freeze the web browser until the request completes.

The proper fix is to restructure your code so that any processing that depends on the result of the AJAX request goes in to the onreadystatechange function, and can't be in the main function that initiates the AJAX request.

The way this is usually handled is to modify your DOM (before the AJAX request is sent) to make the form readonly and display some sort of "processing" message, then in the AJAX response handler, if everything is okay (the server responded properly and validation was successful) call submit() on the form, otherwise make the form wriable again and display any validation errors.


The problem is that XMLHTTPRequest is asynchronous - it sends the request in the background and doesn't wait for it to finish.

The alert statement causes the code to wait until the user clicks OK, during which the request finishes.

You need to use the onreadystatechange event, like this:

xmlhttp.onreadystatechange = function() {    if(xmlhttp.readyState==4) {        // Do things    }};

The method you assign to this property will be called after the response is received. (and at other times, which is why you need to check that readyState is 4)


You're sending the request asynchronously, because of this:

xmlhttp.open(..., true);

Passing true as the third argument to open() means that the code will continue to run before the result comes back.

The alert() is giving that asynchronous request time to complete before the subsequent code runs.

I'd normally recommend moving all the code that depends on the result of the AJAX call into the callback, within the:

if(xmlhttp.readyState == 4)

block, but in your case you need the result of the call to know what to return from your validation function. In that case, you're going to have to use a synchronous call, by passing false to open(). Then your subsequent code won't run until the response has come back.