2010-03-22 11 views
9

Ho il seguente scenario.JavaScript: modifica dell'attributo src di un tag embeddato

Mostrare all'utente alcuni file audio dal server. L'utente fa clic su uno, quindi onFileSelected viene infine eseguito con la cartella e il file selezionati. Che cosa fa la funzione è cambiare la fonte dall'oggetto incorporato. Quindi in un certo senso, è un'anteprima del file selezionato prima di accettarlo e salvare la scelta dell'utente. 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); 
}; 

Ora, questo funziona bene in Firefox, Safari e Chrome, ma semplicemente si rifiutano di cambiare la sorgente, indipendentemente dal sistema operativo.

jQuery trova l'oggetto (jQuery.size() restituisce 1), esegue il codice, ma nessuna modifica nel codice HTML.

Perché Safari mi impedisce di modificare la sorgente <embed> e come posso eludere questa situazione?

risposta

20

È necessario rimuovere l'elemento embed e reinserirlo con il nuovo set di parametri src.

embed come object e simili sono due elementi che, a causa dei loro usi speciali (video, audio, flash, activex, ...), in alcuni browser sono gestiti in modo diverso da un normale elemento DOM. Pertanto, la modifica dell'attributo src potrebbe non attivare l'azione prevista.

La cosa migliore è rimuovere l'oggetto esistente embed e reinserirlo. Se si scrive un qualche tipo di funzione wrapper con l'attributo src come parametro di questo dovrebbe essere facile

+0

Ci ho provato, ma non ha funzionato in qualche modo. Aggiunse il nuovo embed-tag, ma non rimosse quello vecchio. Sto pensando di usare una variante di questo con un iframe, ma questa non è una soluzione molto elegante. – Mike

+0

Ho avuto un problema simile e questo ha funzionato per me. Grazie! – petejamd

+0

Il mio problema era che la modifica di src e di chiamata play() al livello di programmazione causava comunque la riproduzione dell'originale src. Seguendo questo consiglio ora rimuovo e riaggiungi l'elemento embed e il suono viene riprodotto correttamente. Grazie – Scottm

1

JQuery segue la dichiarazione CSS-esque:

Invece di fare

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

Piuttosto che fare

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

In questo modo, jQuery recupera solo oggetto id = "file_udio".

+0

mi sembra che il tuo selettore sia "meno specifico" e potrebbe avere un successo in termini di prestazioni più alte, non può davvero vedere la connessione alla tua citazione "Dichiarazione CSS-esque" ... inoltre, se leggi l'OP, funziona su alcuni browser, ma non tutti, quindi probabilmente non è un errore di sintassi ... – Leon

+0

@Leon, jQuery raggruppa le diverse implementazioni di Javascript nella loro libreria in modo che noi (sviluppatori) non dobbiamo preoccuparci di ciò. Penso che sia l'uso interno dei tag relativi ad alcuni browser che sono in conflitto, quindi può essere un errore di sintassi. –

4

ero anche affrontando lo stesso problema quando voglio cambiare -attribute "src" di elemento "embed", quindi quello che ho fatto, è il seguente:

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

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

E questo funziona bene nella mia applicazione .

Conclusione: - È necessario rimuovere prima l'elemento embed e quindi reinserirlo con change in src.

Problemi correlati