2010-03-22 28 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中的更改。