27

Điều kiện tiên quyết:IE9 ném ngoại lệ khi tải tập lệnh trong khung nội tuyến. Tại sao?

Tôi có trang aspx có iframe bên trong. Khung nội tuyến này trỏ đến url được xử lý bởi MVC trên cùng một trang web (đó là trang web lai, cả ASP.NET và ASP.NET MVC tiêu chuẩn). Trang kết quả được hiển thị bởi MVC chứa rất nhiều tham chiếu tập lệnh.

Sự cố:

IE9 ném ngoại lệ cho mỗi tập lệnh đơn lẻ tải trong khung nội tuyến. Các trường hợp ngoại lệ này tương tự như trường hợp này:

Error: 'Function' is undefined 

Tức là, những điều cơ bản nhất mà mỗi cửa sổ đều không có mặt. Khi bạn nhấp qua tất cả các cửa sổ bật lên này, trang chỉ hoạt động như được thiết kế!
Nếu tôi tải URL từ thuộc tính src trực tiếp từ <iframe /> vào trình duyệt, mọi thứ hoạt động như mong đợi.
Nếu tôi mở trang trong một trình duyệt khác (tôi đã thử Opera, Firefox), mọi thứ hoạt động như mong đợi - không có lỗi.

Vậy IE9 muốn gì?

+0

Bất cứ điều gì IE9 muốn nó sẽ bị bỏ lại, đánh giá bởi thực tế là * chúng tôi * muốn * mã và thông báo lỗi được xác định chính xác *. – Jon

+1

"chức năng" không có vốn F trong JavaScript. Đây có phải là vấn đề không? –

+2

No. [Chức năng đối tượng toàn cầu] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function) –

Trả lời

27

this msdn page về lỗi này (hoặc tính năng).

Bạn nhận được các loại lỗi này khi bạn di chuyển phần tử iframe xung quanh trong DOM. Trong những trường hợp như vậy, rác IE 9 thu thập khung nội tuyến (gây ra lỗi không xác định của bạn) và tải lại nó ở vị trí khác.

Nói chung, bạn nên tạo các phần tử, thiết lập thuộc tính src nó chỉ lần và sau đó đặt nó ở đâu đó trong cây DOM lần. Nó không có gì để làm với mã chạy trong khung nội tuyến chính nó.

+0

+1 - Tôi đã có vấn đề chính xác này không phải năm giờ trước, và điều duy nhất tôi thay đổi giữa "làm việc" và "không làm việc" là một chút mã đã di chuyển iframe trong DOM. Việc xóa mã bit đó đã khắc phục được sự cố (và tôi đã sử dụng chỉ mục z để tạo ra cùng một hiệu ứng). –

+0

câu trả lời tương tự được tìm thấy trên bài đăng này: http://stackoverflow.com/questions/5514973/javascript-code-in-iframes-in-ie9-not-working – ERR0

+0

Tôi đã đi nghỉ nên không thể trả lời sớm hơn, nhưng điều này dường như có liên quan. Tuy nhiên trong các khu vực bị ảnh hưởng nó nói rằng điều này đã được thay đổi từ IE8 sang IE9 nhưng tôi đã nhìn thấy các hành vi API còn thiếu trong IE8 là tốt ... Tuy nhiên, chúc mừng với các điểm thưởng! :) –

2

Tôi đã gặp phải tình huống tương tự này trong tự nhiên. triệu chứng cơ bản:

  • Bạn mã kịch bản tải trong một iframe
  • Mã kịch bản chạy sớm (từ phần đầu hoặc trên cùng của cơ thể)
  • IE phàn nàn về một số thiếu đối tượng bẩm sinh

Tôi thấy rằng nó thường có thể được ngăn chặn bằng cách trì hoãn việc thực thi mã kịch bản cho đến khi tải lên hoặc DOMContentLoaded ... Không có nhiều trợ giúp tôi biết nhưng đây là một trong những lỗi kịch bản IE khó khăn nhất mà tôi từng gặp phải. Tôi tăng điểm số câu hỏi của bạn, hy vọng nó sẽ được tìm thấy bởi những người khác là tốt và chúng tôi có thể nhận được một câu trả lời chi tiết hơn.

Cũng thấy câu hỏi này: Error in Internet Explorer 9 (not earlier versions or other browsers) when including jQuery in an iframe

2

Đặt khối kịch bản sau đây ở đầu rất của iFrame html < đầu > dường như giải quyết vấn đề trong trường hợp của tôi. Về cơ bản, nó buộc khung nội tuyến tải lại, như một số đã chỉ ra, giải quyết vấn đề.Nó có vẻ tương đối an toàn, bởi vì, không có những thứ như 'Object' và 'Date', javascript cơ bản là vô dụng.

<script type="text/javascript"> 
    if(typeof(Object)==="undefined"){ 
     window.location.reload(); 
    } 
</script> 
1

Điều tra thêm cho thấy giải pháp là thêm iframe vi phạm vào vị trí dom của nó TRƯỚC KHI đặt thuộc tính 'src'.

Khi đã đặt 'src', việc thay đổi vị trí của khung nội tuyến trong ngăn xếp DOM buộc IE9 phải thu gom rác.

Khi đã đặt 'src', khung nội tuyến có thể được thay đổi kích thước và thay đổi thông qua định vị css, nhưng không thể thay đổi vị trí tương đối trong ngăn xếp DOM.

Thông thường, các plugin như hộp thoại và hộp đèn sẽ chèn một iframe bằng src đã được đặt vào vị trí, sau đó nối/thêm vào hoặc bất kỳ thứ gì, kích hoạt GC diễn ra.

0
function waitForjQuery(){ 
    if(typeof jQuery!='undefined'){ 
     //Do yor stuff! 
    } 
    else{ 
     setTimeout(function(){ 
      waitForjQuery(); 
     },500); 
    } 
} 
waitForjQuery(); 
+1

Mã chưa được giải nén không thực sự hữu ích. –

+1

Làm thế nào điều này thậm chí còn trả lời câu hỏi? Nó thậm chí không có vẻ áp dụng cho câu hỏi – JoseM

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