27

Warunek wstępny:IE9 zgłasza wyjątki podczas ładowania skryptów w elemencie iframe. Czemu?

Mam stronę aspx z wewnątrz iframe. Ten element iframe wskazuje adres URL obsługiwany przez MVC w tej samej witrynie (jest to strona hybrydowa, zarówno standardowa ASP.NET, jak i ASP.NET MVC). Wynikowa strona renderowana przez MVC zawiera wiele odniesień do skryptów.

Problem:

IE9 zgłasza wyjątek na każdego skryptu załadować go w iframe. Te wyjątki są podobne do tego:

Error: 'Function' is undefined 

Oznacza to, że najbardziej podstawowe rzeczy w każdym oknie są w jakiś sposób nieobecne. Po kliknięciu wszystkich tych okien wyskakujących strona działa tak, jak została zaprojektowana!
Jeśli załaduję adres URL z atrybutu src <iframe /> bezpośrednio w przeglądarce, wszystko działa zgodnie z oczekiwaniami.
Jeśli otworzę stronę w innej przeglądarce (próbowałem Opera, Firefox), wszystko działa zgodnie z oczekiwaniami - bez błędów.

Co więc chce IE9?

+0

Niezależnie od tego, czego chce IE9, pozostanie to niedobre, sądząc po tym, że * my * chcemy * kodu i wskazano komunikaty o błędach *. – Jon

+1

"Funkcja" nie ma dużego F w JavaScript. Czy to jest problem? –

+2

No. [Function Global Object] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Function) –

Odpowiedz

27

Istnieje this msdn page o tym błędzie (lub funkcji).

Otrzymujesz tego rodzaju błędy po przeniesieniu elementu elementu iframe w DOM. W takich przypadkach IE 9 śmieci zbiera element iframe (powodując nieokreślony błąd) i ładuje go w innym miejscu.

W ogóle, należy utworzyć element, ustawić jego atrybut src tylko raz a następnie umieścić go gdzieś w drzewie DOM raz. Nie ma nic wspólnego z kodem, który działa w samym elemencie iframe.

+0

+1 - Miałem ten problem niecałe pięć godzin temu, a jedyną rzeczą, którą zmieniłem pomiędzy "pracą" i "nie działa" jest fragment kodu, który przeniósł elementy iframe w DOM. Usunięcie tego fragmentu kodu naprawiło problem (a ja użyłem indeksu Z, aby uzyskać ten sam efekt). –

+0

Podobna odpowiedź została znaleziona w tym poście: http://stackoverflow.com/questions/5514973/javascript-code-in-iframes-in-ie--9-notworking – ERR0

+0

Byłem na wakacjach, więc nie mogłem odpowiedzieć wcześniej, ale to wydaje się powiązane. Jednak w Affected Areas jest napisane, że zostało to zmienione z IE8 na IE9, ale widziałem także brakujące API w IE8 ... Wciąż gratulacje z punktami za bounty! :) –

2

Spotkałem tę samą sytuację na wolności. Podstawowe objawy:

  • Państwo kod skryptu obciążenie w iframe
  • Kod skryptu działa wcześnie (z sekcji głowy lub górnej części ciała)
  • IE narzeka na brakujące obiektem wbudowanym

Zauważyłem, że często można temu zapobiec, opóźniając wykonanie kodu skryptu, dopóki nie zostanie on załadowany lub DOMContentLoaded ... Niewiele mi pomoże, ale jest to jeden z najtrudniejszych błędów skryptu IE, jakie kiedykolwiek spotkałem. Podniosłem wynik twojego pytania, mam nadzieję, że zostanie ono znalezione także przez innych i możemy uzyskać bardziej szczegółową odpowiedź.

zobaczyć również na to pytanie: Error in Internet Explorer 9 (not earlier versions or other browsers) when including jQuery in an iframe

2

Umieszczenie następujący blok skryptu na samym szczycie iFrame html < głowy > wydaje się rozwiązać problem w moim przypadku. Zasadniczo zmusza iframe do przeładowania, co jak niektórzy zauważyli, rozwiązuje problem.Wydaje się to stosunkowo bezpieczne, ponieważ bez rzeczy takich jak "Object" i "Date", javascript jest zasadniczo bezużyteczny.

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

Dalsze badania wykazały, że rozwiązaniem jest dodanie iframe przestępstwa na jego dom lokalizacja PRZED ustawienie atrybutu „źródło”.

Po ustawieniu "src" zmiana położenia ramki iframe w stosie DOM powoduje wymuszenie IE9 na śmieci.

Po ustawieniu "src" można zmienić rozmiar elementu iframe i zmienić go za pomocą pozycjonowania css, ale nie można zmienić względnej lokalizacji w stosie DOM.

Często wtyczki, takie jak okna dialogowe i lightboxy, wypychają element iframe, gdy src jest już ustawione w domenie, a następnie dołącza/dodaje lub cokolwiek, co powoduje, że GC ma miejsce.

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

Odkomentowany kod nie jest zbyt użyteczny. –

+1

Jak to nawet odpowiedzieć na pytanie? Nawet nie wydaje się, aby dotyczyć tego pytania – JoseM

Powiązane problemy