2010-03-22 99 views
9

我有以下情形。JavaScript:更改嵌入標籤的src屬性

我向用戶顯示一些來自服務器的音頻文件。用戶點擊一個,然後onFileSelected最終與選定的文件夾和文件一起執行。該函數的功能是從嵌入對象中更改源代碼。因此,在某種程度上,它是在接受它之前預覽選定的文件並保存用戶的選擇。 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); 
}; 

,能正常工作在Firefox,但Safari和Chrome簡單地拒絕更改信號源,與操作系統無關。

jQuery找到對象(jQuery.size()返回1),它執行代碼,但沒有更改HTML代碼。

爲什麼Safari會阻止我改變<embed>源代碼,我該如何繞過這個?

回答

20

您應該刪除embed元素並使用新的src參數集重新注入它。

embedobject和類似的兩個元素,由於它們的特殊用途(視頻,音頻,flash,activex,...)在某些瀏覽器中的處理方式與常規DOM元素不同。因此,更改src屬性可能不會觸發您期望的操作。

最好的辦法是刪除現有的embed對象並重新插入它。如果你寫某種與src屬性爲參數的包裝功能,這應該是很容易

+0

我試過了,但它並沒有以某種方式工作。它附加了新的嵌入標籤,但沒有刪除舊嵌入標籤。 我正在考慮使用iframe的變體,但這不是一個非常優雅的解決方案。 – Mike 2010-03-22 16:50:36

+0

我有類似的問題,這對我有用。謝謝! – petejamd 2010-11-18 17:16:17

+0

我的問題是,通過編程改變src並調用play()仍然會導致原始的src被播放。按照這個建議,我現在刪除並重新添加嵌入元素,聲音播放正確。謝謝 – Scottm 2011-01-17 15:05:14

1

JQuery的遵循CSS去年秋季聲明:

而不是做

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

而是做

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

這樣,jQuery只檢索id =「audio_file」的對象。

+0

在我看來,你的選擇器是「不太具體」,可能會有更高的性能影響,無法真正看到與你的報價「CSS-esque聲明」的連接......此外,如果你閱讀OP,它的工作原理一些瀏覽器,但不是全部,所以它可能不是語法錯誤... – Leon 2011-12-06 09:18:25

+0

@Leon,jQuery將不同的Javascript實現捆綁到他們的庫中,以便我們(開發人員)不必擔心它。我認爲這是與某些瀏覽器衝突的標記的內部使用情況,所以它可能是語法錯誤。 – 2012-03-23 14:34:22

4

我也面臨着同樣的問題,當我想改變「嵌入」元素的「SRC」 -attribute,所以我做了什麼,在下面給出:

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

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

,這將在我的應用程序正常工作。

結論: - 您需要先刪除嵌入元素,然後必須重新插入src中的更改。