Błąd IE9 - JavaScript działa tylko po jednorazowym otwarciu narzędzi programistycznych.
Nasza strona oferuje użytkownikom bezpłatne pobieranie plików PDF i ma prostą funkcję „wprowadź hasło, aby pobrać”. Jednak w ogóle nie działa w przeglądarce Internet Explorer.
Możesz zobaczyć sam w tym przykładzie .
Karta pobierania to „makeuseof”. W każdej innej przeglądarce działa dobrze. W IE oba przyciski nic nie robią.
Najciekawsze, co znalazłem, to to, że jeśli otworzysz i zamkniesz pasek narzędzi programisty za pomocą F12, wszystko nagle zacznie działać.
Wypróbowaliśmy tryb kompatybilności i nic nie robi różnicy.
Jak sprawić, by działało w Internet Explorerze?
javascript
internet-explorer
internet-explorer-9
James Bruce
źródło
źródło
gulp-strip-debug
. Usuwa wszystkieconsole.*
metody, idealne do kompilacji produkcyjnych lub testowania w IE.console
, ale z moim wykorzystaniem kątowego i buforowania żądań get. Zobacz odpowiedzi tutaj i tutaj, aby uzyskać więcej.Odpowiedzi:
Wygląda na to, że możesz mieć jakiś kod debugujący w swoim javascript.
Opisywane przez Ciebie doświadczenie jest typowe dla kodu, który zawiera
console.log()
lub jakąkolwiek innąconsole
funkcjonalność.console
Obiekt jest aktywna tylko wtedy, gdy Dev Toolbar jest otwarty. Wcześniej wywołanie obiektu konsoli spowoduje zgłoszenie go jakoundefined
. Po otwarciu paska narzędzi konsola będzie istnieć (nawet jeśli pasek narzędzi zostanie następnie zamknięty), więc wywołania konsoli będą wtedy działać.Istnieje kilka rozwiązań tego:
Najbardziej oczywistym jest przejście przez kod i usunięcie odniesień do
console
. I tak nie powinieneś zostawiać takich rzeczy w kodzie produkcyjnym.Jeśli chcesz zachować odwołania do konsoli, możesz zawinąć je w
if()
instrukcję lub w inny warunek, który sprawdza, czy obiekt konsoli istnieje przed próbą jego wywołania.źródło
if(!console) {console={}; console.log = function(){};}
if(!console)
spowoduje ten sam błąd - powinien przeczytaćif(!window.console)
HTML5 Boilerplate ma ładny, gotowy kod do rozwiązywania problemów z konsolą:
Jak wskazano w komentarzach @ plus, najnowsza wersja jest dostępna na ich stronie GitHub
źródło
src
podkatalogu: github.com/h5bp/html5-boilerplate/blob/master/src/js/plugins.jsOto inny możliwy powód oprócz
console.log
problemu (przynajmniej w IE11):Gdy konsola nie jest otwarta, IE wykonuje dość agresywne buforowanie, więc upewnij się, że wszystkie
$.ajax
połączenia lubXMLHttpRequest
połączenia mają ustawioną wartość false.Na przykład:
Gdy konsola programisty jest otwarta, buforowanie jest mniej agresywne. Wygląda na błąd (a może funkcję?)
źródło
To rozwiązało mój problem po niewielkiej zmianie. Dodałem następujące na mojej stronie HTML, aby naprawić problem IE9:
źródło
Oprócz
console
problemu dotyczącego używania wspomnianego w zaakceptowanej odpowiedzi i innych, istnieje co najmniej inny powód, dla którego czasami strony w Internet Explorerze działają tylko z aktywowanymi narzędziami programistycznymi.Gdy narzędzia programistyczne są włączone, IE tak naprawdę nie używa pamięci podręcznej HTTP (przynajmniej domyślnie w IE 11), jak w trybie normalnym.
Oznacza to, że jeśli Twoja witryna lub strona ma problem z buforowaniem (jeśli buforuje więcej niż powinien, na przykład - tak było w moim przypadku), nie zobaczysz tego problemu w trybie F12. Więc jeśli javascript wykonuje niektóre buforowane żądania AJAX, mogą nie działać zgodnie z oczekiwaniami w trybie normalnym i działać poprawnie w trybie F12.
źródło
Myślę, że to może pomóc, dodając to przed dowolnym tagiem javascript:
źródło
try catch
wykrycie, że zmienna istnieje, jest złym pomysłem. Jest nie tylko powolny, ale jeśli masz więcej niż jedną instrukcję w swoim bloku try, możesz otrzymać wyjątek z innego powodu. Nie używaj tego, przynajmniej użyjif (typeof console == 'undefined')
Jeśli używasz AngularJS w wersji 1.X, możesz skorzystać z usługi $ log zamiast bezpośrednio z pliku console.log.
https://docs.angularjs.org/api/ng/service/$log
Więc jeśli masz coś podobnego do
możesz go zastąpić
Angular 2+ nie ma wbudowanej usługi logowania .
źródło
Jeśli używasz
angular
i np.9, 10
Lubedge
używasz:Aby całkowicie wyłączyć
cache
.źródło
Zdarzyło mi się to w IE 11. Dzwoniłem do funkcji .load jquery. Zrobiłem to po staremu i umieściłem coś w adresie URL, aby wyłączyć buforowanie.
źródło
Mam jeszcze jedną alternatywę dla rozwiązań oferowanych przez runeks i todotresde, która pozwala także uniknąć pułapek omawianych w komentarzach do odpowiedzi Spudleya :
Jest nieco niechlujny, ale z drugiej strony jest zwięzły i obejmuje wszystkie metody logowania zawarte w odpowiedzi runeks i ma tę ogromną zaletę, że można otworzyć okno konsoli IE w dowolnym momencie i dzienniki napływają.
źródło
Wystąpił ten problem w IE 11 w systemie Windows 7 i Windows 10. Odkryliśmy, na czym dokładnie polegał problem, włączając funkcje debugowania dla IE (IE> Opcje internetowe> karta Zaawansowane> Przeglądanie> Odznacz Wyłącz debugowanie skryptu (Internet Explorer) ). Ta funkcja jest zwykle sprawdzana w naszym środowisku przez administratorów domeny.
Problem polegał na tym, że używaliśmy tej
console.debug(...)
metody w naszym kodzie JavaScript. Założeniem przyjętym przez programistę (mnie) było to, że nie chciałem niczego pisać, jeśli konsola narzędzi programistycznych klienta nie była jawnie otwarta. Chociaż Chrome i Firefox wydawały się zgadzać z tą strategią, IE 11 nie spodobało się jej ani trochę. Zmieniając wszystkieconsole.debug(...)
instrukcje naconsole.log(...)
instrukcje, byliśmy w stanie nadal rejestrować dodatkowe informacje w konsoli klienta i wyświetlać je, gdy były otwarte, ale w inny sposób ukrywać je przed typowym użytkownikiem.źródło
Ustawiam rozdzielczość i naprawiam problem. Wygląda na to, że żądanie AJAX, które wstawiłem do JavaScript, nie było przetwarzane, ponieważ moja strona miała problem z pamięcią podręczną. jeśli Twoja witryna lub strona ma problem z pamięcią podręczną, nie zobaczysz tego problemu w trybie programisty / F12. moje buforowane żądania AJAX JavaScript mogą nie działać zgodnie z oczekiwaniami i powodować awarię wykonywania, która nie ma żadnego problemu z F12. Właśnie dodałem nowy parametr, aby bufor był fałszywy.
Wygląda na to, że IE musi to być fałsz, aby działanie AJAX i javascript działało poprawnie.
źródło