2011-01-17 30 views
66

Hiện nay tôi đang viết một tập tin JavaScript và có dòng sau:JSON đối tượng không xác định trong Internet Explorer 8

var res = "JSON=" + JSON.stringify(result); 

kết quả đang được thiết lập ngay trên dòng này. Vấn đề tôi gặp phải là IE8 (chỉ có IE8, tức là) đang báo cáo với tôi rằng JSON không được xác định bằng cách nào đó. Tôi không chắc chắn những gì để làm cho điều này kể từ khi tôi hiểu nó, IE8 là một trình duyệt thực hiện hỗ trợ JSON. Có ai có bất kỳ ý tưởng gì có thể xảy ra?

+4

Bạn có đang ở chế độ tương thích không? – SLaks

Trả lời

115

Hãy chắc chắn rằng bạn đang thực sự trong IE 8 chế độ bằng cách sử dụng các phương pháp ưa thích, một loại tài liệu tiêu chuẩn ...

<!DOCTYPE html> 

... hoặc phương pháp không mong muốn, các X-UA-Compatible thẻ meta/tiêu đề ...

<meta http-equiv="X-UA-Compatible" content="IE=EDGE" /> 

Xem Defining Document Compatibility để biết thêm thông tin.

+9

Chắc chắn đáng để kiểm tra điều này, vì chế độ compat có thể được kích hoạt mà bạn không nhất thiết phải nhận ra nó - mở Công cụ phát triển (F12) và tìm trong thanh công cụ cho chế độ trình duyệt. – Spudley

+2

Tôi đã bỏ dòng này và kiểm tra các công cụ dev. Chắc chắn đang chạy trong Chế độ Tiêu chuẩn của IE8. – keybored

+0

@keybored: một cái gì đó ** phải ** sẽ ghi đè đối tượng toàn cầu JSON sau đó. Kiểm tra mã của bạn cho các biến thể của 'JSON =' (mã ví dụ bạn viết trong câu hỏi là một khởi đầu tốt - bạn đang sử dụng 'eval'?). –

6

Những thứ khác không có loại tài liệu hoặc loại tài liệu sai hoặc một số lỗi với cú pháp html, sẽ buộc IE sử dụng chế độ tài liệu khác với những gì bạn mong đợi.

Tôi đã sử dụng đơn giản "" trong tài liệu thử nghiệm và sự vắng mặt của thẻ TITLE dưới dạng con của thẻ HEAD được tạo thành cửa sổ.JSON trở nên không xác định.

Hãy nhớ rằng luôn tốt hơn là kiểm tra tài nguyên dựa trên phiên bản trình duyệt. Và, nếu người dùng của bạn có thể sử dụng IE với mô phỏng các chế độ tài liệu, tốt hơn bạn nên có một đoạn mã để cung cấp JSON.parse và JSON.stringify khi người bản địa không xác định.

2

Có thể xảy ra mặc dù <!DOCTYPE html> nếu mã hóa trang là UTF-8 với BOM (dấu thứ tự byte). Hãy thử lưu tệp dưới dạng UTF-8 mà không cần BOM, bằng cách sử dụng trình chỉnh sửa văn bản phù hợp.

8

Sử dụng jQuery.parseJSON giải quyết vấn đề này cho tôi, trong trường hợp bạn đã sử dụng JQuery.

2
function parseJson(jsonString) { 
    if ($.browser.msie && $.browser.version < 8) { 
     return eval('(' + jsonString + ')'); 
    } 
    else { 
     return JSON.parse(jsonString); 
    } 
} 
+0

Điều này thậm chí không cố gắng trả lời câu hỏi. –

-1

Kiểm tra phiên bản jQuery. jQuery 2.0 drops support for IE 6, 7 and 8. Sử dụng jQuery 1.x thay vào đó, vẫn được hỗ trợ chính thức. bạn có thể sử dụng Mã này.

<script src="http://code.jquery.com/jquery-1.9.0.js"></script> 
<script src="http://code.jquery.com/jquery-migrate-1.2.1.js"></script> 

đọc thêm về jquery migrate.

nếu không kiểm tra hoạt động this article.

+2

OP không nói rằng anh ta đang sử dụng jQuery, và ngay cả khi anh ta, anh ta đang hỏi về bản địa 'JSON' toàn cầu mà không phải là một phần của jQuery. Câu trả lời này hoàn toàn không liên quan. –

0

đặt mã sau vào tệp js của bạn;

var JSON = JSON || {}; 

// implement JSON.stringify serialization 
JSON.stringify = JSON.stringify || function (obj) { 

var t = typeof (obj); 
if (t != "object" || obj === null) { 

    // simple data type 
    if (t == "string") obj = '"'+obj+'"'; 
    return String(obj); 

} 
else { 

    // recurse array or object 
    var n, v, json = [], arr = (obj && obj.constructor == Array); 

    for (n in obj) { 
     v = obj[n]; t = typeof(v); 

     if (t == "string") v = '"'+v+'"'; 
     else if (t == "object" && v !== null) v = JSON.stringify(v); 

     json.push((arr ? "" : '"' + n + '":') + String(v)); 
    } 

    return (arr ? "[" : "{") + String(json) + (arr ? "]" : "}"); 
} 
}; 

// implement JSON.parse de-serialization 
JSON.parse = JSON.parse || function (str) { 
if (str === "") str = '""'; 
eval("var p=" + str + ";"); 
return p; 
}; 
+2

Bỏ qua một bên việc thiếu bất kỳ nỗ lực nào để thực sự trả lời câu hỏi *, đây là mã khủng khiếp. Bên cạnh các tên biến một chữ cái đục, định dạng bị hỏng và khu nghỉ mát thành 'eval' để phân tích cú pháp, cú pháp là bộ chỉnh sửa không hoạt động; nó trả về kết quả sai đối với bất kỳ chuỗi nào có chứa dấu ngoặc kép, dòng mới, dấu gạch chéo ngược hoặc có thể là nhiều thứ khác. –

-1

Trong trường hợp của tôi, lỗi không xác định là vì tôi thiếu thư viện JSON.

Bạn có thể thêm đối tượng JSON như thế này (thay thế các đường dẫn tương đối với con đường riêng của bạn):

<script> 
     if (typeof window.JSON == 'undefined') { 
      document.write('<script src="../scripts/json2.js"><\/script>'); 
     } 
</script> 

Đối với thư viện json2: http://cdnjs.com/libraries/json2/

Ngoài ra còn có một thư viện json3: http://cdnjs.com/libraries/json3/

Sau đó, bạn có thể tham chiếu mã đó trong mã của mình:

var array = []; 
array[1] = "apple"; 
array[2] = "orange"; 
alert(JSON.stringify(array)); 
Các vấn đề liên quan