Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen (A bis Z)

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, 879 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 ..
Ähnliche Inhalte
VB for Applications
gelöst Vbscript Fehlercode: Object required (2)

Frage von aletri zum Thema VB for Applications ...

Windows Server
FireFox AppCrash

Frage von joerg zum Thema Windows Server ...

Webbrowser
gelöst Webcam im Firefox wieder aktivieren - jit.si (2)

Frage von itebob zum Thema Webbrowser ...

Webbrowser
gelöst Was ist mit Firefox los? (2)

Frage von honeybee zum Thema Webbrowser ...

Neue Wissensbeiträge
Ubuntu

Ubuntu 17.10 steht zum Download bereit

(3)

Information von Frank zum Thema Ubuntu ...

Datenschutz

Autofahrer-Pranger - Bewertungsportal illegal

(8)

Information von BassFishFox zum Thema Datenschutz ...

Windows 10

Neues Win10 Funktionsupdate verbuggt RemoteApp

(8)

Information von thomasreischer zum Thema Windows 10 ...

Microsoft

Die neuen RSAT-Tools für Win10 1709 sind da

(2)

Information von DerWoWusste zum Thema Microsoft ...

Heiß diskutierte Inhalte
Windows 10
Seekrank bei Windows 10 (18)

Frage von zauberer123 zum Thema Windows 10 ...

Monitoring
Netzwerk-Monitoring Software (18)

Frage von Ghost108 zum Thema Monitoring ...

Windows 10
Windows 10 Fall Creators Update Fehler (13)

Frage von ZeroCool23 zum Thema Windows 10 ...

Router & Routing
gelöst Getrenntes Routing bei VoIP und Daten (12)

Frage von Hobbystern zum Thema Router & Routing ...