2010-03-22 4 views
9

Ich habe folgendes Szenario.JavaScript: src-Attribut eines Embed-Tags ändern

Ich zeige dem Benutzer einige Audio-Dateien vom Server. Der Benutzer klickt auf einen, dann wird onFileSelected schließlich mit dem ausgewählten Ordner und der Datei ausgeführt. Die Funktion ändert die Quelle aus dem eingebetteten Objekt. In gewisser Weise ist es eine Vorschau der ausgewählten Datei, bevor Sie sie akzeptieren und die Auswahl des Benutzers speichern. A visual aid.

HTML

<embed src="/resources/audio/_webbook_0001/embed_test.mp3" type="audio/mpeg" id="audio_file"> 

JavaScript

function onFileSelected(file, directory) { 
    jQuery('embed#audio_file').attr('src', '/resources/audio/'+directory+'/'+file); 
}; 

Nun, dies funktioniert in Firefox, aber Safari und Chrome weigern sich einfach, um die Quelle zu ändern, unabhängig vom Betriebssystem.

jQuery findet das Objekt (jQuery.size() gibt 1 zurück), es führt den Code aus, aber keine Änderung im HTML-Code.

Warum verhindert Safari, dass ich die Quelle <embed> ändere und wie kann ich das umgehen?

Antwort

20

Sie sollten das embed Element entfernen und es mit dem neuen src Parametersatz erneut einspeisen.

embed wie object und ähnliche sind zwei Elemente, die wegen ihrer speziellen Verwendungen (Video, Audio, Flash, Activex, ...) in einigen Browsern anders behandelt werden als ein normales DOM-Element. Wenn Sie also das Attribut src ändern, wird die erwartete Aktion möglicherweise nicht ausgelöst.

Die beste Sache ist, das vorhandene embed Objekt zu entfernen und es wieder einzufügen. Wenn Sie irgendeine Art von Wrapper-Funktion mit dem Attribut src als Parameter schreiben sollte dies einfach sein

+0

ich versucht, aber es hat nicht irgendwie funktionieren. Es hat das neue Embed-Tag angehängt, aber das alte nicht entfernt. Ich denke daran, eine Variation von diesem mit einem iframe zu verwenden, aber das ist keine sehr elegante Lösung. – Mike

+0

Ich hatte ein ähnliches Problem und das hat für mich funktioniert. Vielen Dank! – petejamd

+0

Mein Problem war, dass das Programmieren der src und das Aufrufen von play() immer noch dazu führten, dass der ursprüngliche src abgespielt wurde. Wenn ich diesen Ratschlag befolge, entferne ich das eingebettete Element und füge es wieder hinzu und der Sound wird korrekt abgespielt. Vielen Dank – Scottm

1

JQuery die CSS-artige Erklärung folgt:

Statt tun

function onFileSelected(file, directory) { 
    jQuery('embed#audio_file').attr('src', '/resources/audio/'+directory+'/'+file); 
}; 

tun Rather

function onFileSelected(file, directory) { 
    jQuery('#audio_file').attr('src', '/resources/audio/'+directory+'/'+file); 
}; 

Auf diese Weise ruft jQuery nur das Objekt id = "audio_file" ab.

+0

scheint mir Ihre Selektor ist "weniger spezifisch" und könnte eine höhere Leistung getroffen haben, kann nicht wirklich die Verbindung zu Ihrem Zitat "CSS-esque-Deklaration" sehen ... Außerdem, wenn Sie das OP lesen, es funktioniert einige Browser, aber nicht alle, also ist es wahrscheinlich kein Syntaxfehler ... – Leon

+0

@Leon, jQuery bündelt die verschiedenen Javascript-Implementierungen in ihre Bibliothek, so dass wir (Entwickler) uns keine Sorgen machen müssen. Ich denke, es ist die interne Verwendung von Tags in einigen Browsern, die Konflikte verursachen, so dass es Syntaxfehler sein können. –

4

ich auch gleiche Problem konfrontiert wurde, wenn ich will „src“ -Attribut von „einbetten“ Element ändern, so was ich getan habe, ist unten angegeben:

var parent = $('embed#audio_file').parent(); 
var newElement = "<embed src='new src' id='audio_file'>"; 

$('embed#audio_file').remove(); 
parent.append(newElement); 

Und das wird in meiner Anwendung gut funktionieren .

Fazit: - Sie müssen zuerst das Einbettungselement entfernen und dann müssen Sie es mit Änderung in Src neu einfügen.