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?
Trả lời
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
}
});
Nhưng ... nhưng ... có một cách. –
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.
Đ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. –
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
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. –
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);
}
}
};
}());
bạn có thể làm như thế nào? bất kỳ ví dụ nào? –
Eric: Tôi đã thêm một ví dụ. –
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.
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.
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ờ.
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
- 1. Rails phát hiện nếu yêu cầu là AJAX
- 2. CakePHP - Nếu yêu cầu là JSON?
- 3. PHP tự động giết một tập lệnh nếu yêu cầu HTTP bị hủy/đóng
- 4. Node.JS: Phát hiện nếu được gọi qua yêu cầu hoặc trực tiếp bằng dòng lệnh
- 5. Tìm tập lệnh PHP yêu cầu register_globals
- 6. Phát hiện nếu tập tin là MP3
- 7. scala lỗi: phát hiện và yêu cầu là cùng
- 8. Phát hiện các yêu cầu HTTPS trong PHP
- 9. có yêu cầu về json trong node.js
- 10. Bash - cách phát hiện xem apt-get có yêu cầu khởi động lại
- 11. Bản vẽ ASCII xuất hiện dưới dạng phản hồi JSON theo yêu cầu cho Google
- 12. C#: Làm thế nào có thể khởi động lại yêu cầu được phát hiện cho các cửa sổ 7
- 13. Phát hiện các yêu cầu AJAX trên NodeJS với Express
- 14. AjaxControlToolkit yêu cầu tập lệnh ASP.NET Ajax 4.0
- 15. Lệnh curl để phát hành yêu cầu POST
- 16. Tại sao "tập lệnh" yêu cầu thẻ đóng nhưng "meta" thì không?
- 17. Làm thế nào bạn có thể yêu cầu bash cho các tùy chọn hiện tại?
- 18. Liệu app_offline.htm có dừng các yêu cầu hiện tại hay chỉ các yêu cầu mới?
- 19. Tải tập lệnh động
- 20. Chia sẻ tập lệnh yêu cầu virtualenv được kích hoạt
- 21. PHP yêu cầu không thành công với không có lỗi
- 22. Ruby yêu cầu 'tệp' không hoạt động nhưng yêu cầu './file' thực hiện. Tại sao?
- 23. Yêu cầu ajax có hoạt động nếu JavaScript bị tắt trong trình duyệt không?
- 24. Yêu cầu JSON API Ebay
- 25. node.js, phát hiện lỗi sao cho tập lệnh không bị hỏng?
- 26. Phạm vi chức năng JavaScript giữa các thẻ tập lệnh
- 27. đường ray - InvalidAuthenticityToken cho yêu cầu json/xml
- 28. Phát hiện đáng tin cậy nếu tập lệnh đang thực thi trong một nhân viên web
- 29. Có cách nào để phát hiện ra các lỗi tập lệnh phía máy khách với Watin không?
- 30. GWT - thực hiện các yêu cầu GET
bạn đang thực hiện các yêu cầu JSON này như thế nào? –
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
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? –