Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Firefox - getElementById() - Object wird als Function zurückgegeben

Frage Entwicklung Webentwicklung

Mitglied: mabue88

mabue88 (Level 2) - Jetzt verbinden

26.02.2015, aktualisiert 04.03.2015, 844 Aufrufe, 22 Kommentare

Hallo,

ich ändere in Javascript das 'data'-Attribute eines objects:

01.
function SetObjectUrl(object_id, url){ 
02.
	var my_object = document.getElementById(object_id); 
03.
 
04.
	if(typeof my_object === "object"){ 
05.
		my_object.setAttribute("data", url); 
06.
		console.log("Update für '" + object_id + "', URL = " + url); 
07.
08.
	else{ 
09.
		console.log("Falscher Typ von 'my_object': " + typeof my_object); 
10.
11.
}
In Chrome und Internet Explorer wird die aktualisierte Seite korrekt geladen. Im Firefox (36.0) wird die Seite nicht geladen. Das Objekt bleibt einfach leer (weiß).

Hier die Ausgabe aus der Konsole:

01.
Falscher Typ von 'my_object': function
Also wird das 'object' mit der entsprechenden ID als Funktion eingelesen. Mit Chrome und Internet Explorer wird das 'object' korrekt als 'object' eingelesen.

Weiss jemand warum es im Firefox als 'function' eingelesen wird?
Mitglied: eisbein
26.02.2015 um 17:50 Uhr
Hallo!

Nur mal zur Anregung. Wenn schon Javascript verwendet wird, warum dann nicht gleich JQuery oder dergleichen?

Gruß
Eisbein
Bitte warten ..
Mitglied: colinardo
26.02.2015, aktualisiert um 18:11 Uhr
Hallo mabue,
wie sieht das Objekt aus das du im DOM auswählst (welcher Tagtyp im DOM). Kann das Verhalten hier in Firefox testweise nicht nachvollziehen.

Deine Abfrage ist aber eher unzuverlässig. Ich würde eher so prüfen:
01.
if (my_object != null) { 
02.
    //..... 
03.
}else{ 
04.
    //.... 
05.
}
Der Grund: Es wird auch ein (null)Objekt zurückgegeben wenn die ID nicht gefunden wurde. Kannst du überprüfen mit console.log(typeof null)

Grüße Uwe
Bitte warten ..
Mitglied: mabue88
26.02.2015 um 19:15 Uhr
Bislang habe ich noch nicht mit JQuery gearbeitet. Wollte mal damit anfangen, aber ergab sich bisher noch nicht.
Vielleicht setzt mich mal dran.

@colinardo:
Mit der unzuverlässigen Abfrage gebe ich dir recht. Das ändere ich ab. Allerdings löst das mein Problem noch nicht.

Hier eine der Object-Zeilen im HTML-Dokument:
01.
<object id="my_id" class="my_class" type="text/html" data="default_page.php"></object>
Die hier definierte "default_page.php" soll eben dynamisch ersetzt werden.
In der HTML gibt es mehrere Objects, aber alle haben definitiv unterschiedliche IDs.

Getestet habe ich mit Firefox auf zwei unterschiedlichen Rechnern. Bei beiden der gleiche Sachverhalt.
Bitte warten ..
Mitglied: colinardo
26.02.2015, aktualisiert um 19:26 Uhr
Zitat von mabue88:
In der HTML gibt es mehrere Objects, aber alle haben definitiv unterschiedliche IDs.
Ahh du willst bestimmt den Tagname des Nodes prüfen oder ? Das machst du mit der Eigenschaft nodeName und nicht mit typeof
document.getElementById(object_id).nodeName
Kannst du aber auch mit
01.
var objects = document.getElementsByTagName('object'); 
02.
for(i=0;i<objects.length;i++){ 
03.
  objects[i].setAttribute("data","http://domain.de"); 
04.
}
über alle Object-Nodes iterieren ...
Bitte warten ..
Mitglied: mabue88
26.02.2015, aktualisiert um 19:35 Uhr
Die Abfrage ist nur dafür da, um sicherzustellen, dass auch wirklich ein Objekt mit der entsprechenden ID gefunden wurde.
Wenn das nicht der Fall ist, brauche ich der 'data'-Eigenschaft auch keine neue URL zuweisen.

Sprich: eigentlich nur Fehlervermeidung


Wenn ich jetzt beide Vorschläge von dir zu dem hier kombiniere...
01.
if(my_object != null && my_object.nodeName == "OBJECT"){ 
02.
    // Load new URL 
03.
}
dann sollte das für die Fehlervermeidung ausreichen, oder?

Habs gerade mal versucht, damit funktioniert es im Firefox...
Bitte warten ..
Mitglied: colinardo
26.02.2015, aktualisiert um 19:36 Uhr
Ja das ist OK bis auf den "case sense" von OBJECT, das kannst du z.B. mit match machen:
01.
if(my_object != null && my_object.nodeName.match(/^object$/i)){ 
02.
    // Load new URL 
03.
}
oder mit toLowerCase()... habe nämlich schon erlebt das die Eigenschaft nicht überall den Tag in Großbuchstaben zurückgegeben hat (komischerweise).
Bitte warten ..
Mitglied: mabue88
26.02.2015 um 19:36 Uhr
Ja, "case sense" wird noch "entfernt".

Mit dieser Lösung ist es gerade auch schon vorgekommen, dass die neue URL der 'data'-Eigenschaft zugeweisen wurde, das Object aber die Seite nicht geladen hat!
Das Problem liegt also noch irgendwo anders...
Bitte warten ..
Mitglied: colinardo
LÖSUNG 26.02.2015, aktualisiert 04.03.2015
Das Problem liegt also noch irgendwo anders...
Dazu kenne ich zu wenig von deiner Seite ... vermutlich musst du die Objects erst aus dem DOM entfernen und neu hinzufügen, damit sie Ihre Daten neu laden (gerade zu faul zu testen ;-P).
Bitte warten ..
Mitglied: mabue88
26.02.2015 um 19:57 Uhr
Kann ich das wie folgt machen?

- Bestehendes Object mittels ID in Variable schreiben
- Dieses Object im DOM löschen
- Das Object in der Variable anpassen ('data' ändern)
- Das Object in der Variable wieder in das DOM einfügen
Bitte warten ..
Mitglied: colinardo
26.02.2015, aktualisiert 27.02.2015

Ich würde das neue Element vorher einfügen (insertBefore), dann hast du noch seine Position im DOM und dann das alte Element löschen.
Bitte warten ..
Mitglied: mabue88
03.03.2015 um 10:34 Uhr
Hallo,

ich habe gerade noch etwas festgestellt.

Im Body der Informationsseite habe ich ein onclick-Event definiert: onclick="window.frameElement.click()"
Dadurch wird beim Anklicken der Seite das Click-Event an das (eventuell) darüber liegende Object weitergeleitet und dessen onclick-Event ausgelöst.

Nachdem ich die URL wie beschrieben aktualisiere, funktioniert das mit dem Event nicht mehr. Das Object, in welchem die Informationsseite geladen ist, empfängt das Event nicht mehr.

Ich vermute, dass ich um die von colinardo genannte Methode nicht herum komme...
Bitte warten ..
Mitglied: mabue88
03.03.2015 um 18:02 Uhr
Ich hatte gerade noch eine andere Idee, um eine Aktualisierung des Objects im eigentlichen Sinn zu umgehen.

Ist es möglich, von der Seite, in welcher das Object (über das wir reden) enthalten ist, auf eine Javascript-Funktion der im Object geladenen Seite zuzugreifen?

Dann könnte ich die Aktualisierung nämlich durch einen entsprechenden Funktionsaufruf mit Parametern durchführen...
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 18:21 Uhr
Zitat von mabue88:
Ist es möglich, von der Seite, in welcher das Object (über das wir reden) enthalten ist, auf eine Javascript-Funktion
der im Object geladenen Seite zuzugreifen?
Ja, das geht. Hol dir eine Referenz zum Object, darin gibt es dann die Eigenschaft contentWindow von der aus du alle deine JavaScript-Funktionen aus der Subsite aufrufen kannst.
document.getElementById('myObject').contentWindow.deineFunctionImObject();
Grüße Uwe
Bitte warten ..
Mitglied: mabue88
03.03.2015 um 18:34 Uhr
"document.getElementById('myObject').contentWindow" liefert mir ein 'undefined' zurück.

Hauptseite:
01.
<html> 
02.
	<head> 
03.
		<script type="text/javascript"> 
04.
			function CallChildFunction(){ 
05.
				console.log(document.getElementById("my_object").contentWindow); 
06.
				document.getElementById("my_object").contentwindow.load_func(); 
07.
08.
		</script> 
09.
	</head> 
10.
	<body> 
11.
		<object id="my_object" data="load.html"></object> 
12.
		<input type="button" value="Klick" onclick="CallChildFunction()"> 
13.
	</body> 
14.
</html>
Seite im Object:
01.
<html> 
02.
	<head> 
03.
		<script type="text/javascript"> 
04.
			function load_func(){ 
05.
				alert("load_func"); 
06.
07.
		</script> 
08.
	</head> 
09.
	<body> 
10.
		Page to Load 
11.
	</body> 
12.
</html>
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 18:49 Uhr
contentwindow
Du hast einen Schreibfehler... es muss contentWindow heißen.
Bitte warten ..
Mitglied: mabue88
03.03.2015 um 18:56 Uhr
Da hab ich die "falsche Version" geposted. Dachte auch an einen Schreibfehler und habe verschiedene Schreibweisen von 'contentWindow' getestet. Alle, inkl. 'contentWindow' geben ein 'undefined' zurück...
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 19:01 Uhr
Zitat von mabue88:
Da hab ich die "falsche Version" geposted. Dachte auch an einen Schreibfehler und habe verschiedene Schreibweisen von
'contentWindow' getestet. Alle, inkl. 'contentWindow' geben ein 'undefined' zurück...
Geht hier einwandfrei ... bitte nicht die IE-Krücke benutzen ...
Im IE musst du es anders machen....
document.getElementById('my_object').contentDocument.parentWindow.deineFunctionImObject();
immer dieser IE grausam ...
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 19:06 Uhr
Du kannst auch mal auf das Laden des Contents im Object warten und daran ein Event binden:
01.
<html> 
02.
	<head> 
03.
	</head> 
04.
	<body> 
05.
		<object id="my_object" data="load.html"></object> 
06.
		<script type="text/javascript"> 
07.
		document.getElementById('my_object').onload = function (){ 
08.
	              this.contentWindow.load_func(); 
09.
                  }; 
10.
		</script> 
11.
	</body> 
12.
</html>
Das geht hier ebenfalls problemlos ...
Bitte warten ..
Mitglied: mabue88
03.03.2015 um 19:07 Uhr
Gleiches Ergebnis...
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 19:20 Uhr
sorry hier läufts ... latest Firefox 36 & Chrome (IE ausgenommen s.o.)
Bitte warten ..
Mitglied: colinardo
03.03.2015, aktualisiert um 19:11 Uhr
Siehe dazu auch http://stackoverflow.com/questions/1600488/calling-javascript-function- ...
Hier ist zwar von einem iFrame die Rede, das spielt aber keine Rolle, ist das selbe ...
Bitte warten ..
Mitglied: mabue88
04.03.2015, aktualisiert um 11:49 Uhr
Also bei mir will das irgendwie nicht funktionieren.

Deswegen bin ich jetzt doch den Weg gegangen, das alte Object aus der HTML zu entfernen und ein neues zu erstellen. Dazu übergebe ich dem neuen Object die Parameter des alten. Lediglich der 'data'-Parameter wird verändert.

Hier die entsprechende Javascript-Funktion:
01.
function UpdateObjectData(object_id, new_data){ 
02.
	var oo = document.getElementById(object_id);	// oo = old object 
03.
	if(oo == null)	return; 
04.
	 
05.
	document.body.removeChild(oo); 
06.
	 
07.
	var no = document.createElement("object");		// no = new object 
08.
	no.setAttribute("id", oo.id); 
09.
	no.setAttribute("data", new_data); 
10.
	no.setAttribute("onclick", oo.getAttribute("onclick").toString()); 
11.
	no.setAttribute("class", oo.className); 
12.
	 
13.
	document.body.appendChild(no); 
14.
}
Ich danke euch allen für eure Unterstützung!


PS: Ich habe innerhalb dem Object noch eine andere Problematik, aber dafür werde ich dann wohl bei Bedarf einen neuen Thread erstellen...
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Webbrowser
gelöst Firefox 50 downloads stocken ohne Internet Verbindung (2)

Frage von LordXearo zum Thema Webbrowser ...

Webbrowser
Zero-Day-Lücke in Firefox bedroht Tor-Anwender (1)

Link von runasservice zum Thema Webbrowser ...

Informationsdienste
gelöst Aktuelle Firefox MSI Datei!? (8)

Frage von Hendrik2586 zum Thema Informationsdienste ...

Windows Server
FireFox AppCrash

Frage von joerg zum Thema Windows Server ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...