2012-01-15 4 views
30

Tôi gặp lỗi xmlhttprequest khi làm việc với javascript. Tôi có một tệp XML mà tôi muốn phân tích và gán nội dung của nó cho trang web. Tôi đã làm nghiên cứu của tôi về phần này, và tôi dường như không thể tìm ra nó.Lỗi XMLHttpRequest (Ajax)

<script = "text/javascript"> 
    window.onload = onPageLoad(); 
    var questionNum = 0; 
    function onPageLoad(questionNum){ 

     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.open("GET","quiz.xml"); 

     try{ 
      xmlhttp.send(null);//here a xmlhttprequestexception number 101 is thrown 
     }catch(err){ 
      document.getElementById("body").innerHTML += "\nXMLHttprequest error: " + err.description; 
     //this prints "XMLHttprequest error: undefined" in the body. 
     } 

     xmlDoc=xmlhttp.responseXML; 
     parser=new DOMParser(); //this code is untested as it does not run this far. 
    } 
</script> 

Tệp XML của tôi đơn giản và nằm trong cùng một thư mục.

<question> 
    <query>what is 2+2?</query> 
    <option>4</option> 
    <option>5</option> 
    <option>3</option> 
    <answer>4</answer> 
</question> 

Tôi không thể tìm ra vấn đề của mình là gì. Để tham khảo tôi thường chương trình trong C# hoặc Java, và tôi đang sử dụng google chrome.

Trả lời

57

Vì vậy, có thể có một vài điều sai ở đây.

Bắt đầu đầu tiên bằng cách đọc cách sử dụng XMLHttpRequest.open() vì có thông số tùy chọn thứ ba để chỉ định có thực hiện yêu cầu không đồng bộ hay không, đặt mặc định thành true. Điều này có nghĩa là bạn đang thực hiện yêu cầu không đồng bộ và cần chỉ định chức năng gọi lại trước khi thực hiện send(). Dưới đây là một số example from the Mozilla Developer Network:

var oXHR = new XMLHttpRequest(); 

oXHR.open("GET", "http://www.mozilla.org/", true); 

oXHR.onreadystatechange = function (oEvent) { 
    if (oXHR.readyState === 4) { 
     if (oXHR.status === 200) { 
      console.log(oXHR.responseText) 
     } else { 
      console.log("Error", oXHR.statusText); 
     } 
    } 
}; 

oXHR.send(null); 

Thứ hai, vì bạn gặp lỗi 101, bạn có thể có URL sai. Vì vậy, hãy đảm bảo rằng URL bạn đang đưa ra yêu cầu là chính xác. Ngoài ra hãy chắc chắn rằng máy chủ của bạn có khả năng phục vụ tệp quiz.xml của bạn.

Có thể bạn sẽ phải gỡ lỗi bằng cách đơn giản hóa/thu hẹp nơi xảy ra sự cố. Vì vậy, tôi sẽ bắt đầu bằng cách thực hiện một yêu cầu đồng bộ dễ dàng, do đó bạn không phải lo lắng về công cụ "gọi lại hàm". Vì vậy, đây là một ví dụ từ MDN để thực hiện một yêu cầu đồng bộ:

var request = new XMLHttpRequest(); 
request.open('GET', 'file:///home/user/file.json', false); 
request.send(null); 

if (request.status == 0) 
    console.log(request.responseText); 

Ngoài ra, nếu bạn chỉ cần bắt đầu với Javascript, bạn có thể tham khảo MDN cho API Javascript tài liệu hướng dẫn/ví dụ/hướng dẫn.

+0

Tôi vẫn gặp sự cố này. Khi tôi thử đoạn mã thứ hai của Nadir, tôi nhận được lỗi sau. Tôi nghi ngờ đây là vấn đề của tôi "XMLHttpRequest không thể tải tệp: ///Users/me/My%20Directory%20quiz/quiz.xml. Yêu cầu nguồn gốc chéo chỉ được hỗ trợ cho HTTP." – Muricula

+0

Url bạn nhập phải giống như trước đây ... url từ ví dụ này chỉ là url mẫu ... –

+0

bạn đang sử dụng máy chủ web nào ?? –

2

tôi thấy 2 vấn đề có thể:

Vấn đề 1

  • đối tượng XMLHttpRequest đã không hoàn thành tải dữ liệu tại thời điểm bạn đang cố gắng sử dụng nó

Giải pháp: assign chức năng gọi lại cho các đối tượng "onreadystatechange" -event và xử lý dữ liệu trong hàm đó

xmlhttp.onreadystatechange = callbackFunctionName; 

Khi số state đã đạt đến XONG (4), nội dung phản hồi đã sẵn sàng để đọc.

Vấn đề 2

  • đối tượng XMLHttpRequest không tồn tại trong tất cả các trình duyệt (theo tên đó)

Giải pháp: Hoặc sử dụng một try-catch để tạo các đối tượng chính xác cho trình duyệt đúng (ActiveXObject trong IE) hoặc sử dụng một khung công tác, ví dụ jQuery ajax-method

Lưu ý: nếu bạn quyết định sử dụng phương pháp jQuery ajax, bạn gán chức năng gọi lại với jqXHR.done()

1

Vấn đề là khả năng nói dối với dòng

window.onload = onPageLoad(); 

bby bao gồm dấu ngoặc bạn đang nói onload phải bằng sự trở lại của onpPageLoad(). Ví dụ:

/*Example function*/ 
function onPageLoad() 
{ 
    return "science"; 
} 
/*Set on load*/ 
window.onload = onPageLoad() 

Nếu bạn in giá trị của cửa sổ.truy cập vào bảng điều khiển, nó sẽ là khoa học.

Giải pháp là thay đổi dòng để

window.onload = onPageLoad; 

Cuối cùng

Để có được giá trị lời, bạn sẽ cần một hàm readystatechange cho đối tượng xmlHttp của bạn, ví dụ ở vị trí của

xmlDoc=xmlhttp.responseXML; 
parser=new DOMParser(); //this code is untested as it does not run this far. 

bạn có thể sử dụng

xmlHttp.onreadystatechange = function() 
{ 
    if(this.readyState == 4){ 
     //Do your thing 
    } 
} 
+0

Hầu hết những gì bạn nói là đúng, nhưng để gán giá trị trả về của hàm cho 'window.onload' có nghĩa là hàm phải được thực hiện và do đó sẽ hoạt động. Cũng lưu ý rằng nó không tạo ra sự khác biệt khi hàm được khai báo, vì các khai báo hàm trong JavaScript được treo lên đầu phạm vi mà chúng được khai báo. –

+0

Tôi đồng ý hoàn toàn với tuyên bố của bạn về tuyên bố và đã chỉnh sửa câu trả lời của tôi; dường như tôi đã bị mù bởi các dấu ngoặc đơn sai. – CBusBus