2009-09-18 25 views
5

Tôi thực hiện một loạt các yêu cầu json với các thẻ tập lệnh động. Có thể phát hiện nếu có lỗi trong yêu cầu (ví dụ: lỗi 503, lỗi 404) và chạy một số lỗi khi phát hiện lỗi?Thẻ tập lệnh động cho các yêu cầu JSON ... phát hiện nếu có lỗi XXX?

+0

bạn đang thực hiện các yêu cầu JSON này như thế nào? –

+0

Tôi đang sử dụng document.createElement ('script'), thay đổi src của phần tử thành URL mong muốn rồi thêm phần tử vào DOM. Tôi đã thử đặt appendChild trong một khối try/catch, nhưng điều đó không làm gì cả. – rawrrrrrrrr

+4

Bạn có thể cập nhật câu hỏi bằng đoạn mã hoặc bài đăng trên http://jsbin.com/, nó có giúp hoàn chỉnh không? –

Trả lời

11

sử dụng ajax để thay thế. AFAIK không có cách nào để phát hiện xem thẻ script có tải hay không, và nếu không, tại sao nó không tải. Sử dụng ajax bạn có thể tải json và nó sẽ cho bạn biết lý do tại sao nó không tải.

Sử dụng một thư viện như jQuery này trở nên rất đơn giản:

$.ajax({ 
    type: "GET", 
    url: "test.js", 
    dataType: "script", 
    error: function(xhr, error, exception){ 
    alert(xhr.status); //Will alert 404 if the script does not exist 
    } 
}); 
+1

Nhưng ... nhưng ... có một cách. –

4

AFAIK, không có cách nào để truy cập mã trạng thái của một số nội dung bên ngoài được tải từ tài liệu (chẳng hạn như tập lệnh, kiểu hoặc hình ảnh). Thậm chí phát hiện lỗi (thông qua, nói, onerror trình xử lý sự kiện) không được hỗ trợ rộng rãi trên các trình duyệt.

Nếu bất cứ điều gì bạn đang tải xuống dưới SOP, hãy sử dụng XHR cho phép bạn truy cập vào tiêu đề phản hồi. Nếu không, bạn có thể thử xem xét gần đây được giới thiệu X-domain XHR.

1
+0

Điều này dường như là giải pháp. Nếu bạn đã thêm một số văn bản giải thích nó và/hoặc bao gồm mã mẫu từ trang được tham chiếu trong câu trả lời, bạn có thể nhận được một số upvotes và khen thưởng với câu trả lời được chấp nhận. –

+0

liên kết giải thích nó khá nhiều, không muốn gây ô nhiễm không gian với copy/paste entropy lol tăng lên. – Kane

+0

Tôi không tìm thấy liên kết này có liên quan. Bài viết được liên kết là về phát hiện tải thành công, không phát hiện lỗi. –

0

Nếu bạn muốn phát hiện lỗi, hãy nghe sự kiện error và so sánh thuộc tính fileName của lỗi với tên tệp của tập lệnh. Nếu chúng khớp nhau, bạn xử lý lỗi. Vấn đề là, tôi nghĩ rằng tài sản fileName là Firefox và Opera chỉ. Hầu hết các trình duyệt có một stacktrace cho các lỗi cũng có thể mô phỏng hành vi này.

Dưới đây là một ví dụ, theo yêu cầu của Eric Bréchemier:

var getErrorScriptNode = (function() { 
    var getErrorSource = function (error) { 
     var loc, replacer = function (stack, matchedLoc) { 
      loc = matchedLoc; 
     }; 

     if ("fileName" in error) { 
      loc = error.fileName; 
     } else if ("stacktrace" in error) { // Opera 
      error.stacktrace.replace(/Line \d+ of .+ script (.*)/gm, replacer); 
     } else if ("stack" in error) { // WebKit 
      error.stack.replace(/at (.*)/gm, replacer); 
      loc = loc.replace(/:\d+:\d+$/, ""); 
     } 
     return loc; 
    }, 
    anchor = document.createElement("a"); 

    return function (error) { 
     anchor.href = getErrorSource(error); 
     var src = anchor.href, 
     scripts = document.getElementsByTagName("script"); 
     anchor.removeAttribute("href"); 
     for (var i = 0, l = scripts.length; i < l; i++) { 
      anchor.href = scripts.item(i).src; 
      if (anchor.href === src) { 
       anchor.removeAttribute("href"); 
       return scripts.item(i); 
      } 
     } 
    }; 
}()); 
+0

bạn có thể làm như thế nào? bất kỳ ví dụ nào? –

+0

Eric: Tôi đã thêm một ví dụ. –

3

Tôi giả sử bạn muốn điều này để làm việc cross-domain, đó là lý do bạn không thể sử dụng XHR?

Thử tạo hai thẻ tập lệnh cho mỗi yêu cầu, yêu cầu JSONP chuẩn đầu tiên của bạn, thứ hai về cơ bản là trình xử lý lỗi.

Nếu thẻ tập lệnh đầu tiên thực hiện, sau đó xóa trình xử lý lỗi trong cuộc gọi lại của bạn. Nhưng nếu lần đầu tiên nhận được 404, trình xử lý lỗi bên trong thẻ tập lệnh thứ hai sẽ được chạy.

Bạn cũng có thể muốn đặt thời gian chờ, để đối phó với phản hồi JSONP chậm.

0

Nếu bạn cần phải vượt qua các tên miền (và cần trang để hoạt động một cách hợp lý), bạn phải sử dụng thẻ tập lệnh động.

Nếu bạn có quyền truy cập vào máy chủ từ xa, bạn có thể vượt qua trở lại một mã lỗi từ máy chủ, và có sự trở lại trang chủ 200.

Cho dù bạn có quyền truy cập hay không, bạn có thể sử dụng setTimeout khi bạn tạo thẻ script, chuyển một hàm sẽ kích hoạt lỗi nếu nó hết hạn trước khi trình xử lý jsonp được gọi. Đảm bảo rằng trình xử lý jsonp hủy bỏ nếu trình xử lý lỗi đã được gọi.

Bạn sẽ cần phải theo dõi từng yêu cầu thông qua bộ sưu tập toàn cầu, nhưng bạn sẽ có khả năng hủy và đếm yêu cầu. Điều này tương tự như cách mà các đối tượng XHR được quản lý bởi một thư viện như jQuery.

1

Nếu bạn đang sử dụng jQuery, hãy kiểm tra jQuery-JSONP là một plugin jQuery thực hiện công việc khá phù hợp khi thực hiện chèn <script> cho bạn cũng như phát hiện lỗi tìm nạp.

Trích dẫn từ trang dự án, jQuery-JSONP tính năng:

  • phục hồi lỗi trong trường hợp thất bại mạng hoặc phản ứng JSON vô hình thành,
  • điều khiển chính xác gọi lại đặt tên và làm thế nào nó được truyền trong URL,
  • nhiều yêu cầu với tên gọi lại cùng chạy đồng thời,
  • hai cơ chế bộ nhớ đệm (dựa trên trình duyệt và trang dựa),
  • khả năng tự abo rt yêu cầu giống như bất kỳ yêu cầu AJAX nào khác,
  • một cơ chế hết thời gian chờ.
+0

Nhưng không có cách nào để biết mã trạng thái thực tế của yêu cầu không thành công, phải không? – kangax

Các vấn đề liên quan