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.
130 lines (113 loc) • 3.9 kB
JavaScript
define([
"dojo/_base/array",
"dojo/_base/declare",
"dojo/_base/window",
"dojo/dom",
"dojo/dom-class",
"dojo/dom-construct",
"dojo/touch",
"dojo/on",
"./common",
"dijit/_WidgetBase",
"dijit/form/_ButtonMixin",
"dijit/form/_FormWidgetMixin",
"dojo/has",
"dojo/has!dojo-bidi?dojox/mobile/bidi/Button"
],
function(array, declare, win, dom, domClass, domConstruct, touch, on, common, WidgetBase, ButtonMixin, FormWidgetMixin, has, BidiButton){
var Button = declare(has("dojo-bidi") ? "dojox.mobile.NonBidiButton" : "dojox.mobile.Button", [WidgetBase, FormWidgetMixin, ButtonMixin], {
// summary:
// Non-templated BUTTON widget with a thin API wrapper for click
// events and for setting the label.
//
// Buttons can display a label, an icon, or both.
// A label should always be specified (through innerHTML) or the label
// attribute. It can be hidden via showLabel=false.
// example:
// | <button data-dojo-type="dojox/mobile/Button" onClick="...">Hello world</button>
// baseClass: String
// The name of the CSS class of this widget.
baseClass: "mblButton",
// _setTypeAttr: [private] Function
// Overrides the automatic assignment of type to nodes, because it causes
// exception on IE. Instead, the type must be specified as this.type
// when the node is created, as part of the original DOM.
_setTypeAttr: null,
/*=====
// label: String
// The label of the button.
label: "",
=====*/
isFocusable: function(){
// Override of the method of dijit/_WidgetBase.
return false;
},
buildRendering: function(){
if(!this.srcNodeRef){
this.srcNodeRef = domConstruct.create("button", {"type": this.type});
}else if(this._cv){
var n = this.srcNodeRef.firstChild;
if(n && n.nodeType === 3){
n.nodeValue = this._cv(n.nodeValue);
}
}
this.inherited(arguments);
this.focusNode = this.domNode;
},
postCreate: function(){
this.inherited(arguments);
// we need to ensure the synthetic click is emitted by
// touch.doClicks even if we moved (inside or outside) before we
// released in the button area.
this.domNode.dojoClick = "useTarget";
// handle touch.press event
var _this = this;
this.on(touch.press, function(e){
e.preventDefault();
if(_this.domNode.disabled){return;}
_this._press(true);
// change button state depending on where we are
var isFirstMoveDone = false;
_this._moveh = on(win.doc, touch.move, function(e){
if(!isFirstMoveDone){
// #17220: preventDefault may not have any effect.
// causing minor impact on some android
// (Galaxy Tab 2 with stock browser 4.1.1) where button
// display does not reflect the actual button state
// when user moves back and forth from the button area.
e.preventDefault();
isFirstMoveDone = true;
}
_this._press(dom.isDescendant(e.target, _this.domNode));
});
// handle touch.release
_this._endh = on(win.doc, touch.release, function(e){
_this._press(false);
_this._moveh.remove();
_this._endh.remove();
});
});
common.setSelectable(this.focusNode, false);
this.connect(this.domNode, "onclick", "_onClick");
},
_press: function(pressed){
// tags:
// private
if(pressed != this._pressed){
this._pressed = pressed;
var button = this.focusNode || this.domNode;
var newStateClasses = (this.baseClass + ' ' + this["class"]).split(" ");
newStateClasses = array.map(newStateClasses, function(c){
return c + "Selected";
});
domClass.toggle(button, newStateClasses, pressed);
}
},
_setLabelAttr: function(/*String*/ content){
// tags:
// private
this.inherited(arguments, [this._cv ? this._cv(content) : content]);
}
});
return has("dojo-bidi") ? declare("dojox.mobile.Button", [Button, BidiButton]) : Button;
});