2010-10-29 27 views
32

De nombreux exemples illustrent plusieurs balises source imbriquées dans la balise audio, en tant que méthode pour surmonter la compatibilité des codecs entre différents navigateurs. Quelque chose comme ça -Comment puis-je ajouter plusieurs sources à une balise audio HTML5, par programmation?

<audio controls="controls"> 
    <source src="song.ogg" type="audio/ogg" /> 
    <source src="song.mp3" type="audio/mpeg" /> 
    Your browser does not support the audio element. 
</audio> 

Alors avec JavaScript, je suis aussi autorisé à créer un élément audio comme celui-ci -

var new_audio = document.createElement("audio"); 

Là où je peux définir sa source par la propriété .src-new_audio.src="....";

Je n'ai pas réussi à trouver comment ajouter plusieurs sources dans un élément audio via JavaScript, quelque chose de similaire aux balises source affichées dans l'extrait HTML. Est-ce que je manipule le new_audio et y ajoute les balises <source... à l'intérieur, comme on manipulerait n'importe quel autre élément DOM? Je fais cela maintenant et il fonctionne, ce qui est -

new_audio.innerHTML = "<source src='audio/song.ogg' type='audio/ogg' />"; 
new_audio.play(); 

Je me demande s'il y a un moyen plus approprié de le faire?

Répondre

44

Pourquoi ajouter plusieurs fichiers avec JavaScript quand vous pouvez détecter les types pris en charge? Je suggérerais au lieu de détecter le meilleur type alors juste en réglant le src.

var source= document.createElement('source'); 
if (audio.canPlayType('audio/mpeg;')) { 
    source.type= 'audio/mpeg'; 
    source.src= 'audio/song.mp3'; 
} else { 
    source.type= 'audio/ogg'; 
    source.src= 'audio/song.ogg'; 
} 
audio.appendChild(source); 

Ajoutez autant de contrôles que vous avez de types de fichiers.

+0

Je laisse l'utilisateur pousser une liste de formats alternatifs à l'intérieur de l'attribut de classe lui-même, rendant un plugin simple à utiliser pour les aider à créer des survols audio. Donc, je ne serais pas au courant des types fournis par les utilisateurs finaux. Merci pour le conseil de canPlayType, serait utile. –

+0

Juste quelque chose que j'ai remarqué - vous ne voulez probablement pas utiliser le mot-clé var dans votre conditionnel. Vous créez une nouvelle variable new_audio et ne référencez pas la variable existante. –

+0

@AndyWest Ouais, il manquait aussi un support - assez mauvais code tout le tour :) – robertc

23

Vous pouvez utiliser les mêmes méthodes DOM comme avec tout autre élément:

var source= document.createElement('source'); 
source.type= 'audio/ogg'; 
source.src= 'audio/song.ogg'; 
audio.appendChild(source); 
source= document.createElement('source'); 
source.type= 'audio/mpeg'; 
source.src= 'audio/song.mp3'; 
audio.appendChild(source); 
+1

Fantastique! résout mon problème, beaucoup plus propre. –