Zitat von NeckarPunkt <embed>:
was könnte man hier denn dann als Ersatz nehmen? Denn ich arbeite ja noch teilweise mit embed, was aber beim FF Probleme verursacht.
Das <embed>-Problem kann man Netscape nicht direkt anlasten, hier ist vor allem der IE der Übeltäter. Um die Sache zu erläutern muss ich etwas ausholen, es wird also ein längerer Text!
Ältere IE-Versionen haben Objekte immer so eingebunden, dass diese direkt einem ganz bestimmten Plugin zugeordnet werden. Über eine sogenannte ClassID, ein lange, weltweit eindeutige, hexadezimale Nummerngruppe, kann man (oder besser: könnte man, man sollte es nicht mehr tun) Plugins direkt ansprechen. Microsoft hat sich gedacht: Wenn der Webdesigner ein WMV-Video einbetten will, dann soll er auch vorgeben, dass dieses mit dem Windows-Media-Plugin abzuspielen ist. Genau das passiert bei Code, der in etwa so aussieht:
Übersetzt lautet diese Anweisung für den Browser: "Öffne das Windows-Media-Player-Plugin und tue Folgendes..."
Man sieht schnell, dass dieser Ansatz zu Problemen führt: Was machen Leute, die kein Windows haben und den Media Player nicht nutzen können, selbst wenn sie wöllten? Was machen Leute, die den Media Player und dessen Browserplugin nicht nutzen wollen? Warum soll ich als Webmaster überhaupt jemandem vorschreiben, wie er die von mir bereitgestellten Daten zu verarbeiten hat? Bei oben genanntem Ansatz erhält jeder, der kein Windows-Media-Plugin verwendet, eine Meldung, dass er sich doch den superdupertollen Windows Media Player besorgen soll und für die "optimale Betrachtung" der Seite möglicht den Internet Explorer verwenden soll. Viele Webmaster haben immer noch nicht begriffen, dass sie nicht in der Position sind, Anforderungen an den User Agent zu stellen.
Das Einbinden über die ClassID ist wie gesagt eine Microsoft-Lösung. Bei Netscape sieht es anders aus: Dort war man der Meinung, dass man Inhalte mit dem <embed>-Tag einbetten soll. Dieser Ansatz ist von der Grundidee her schon etwas besser, ich werde später zeigen, warum. Dennoch bleibt ein Problem: <embed> gehört und gehörte zu keinem HTML-Standard. Auch die Transitional-Varianten sehen <embed> nicht vor. Trotzdem hat Netscape 4 diesen Tag eingeführt und hatte gleichzeitig keine Unterstützung für den Microsoft-Ansatz.
Um eingebettete Objekte auf den beiden damals verbreiteten Browsern laufähig zu machen, verfiel man auf auf eine Lösung, die zwar funktionierte, aber nicht standardkonform ist und außerdem bis heute gewisse Probleme verursacht: Man bette ein Objekt zunächst per <object> ein und gab innerhalb des <object>-Tags das gleiche Objekt nochmal mit <embed>-Tags an. Im Grunde vereint man damit nur die Nachteile beider Ansätze: Das Objekt wird nach wie vor so eingebunden, dass es ein bestimmtes Plugin voraussetzt. Per <embed> findet dann eine unnötige Informationsdoppelung statt, die zu allem Überfluss auch nicht standardkonform ist. Wohl gemerkt, diese Lösung dürfte etwa 1996/97 entstanden sein, als Netscape 4 noch nennenswert verbreitet war. Was damals vielleicht zeitgemäß war, ist heute schlichtweg Unsinn. Trotzdem haben das einige Authoring-Tools noch immer nicht begriffen und "empfehlen" nach wie vor, Objekte zusätzlich mit <embed> einzubetten. Diese Tools produzieren zwar auch sonst reichlich proprietären Code, aber bei eingebetteten Objekten sind sie auf einmal der Meinung, dass man noch auf einen 12 Jahre alten Browser optimieren müsse, den seit Jahren keiner mehr benutzt (bereits 2003 war der Anteil von Netscape 4 auf unter 1% gefallen).
Machen wir uns jetzt nochmal den Sinn des <object>-Tags klar: Er ist dafür gedacht, dass man beliebige aktive Inhalte in Webseiten einbetten kann und der User Agent (Browser) kann diese nach eigenen Ermessen verarbeiten. Um beim obigen Beispiel eines WMV-Videos zu bleiben: Es gibt keinen Grund, warum man dieses unbedingt mit dem Browserplugin von Microsoft abspielen muss. Andere Player beherrschen dieses Format ebenfalls und vielleicht möchte man das Video auch nicht eingebettet betrachten, sondern direkt lokal im Player. Das alles sieht der <object>-Tag grundsätzlich vor!
Ein standardkonformer <object>-Tag teilt dem User Agent lediglich mit, von welchem Typ das eingebettete Objekt ist und lässt dann den Browser entscheiden, wie damit zu verfahren ist. Anstatt also zu sagen: "Öffne das Media-Player-Plugin und spiele folgendes Video ab" teilt die Website nur mit: "Ich habe hier ein WMV-Video, entscheide selbst, was du damit anfangen kannst". Es ist nun möglich, dass das WMV-Plugin installiert ist und das Video übernimmt. Es ist aber genauso möglich, dass ein anderes Plugin oder sogar ein lokal installierter Player das Video übernimmt. Jetzt wird auch klar, warum der <embed>-Tag zumindest vom Ansatz her besser war: Er macht nämlich keine Vorschriften zur Verarbeitung der eingebetteten Inhalte, sondern teilt ebenfalls lediglich mit, was eingebettet ist.
Trotzdem: <embed> ist nicht standardkonform und wird grundsätzlich nie benötigt. Standardkonform wird ein Objekt so eingebettet (hier am Beispiel eines Flash-Videos):
Man gibt im type-Attribut den MIME-Typ des Objektes an und im data-Attribut die Adresse des Objektes. Je nachdem, was es für ein Objekt ist, kann man innerhalb des Objekt-Tags noch verschiedene Empfehlungen(!) mit
geben. SelfHTML zeigt zwar auch, wie man Objekte richtig einbindet, allerdings taugen die dortigen Ausführungen ausnahmsweise mal nicht besonders viel, denn es steht dort auch viel wirres und schwammiges bzw. veraltetetes Zeug ("Herkömmliche Netscape-Syntax", die "an dieser Stelle genausogut möglich" sei usw. - dieser Abschnitt sollte überarbeitet werden).
Zusammenfassend sei gesagt: Weder die Variante, ein Plugin direkt über seine ClassID anzusprechen noch die Mischlösung mit <embed> ist die korrekte Variante, ein Objekt einzubetten. Die Variante, nur den Typ des Objektes anzugeben, ist interoperabel, wird von allen modernen Browsern unterstützt und ist auch noch standardkonform. Und genau weil der Standard bereits eine universell funktionierende Variante vorsieht, gibt es überhaupt keinen Grund, eine windige Zwischenlösung zu nutzen, die durch Zusammenschütten zweier proprietärer und zueinander eigentlich inkompatibler Varianten entsteht.
Allein die Idee, man müsse bei der Seitenerstellung heute noch Netscape 4 berücksichtigen, einen Browser, den keiner mehr nutzt und der Webstandardards schon immer mit den Füßen getreten hat, ist vollkommen abwegig. Empfehlungen, dass es "robuster" sei, ein Objekt per ClassID und zur Sicherheit auch per <embed> einzubetten, halten sich leider hartnäckig. Sie sind trotzdem schlichtweg Unsinn - allein schon deswegen, weil sie davon ausgehen, dass jeder entweder IE oder Netscape 4 benutzt.