2017-04-17 6 views
0

Ich habe mir die source code for JQuery angesehen und versucht zu verstehen, wie ihre:
$(document).ready()
Funktion funktioniert.Warum gibt "document.body" False zurück?

Und auf Zeile 407 fand ich diesen Teil:
if (!document.body) {
, die ein Schlüssel zu sein, Nähen, um zu bestimmen, ob das Dokument geladen ist oder nicht.

Was ich frage mich, ist:
warum tut:
!document.body
return False?

während:
document.body
kehrt: [object HTMLBodyElement]
You can try it here nur entfernen die erste: .innerHTML

(ich keine richtige Antwort mit Google nach einer Stunde des Suchens & Lesung finden konnte, so dass ich jetzt hoffen Es gibt hier einige Profis, die mir helfen können, danke!)

Edit: ja ich weiß !document.body kommt von JavaScript statt JQuery, am Ende ist JQuery mit JavaScript-Code erstellt.

+0

Browser Kompatibilität Gründen Iirc. ein Relikt von OldIE –

+0

Jeder Browser ist anders. –

+0

Nicht der Kommentar Hinweis auf warum? Siehe auch https://developer.mozilla.org/en-US/docs/Web/API/Document/body#Browser_compatibility –

Antwort

0

Danke für die Antworten!
Ich glaube ich habe verstanden was passiert und was ich falsch verstanden habe.
ich erwartet hatte ursprünglich nur zwei verschiedene Zustände (wahr/falsch), aber in der Tat gibt es vier verschiedene Zustände, wie in dieser Tabelle dargestellt:

| Page loading state |  document.body  | !document.body | 
|=======================|===========================|================| 
| Before page is loaded |   ?    | !false -> true | 
|-----------------------|---------------------------|----------------| 
| After page is loaded | [object HTMLBodyElement] | !true -> false | 

Mein Fehler war, dass ich nur auf der „nach loaded“ sah - Zeile und erweitert, um true in der document.body Spalte zu sehen.

1

Was Sie fragen, hat nichts mit jQuery zu tun. Es ist in der Tat Javascript:

document.body gibt immer wahr, wenn der Körper geladen ist. Also! Document.body bedeutet, wenn der Körper noch nicht geladen ist, dann unternimm etwas.

Gemäß der Dokumentation (https://developer.mozilla.org/en-US/docs/Web/API/Document/body) arbeitet die Eigenschaft mit früheren Version von den meisten Browsern

enter image description here.

+0

Wenn ich versuche:' document.body' auf der W3Schools-Website bekomme ich keine 'False' /' True' Antwort, ich bekomme eine 'False' /' [object HTMLBodyElement] 'Antwort. –

0

Im Wesentlichen wegen Typumwandlung. Der !-Operator führt eine Typkonvertierung vom Objekt zum booleschen Wert "true" durch und negiert ihn dann auf den Wert false.

Formal vom ECMA-262 Ecmascript spec: (!)

12.5.9 Logisches NICHT Operator #

Let expr be the result of evaluating UnaryExpression. 
Let oldValue be ToBoolean(? GetValue(expr)). 
If oldValue is true, return false. 
Return true. 

und

7.1.2 ToBoolean (Argument) #

Die ab Stract Betrieb ToBoolean wandelt Argument auf einen Wert von Typ Boolean gemäß Tabelle 10: Tabelle 10: ToBoolean Conversions

Argument Type  Result 
Undefined  Return false. 
Null   Return false. 
Boolean  Return argument. 
Number  Return false if argument is +0, -0, or NaN; otherwise return true. 
String  Return false if argument is the empty String (its length is zero); 
         otherwise return true. 
Symbol  Return true. 
Object  Return true.