Korzystam z Firebug i mam kilka instrukcji, takich jak:
console.log("...");
na mojej stronie. W IE8 (prawdopodobnie także we wcześniejszych wersjach) pojawiają się błędy skryptu informujące, że „konsola” jest niezdefiniowana. Próbowałem umieścić to na górze mojej strony:
<script type="text/javascript">
if (!console) console = {log: function() {}};
</script>
wciąż dostaję błędy. W jakikolwiek sposób pozbyć się błędów?
javascript
internet-explorer
internet-explorer-8
ie-developer-tools
użytkownik246114
źródło
źródło
typeof
w swoim, jeśli pozwoli uniknąć niezdefiniowanych błędów:if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Odpowiedzi:
Próbować
Nieokreślona zmienna nie może być bezpośrednio przywołana. Jednak wszystkie zmienne globalne są atrybutami o tej samej nazwie w kontekście globalnym (
window
w przypadku przeglądarek), a dostęp do niezdefiniowanego atrybutu jest w porządku.Lub użyj,
if (typeof console === 'undefined') console = ...
jeśli chcesz uniknąć magicznej zmiennejwindow
, zobacz odpowiedź @Tim Down .źródło
<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>
na górze strony! Dzięki, Kenny.var console = console || { log: function() {} };
window
:var console = window.console || { log: function() {} };
Wklej następujące elementy u góry JavaScript (przed użyciem konsoli):
Opakowanie funkcji służy do zawężenia zakresu zmiennych, aby nie definiować żadnych zmiennych. Chroni to przed niezdefiniowanymi
console
i niezdefiniowanymiconsole.debug
(i innymi brakującymi metodami).EDYCJA: Zauważyłem, że HTML5 Boilerplate używa podobnego kodu w pliku js / plugins.js, jeśli szukasz rozwiązania, które (prawdopodobnie) będzie aktualizowane.
źródło
Inną alternatywą jest
typeof
operator:Jeszcze inną alternatywą jest użycie biblioteki rejestrowania, takiej jak mój własny log4javascript .
źródło
var
? To tylko myliłoby rzeczy tutaj. A może chodzi Ciwindow.console
raczej o przypisanie do niżconsole
?var
. Dlaczego miałoby to wprowadzać w błąd?typeof
Gwarantowane jest zwrócenie ciągu znaków i"undefined"
jest to ciąg znaków. Gdy dwa operandy są tego samego typu==
i===
zostały określone tak, aby wykonywać dokładnie te same kroki. Użycietypeof x == "undefined"
to solidny sposób na sprawdzenie, czyx
jest niezdefiniowany w jakimkolwiek zakresie i w dowolnym środowisku zgodnym z ECMAScript 3.Aby uzyskać bardziej niezawodne rozwiązanie, użyj tego fragmentu kodu (wziętego z kodu źródłowego Twittera):
źródło
W moich skryptach używam skrótu:
lub, jeśli nie jest możliwa lub niewykonalna edycja każdej linii console.log, tworzę fałszywą konsolę:
źródło
if(!console) {console = {} ; console.log = function(){};}
!window.console && (window.console = { log: function () { } });
Możesz użyć,
console.log()
jeśli maszDeveloper Tools
otwarty w IE8, a także możesz użyć polaConsole
tekstowego na karcie skryptu.źródło
źródło
this
odnosiwindow
.Na podstawie dwóch poprzednich odpowiedzi autorstwa
oraz dokumentacje dotyczące
Oto implementacja najlepszych starań dla tego problemu, co oznacza, że jeśli istnieje plik console.log, to uzupełnia luki w nieistniejących metodach za pomocą console.log.
Na przykład dla IE6 / 7 możesz zastąpić rejestrowanie alertem (głupie, ale działa), a następnie dołączyć poniższego potwora (nazwałem to console.js): [Możesz swobodnie usuwać komentarze według własnego uznania, zostawiłem je w celach informacyjnych, minimizer może sobie z nimi poradzić]:
i console.js:
źródło
methods.hasOwnProperty(method) &&
w pętli for.> x = { a: 1, b: 2}
->Object {a: 1, b: 2}
ifor(var f in x) {console.log(f + " " + x[f]);} 'end'
->a 1 b 2 "end"
. Tak więc utworzony obiekt anonimowy nie ma żadnych dodatkowych właściwości imethods
jest po prostu tworzony przedfor
pętlą. Czy można zhakować powyższe?var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}
Nigdy nie wiadomo, co biblioteka zrobiła z obiektami w łańcuchu dziedziczenia obiektu, z którym pracujesz. Dlatego zaleca się stosowanie narzędzi jakości kodu javascript, takich jak jshint i jslinthasOwnProperty
.W IE9, jeśli konsola nie jest otwarta, ten kod:
pokaże „obiekt”, ale ten kod
wyrzuci wyjątek TypeError, ale nie zwróci niezdefiniowanej wartości;
Tak więc gwarantowana wersja kodu będzie wyglądać podobnie do tego:
źródło
Używam tylko console.log w moim kodzie. Dołączam więc bardzo krótki 2 liniowiec
źródło
Zauważyłem, że OP używa Firebug z IE, więc załóżmy, że to Firebug Lite . Jest to dziwna sytuacja, gdy konsola zostaje zdefiniowana w IE, gdy okno debugera jest otwarte, ale co się stanie, gdy Firebug już działa? Nie jestem pewien, ale być może metoda „firebugx.js” może być dobrym sposobem na przetestowanie w tej sytuacji:
źródło:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
(zaktualizowane linki 12/2014)
źródło
Używam fauxconsole ; Zmodyfikowałem trochę css, aby wyglądał ładniej, ale działa bardzo dobrze.
źródło
Aby debugować w IE, sprawdź ten log4javascript
źródło
W przypadku obsługi IE8 lub konsoli ograniczonej do console.log (bez debugowania, śledzenia, ...) możesz wykonać następujące czynności:
Jeśli nie zdefiniowano konsoli LUB konsoli.log: Utwórz funkcje zastępcze dla funkcji konsoli (śledzenie, debugowanie, rejestr, ...)
window.console = { debug : function() {}, ...};
W przeciwnym razie, jeśli zdefiniowano plik console.log (IE8) ORAZ plik console.debug (dowolny inny) nie jest zdefiniowany: przekieruj wszystkie funkcje rejestrowania do pliku console.log, co pozwoli zachować te dzienniki!
window.console = { debug : window.console.log, ...};
Nie jestem pewien co do obsługi asertu w różnych wersjach IE, ale wszelkie sugestie są mile widziane. Tutaj także opublikowałem tę odpowiedź: Jak korzystać z logowania do konsoli w Internet Explorerze?
źródło
źródło
Skrót konsoli w TypeScript:
źródło
Możesz skorzystać z poniższych, aby uzyskać dodatkowy stopień ubezpieczenia, który obejmuje wszystkie podstawy.
typeof
Pierwsze użycie pozwoli uniknąćundefined
błędów. Użycie===
spowoduje również, że nazwa typu będzie w rzeczywistości ciągiem „niezdefiniowany”. Na koniec będziesz chciał dodać parametr do podpisu funkcji (wybrałemlogMsg
arbitralnie), aby zapewnić spójność, ponieważ do funkcji dziennika przekazujesz wszystko, co chcesz wydrukować w konsoli. Dzięki temu masz dokładną inteligencję i unikasz wszelkich ostrzeżeń / błędów w twoim IDE świadomym JS.źródło
Czasami konsola będzie działać w IE8 / 9, ale w innych przypadkach zawiedzie. To nieobliczalne zachowanie zależy od tego, czy masz otwarte narzędzia programistyczne i jest opisane w pytaniu o przepływ stosu. Czy IE9 obsługuje plik console.log i czy jest to prawdziwa funkcja?
źródło
Wystąpił podobny problem z uruchomieniem pliku console.log w oknach podrzędnych w IE9, utworzonych przez funkcję window.open.
Wygląda na to, że w tym przypadku konsola jest zdefiniowana tylko w oknie nadrzędnym i jest niezdefiniowana w oknach podrzędnych, dopóki ich nie odświeżysz. To samo dotyczy dzieci okien potomnych.
Rozwiązuję ten problem, zawijając następną funkcję w dzienniku (poniżej znajduje się fragment modułu)
źródło
Po tak wielu problemach z tym problemem (ciężko jest debugować błąd, ponieważ jeśli otworzysz konsolę programisty, błąd już się nie zdarza!) Postanowiłem stworzyć kod przepełnienia, aby nigdy więcej się tym nie przejmować:
Osobiście używam tylko console.log i console.error, ale ten kod obsługuje wszystkie inne funkcje przedstawione w sieci Mozzila Developer Network: https://developer.mozilla.org/en-US/docs/Web/API/console . Po prostu umieść ten kod na górze strony i gotowe.
źródło
Możesz używać console.log (...) bezpośrednio w Firefoksie, ale nie w IE. W IE musisz użyć window.console.
źródło