dojox
Version:
Dojo eXtensions, a rollup of many useful sub-projects and varying states of maturity – from very stable and robust, to alpha and experimental. See individual projects contain README files for details.
110 lines (98 loc) • 3.35 kB
JavaScript
define([
"dojo/_base/declare",
"dojo/dom-construct",
"dojo/sniff",
"dijit/_Contained",
"dijit/_WidgetBase"
], function(declare, domConstruct, has, Contained, WidgetBase){
// module:
// dojox/mobile/Audio
return declare("dojox.mobile.Audio", [WidgetBase, Contained], {
// summary:
// A thin wrapper around the HTML5 `<audio>` element.
// description:
// dojox/mobile/Audio is a widget which plays audio. If all sources cannot
// be played (typically, in desktop browsers that do not support `<audio>`),
// dojox/mobile/Audio automatically replaces `<audio>` with `<embed>`, such
// that the browser tries to play it with a suitable plug-in.
// source: [const] Array
// An array of src and type,
// ex. [{src:"a.mp3", type:"audio/mpeg"}, {src:"a.ogg", type:"audio/ogg"}, ...].
// The src gives the path of the media resource. The type gives the
// type of the media resource.
// Note that changing the value of the property after the widget
// creation has no effect.
source: null,
// width: [const] String
// The width of the embed element.
// Note that changing the value of the property after the widget
// creation has no effect.
width: "200px",
// height: [const] String
// The height of the embed element.
// Note that changing the value of the property after the widget
// creation has no effect.
height: "15px",
// _playable: [private] Boolean
// Internal flag.
_playable: false,
// _tag: [private] String
// The name of the tag ("audio").
_tag: "audio",
constructor: function(){
// summary:
// Creates a new instance of the class.
this.source = [];
},
buildRendering: function(){
this.domNode = this.srcNodeRef || domConstruct.create(this._tag);
},
_getEmbedRegExp: function(){
// tags:
// private
return has('ff') ? /audio\/mpeg/i :
has('ie') ? /audio\/wav/i :
null;
},
startup: function(){
if(this._started){ return; }
this.inherited(arguments);
var i, len, re;
if(this.domNode.canPlayType){
if(this.source.length > 0){
for(i = 0, len = this.source.length; i < len; i++){
domConstruct.create("source", {src:this.source[i].src, type:this.source[i].type}, this.domNode);
this._playable = this._playable || !!this.domNode.canPlayType(this.source[i].type);
}
}else{
for(i = 0, len = this.domNode.childNodes.length; i < len; i++){
var n = this.domNode.childNodes[i];
if(n.nodeType === 1 && n.nodeName === "SOURCE"){
this.source.push({src:n.src, type:n.type});
this._playable = this._playable || !!this.domNode.canPlayType(n.type);
}
}
}
}
has.add("mobile-embed-audio-video-support", true); //It should move to staticHasFeatures
if(has("mobile-embed-audio-video-support")){
if(!this._playable){
for(i = 0, len = this.source.length, re = this._getEmbedRegExp(); i < len; i++){
if(this.source[i].type.match(re)){
var node = domConstruct.create("embed", {
src: this.source[0].src,
type: this.source[0].type,
width: this.width,
height: this.height
});
this.domNode.parentNode.replaceChild(node, this.domNode);
this.domNode = node;
this._playable = true;
break;
}
}
}
}
}
});
});