Improve company productivity with a Business Account.Sign Up


IE - Ajax problem - Data necessary to complete this operation is not yet available

Posted on 2010-09-10
Medium Priority
Last Modified: 2013-12-08
Hi Experts, I'm trying to make a call to ajax which it supposes to return the percentage left while waiting for the file to finish generating info. Everything works fine in Firefox but in IE it generates an error as stated in the topic. It does work in IE but with an error. Below is the javascript I used. If I were to comment out the line after  "ajaxRequest.readyState == 3" (line #37)  it seems to work without any error.

function generateCompleteExport(data){
	ajaxRequest = GetXmlHttpObject(); 
	ajaxRequest.async = false;
	if (ajaxRequest==null){
		alert ("Browser does not support HTTP Request")
	var loadingImg = '<img src="/reports/assets/scripts/loading.gif" title="Loading...">';
	document.getElementById('status').innerHTML = loadingImg;
	// Add parameter 'q' to URL
	var url = 'completeExportGenerate.php?'+data;	
	// Adds a random number to prevent the server from using a cached file
	var numTest =0;
	var response;
	var index;
	ajaxRequest.onreadystatechange = function(){
		if(ajaxRequest.readyState == 4){
			if(ajaxRequest.status == 200) {
				response = ajaxRequest.responseText.split("###");
				index = response.length-1;
				document.getElementById('status').innerHTML =response[index];
			} else {
				//window.status = "No Update for " + targetId;
				document.getElementById('status').innerHTML="Error code " + ajaxRequest.status;
		if(ajaxRequest.readyState == 3){
			response = ajaxRequest.responseText;.split("###");
			if( (response.length-2)<= 0)
				index = 0;
				index = response.length -2;
			document.getElementById('status').innerHTML =loadingImg+'<br>'+response[index];
	}"GET", url, true);

Open in new window

Question by:infernothao
  • 5
  • 2
  • 2
LVL 40

Expert Comment

by:Gurvinder Pal Singh
ID: 33650610
did you tried removing lines 36-44 and check?

Expert Comment

ID: 33650691
There is a typo on line 37:
response = ajaxRequest.responseText;.split("###");

It should be:
response = ajaxRequest.responseText.split("###");

About the ready states, you can find more info here:

State 3 means the page is still loading, so the data is not going to be ready for you yet.

Author Comment

ID: 33651475
Thanks for answering guys. I'm pretty new to ajax...  anyway, I'm not totally sure what readyState == 3  do but I read some where it says something about interacting between the client and the server. The reason I need line 36-44 is because I want to update the progress bar percent while the file is being generated in the background. Hmm... when I changed the "responseText" to "responseXml" it seems to stop the error. I have tried using responseXml before but I have no clue how to send data back using Php.
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!


Author Comment

ID: 33651480
@apresence, fixed that typo but still error.
LVL 40

Expert Comment

by:Gurvinder Pal Singh
ID: 33652917
<<I'm not totally sure what readyState == 3  do but I read some where it says something about interacting between the client and the server>>
Not required to handle in most cases.
You can read about it here

In case you want to indicate the user that response is being processed at the background, then you can update those lines to

if(ajaxRequest.readyState == 3){
                  document.getElementById('status').innerHTML ="Response is fetched, loading...";

Author Comment

ID: 33654839
Well, the thing is it will take anywhere between 5-30 minutes. It would be nice to know how long it will take.

Accepted Solution

apresence earned 2000 total points
ID: 33655541

Here's an official document from Microsoft on the issue.  Looks like they have something new in IE8 called XDomainRequest that might work, but there are some obstacles.  Check here:

None the less, being the stubborn person who never accepts "no" for an answer, I did the research myself.  From Microsoft's documentation:
You cannot call responseBody and responseText properties to obtain partial results (readyState = 3). Doing so will return an error, because the response is not fully received. You must wait until all data has been received.
In comparison, the Microsoft XML (MSXML) version of the IXMLHTTPRequest interface exposes partial results through the responseStream property, which the Windows Internet Explorer native version does not implement.
Assuming we want to explore other Microsoft objects that might allow us to get partial results, a very high level, we'd still need to avoid getting the error message.  To do this, replace line 37 with the following:
try {
  response = ajaxRequest.responseText.split("###");
catch (e) {
  response = '';
Now, in an attempt to get back some partial results, I've tried several different Microsoft objects that support XML/HTTP requests and getting partial results either in responseText or responseStream, and none of them have worked.

So, there are a couple of alternatives you might explore:
1. If your PHP script is doing some sort of iterative process and produces data in blocks along the way, you could send an XML request for each block of data, avoiding the partial results issue.  This would be especially useful if you know how many blocks of data you would send in advance, because then you can send this information to the client side at the beginning and implement a progress bar as the data is downloaded.  Of course, if your PHP script does some work and spits all the data out at once, then there's no way you're going to be able to do any sort of reliable progress indicator.  To test this, try calling your PHP code from a command prompt on the host system.
2. You could set up a timer event that fires every 5 seconds or however long you'd like to update some "Loading ..." text or graphic to indicate that the processing has not yet completed.  You don't really know how long it will take in this case, however.
3. Try ou thte XDomainRequest object mentioned above.  This has the drawback of not being compatible with browsers prior to IE8, and the 2kb buffering issue mentioned in the linked article.

I wrote a sample PHP script to generate 10 blocks of data every second for testing purposes (attached).  Please note a few things in the code:
1. The disable_browser_cache() function disables the browser cache on the PHP side, so you don't have to pass in a random number on the JavaScript side like you are currently doing.
2. After each line/block of data, I'm calling ob_flush() to cause PHP to flush it's output buffer.  If IE was able to picking up partial data, this is how we'd ensure IE always gets each block of data right away.  Otherwise, there's an internal buffer where the data would be stored until some threshold is met, and only at this point would anything be sent over the network to your JavaScript code.
3. Is there any reason you are using "###" as a delimiter instead of something more standard like "\n"?
I ran the PHP script on the server side and confirmed that it writes out each block of data every second, however on the JavaScript side I only get the whole block of data and never any partial data.

  // Disables the browser cache.  MUST be called before any data is written out
  function disable_browser_cache()
    header("Expires: Mon, 01 Jan 2001 00:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");

  // Disable browser cache

  // Write out some data
  for ($i=0; $i<10; $i++)
    echo "Data line $i###";

Open in new window


Author Closing Comment

ID: 33665987
Thanks for the advises.

Author Comment

ID: 33666028
Guess I'm so focus on one think that I couldn't think straight. Thanks for Apresence for not giving up on me and give me something to work on. The solution I came up with is  somewhat a combination of what Apresence's advises. Every 5 seconds or so I'll load and read a XML file generated by PHP. Thanks.

Featured Post

Free Tool: Path Explorer

An intuitive utility to help find the CSS path to UI elements on a webpage. These paths are used frequently in a variety of front-end development and QA automation tasks.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Following on from our article on "The Murky World of Consent and opt in", we thought we would issue some helpful guidance, not only on consent itself but knowing what information you are capturing, what you are doing with this data and how you can p…
This is the conclusion of the review and tests for using two or more Password Managers so you don't need to rely on just one. This article describes the results of a lot of testing in different scenario's to reveal which ones best co-exist together.…
Google currently has a new report that is in beta and coming soon to Webmaster Tool accounts. This Micro Tutorial will highlight new features for Google Webmaster Tools.
Shows how to create a shortcut to site-search Experts Exchange using Google in the Chrome browser. This eliminates the need to type out whenever you want to search the site. Launch the Search Engine Menu: In chrome, via you…

601 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question