2014-10-08 40 views
6

Próbując zdeterminowaną elementu DOM przez prostą kontrolęinstanceof HTMLElement w IFRAME to nie element lub obiekt?

isElement = SomeThing instanceof Element 

działa w dokumencie głównym, ale nie na (wszystkie?) Węzłów w iframe.

Przykâadowa (Google Chrome): (mdiv jest DIV w dokumencie głównym, idiv DIV jest w iframe)

OMGWTF 
ok: mdiv instanceof Element ... true ... [object HTMLDivElement] 
ok: mdiv instanceof Object ... true ... [object HTMLDivElement] 
ko: idiv instanceof Element ... false ... [object HTMLDivElement] 
KO : idiv instanceof Object ... false ... [object HTMLDivElement] 

Istnieją różne implementacje JavaScript do dokumentu głównego i do dokumentów iframe ???

Proszę wyjaśnić mi, co jest nie tak.

przykład: (http://www.sbmintegral.sk/GITHUB/OMGWTF/obalka.xhtml)

Kod: obalka.xhtml (dokument główny)

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Obalka</title> 
    </head> 
    <body> 
    <div id="auto_filled_commands_container"> 
MAIN div id="auto_filled_commands_container"<br/> 
     <iframe id="auto_filled_commands_iframe" src='dopis.xhtml' style="width:98%;height:98%;"/> 
    </div> 
<div> 
<textarea id="OMGWTF" style="width:700px;height:200px"> 
mdiv = document.getElementById("auto_filled_commands_container"); 
ifram = document.getElementById("auto_filled_commands_iframe"); 
idiv = ifram.contentDocument.getElementById('auto_filled_commands'); 
OMGWTF = "OMGWTF \n" 
+"ok: mdiv instanceof Element ... "+(mdiv instanceof Element)+" ... "+mdiv+"\n" 
+"ok: mdiv instanceof Object ... "+(mdiv instanceof Object)+" ... "+mdiv+"\n" 
+"ko: idiv instanceof Element ... "+(idiv instanceof Element)+" ... "+idiv+"\n" 
+"KO : idiv instanceof Object ... "+(idiv instanceof Object)+" ... "+idiv+"\n" 
; 
document.getElementById('result_txta').value = OMGWTF; 
</textarea> 
<br/><input type="button" value="Eval code in upper textarea (to bypass possible developer tools error)" onclick=" 
    eval(document.getElementById('OMGWTF').value); 
"/><b>(2.)</b><br/> 
<textarea id="result_txta" style="width:700px;height:100px"> 
</textarea> 
</div> 
    </body> 
</html> 

Kod: Dopis.xhtml (dokument wewnętrzny ramki)

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
    <title>Dopis</title> 
    </head> 
    <body> 
    <div id="auto_filled_commands"> 
IFRAME div id="auto_filled_commands"<br/> 
     <div id="afc_formular"> 
IFRAME div id="afc_formular"<br/> 
<input id="cmnd" type="text" value="input id='cmnd'" /> 
<br/><input type="button" value="Click to get browser userAgent" onclick=" 
    var preEl = this.ownerDocument.getElementById('navUserAgent'); 
    var cdataEl = preEl.firstChild || preEl; /* IE don't know CDATA ?! */ 
    cdataEl.textContent=navigator.userAgent; 
"/><b>(1.)</b> 
<pre id="navUserAgent"><![CDATA[ 
]]></pre> 
     </div> 
    </div> 
    </body> 
</html> 

Wyniki obrazu (w IE, Chrome, Firefox, Opera) image omgwtf.png http://www.sbmintegral.sk/GITHUB/OMGWTF/omgwtf.png

+0

Co to jest "Element"? w DOM 1 poziomie, najbardziej podstawowym specyfikacji DOM z 1998 roku, elementy HTML implementują interfejs 'HTMLElement'; nie ma ani nie było nigdy oficjalnego interfejsu "Element". Powiedziawszy to, dlaczego nadal używasz XHTML? Pozbyliśmy się tego wieków temu. –

+0

Element jest konstruktorem HTMLElement! – supipd

+0

Element jest konstruktorem HTMLElement! Obiekt jest konstruktorem dowolnego obiektu, dlatego wszystkie obiekty muszą być obiektami Objectof. Dlaczego XHTML? ... ponieważ HTML nie ma CDATA XHTML:

HTML:
 1 < 3 < 134
co jest czystsze? Jeśli HTML jest dla leniwych ludzi, którzy nie są w stanie poprawnie napisać kodu XML, XHTML oferuje (jako XML) wiele zalet jak f.e. Wyspy XML – supipd

Odpowiedz

7

Istnieją różne implementacje javascript dla dokumentu głównego i dla dokumentów iframe ???

Tak. Element iframe ma własne środowisko z własnymi globaliami. Wypróbuj

var iwin = ifram.contentWindow; 
idiv instanceof iwin.HTMLElement; // true 
idiv instanceof iwin.Object; // true 
+0

Och, wydaje się jasne, ale dlaczego Firefox powiedział idiv instanceof Element ... true idiv instanceof Obiekt ... false – supipd

+0

Brak pomysłu. Może "Element == iwin.Element"? – Bergi