You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.4 KiB
120 lines
3.4 KiB
define([ |
|
"dojo/_base/declare", // declare |
|
"dojo/dom", // dom.setSelectable |
|
"dojo/has", |
|
"../registry" // registry.byNode |
|
], function(declare, dom, has, registry){ |
|
|
|
// module: |
|
// dijit/form/_ButtonMixin |
|
|
|
var ButtonMixin = declare("dijit.form._ButtonMixin" + (has("dojo-bidi") ? "_NoBidi" : ""), null, { |
|
// summary: |
|
// A mixin to add a thin standard API wrapper to a normal HTML button |
|
// description: |
|
// A label should always be specified (through innerHTML) or the label attribute. |
|
// |
|
// Attach points: |
|
// |
|
// - focusNode (required): this node receives focus |
|
// - valueNode (optional): this node's value gets submitted with FORM elements |
|
// - containerNode (optional): this node gets the innerHTML assignment for label |
|
// example: |
|
// | <button data-dojo-type="dijit/form/Button" onClick="...">Hello world</button> |
|
// example: |
|
// | var button1 = new Button({label: "hello world", onClick: foo}); |
|
// | dojo.body().appendChild(button1.domNode); |
|
|
|
// label: HTML String |
|
// Content to display in button. |
|
label: "", |
|
|
|
// type: [const] String |
|
// Type of button (submit, reset, button, checkbox, radio) |
|
type: "button", |
|
|
|
__onClick: function(/*Event*/ e){ |
|
// summary: |
|
// Internal function to divert the real click onto the hidden INPUT that has a native default action associated with it |
|
// type: |
|
// private |
|
e.stopPropagation(); |
|
e.preventDefault(); |
|
if(!this.disabled){ |
|
// cannot use on.emit since button default actions won't occur |
|
this.valueNode.click(e); |
|
} |
|
return false; |
|
}, |
|
|
|
_onClick: function(/*Event*/ e){ |
|
// summary: |
|
// Internal function to handle click actions |
|
if(this.disabled){ |
|
e.stopPropagation(); |
|
e.preventDefault(); |
|
return false; |
|
} |
|
if(this.onClick(e) === false){ |
|
e.preventDefault(); |
|
} |
|
var cancelled = e.defaultPrevented; |
|
|
|
// Signal Form/Dialog to submit/close. For 2.0, consider removing this code and instead making the Form/Dialog |
|
// listen for bubbled click events where evt.target.type == "submit" && !evt.defaultPrevented. |
|
if(!cancelled && this.type == "submit" && !(this.valueNode || this.focusNode).form){ |
|
for(var node = this.domNode; node.parentNode; node = node.parentNode){ |
|
var widget = registry.byNode(node); |
|
if(widget && typeof widget._onSubmit == "function"){ |
|
widget._onSubmit(e); |
|
e.preventDefault(); // action has already occurred |
|
cancelled = true; |
|
break; |
|
} |
|
} |
|
} |
|
|
|
return !cancelled; |
|
}, |
|
|
|
postCreate: function(){ |
|
this.inherited(arguments); |
|
dom.setSelectable(this.focusNode, false); |
|
}, |
|
|
|
onClick: function(/*Event*/ /*===== e =====*/){ |
|
// summary: |
|
// Callback for when button is clicked. |
|
// If type="submit", return true to perform submit, or false to cancel it. |
|
// type: |
|
// callback |
|
return true; // Boolean |
|
}, |
|
|
|
_setLabelAttr: function(/*String*/ content){ |
|
// summary: |
|
// Hook for set('label', ...) to work. |
|
// description: |
|
// Set the label (text) of the button; takes an HTML string. |
|
this._set("label", content); |
|
var labelNode = this.containerNode || this.focusNode; |
|
labelNode.innerHTML = content; |
|
this.onLabelSet(); |
|
}, |
|
|
|
onLabelSet: function(){ |
|
} |
|
}); |
|
|
|
if(has("dojo-bidi")){ |
|
ButtonMixin = declare("dijit.form._ButtonMixin", ButtonMixin, { |
|
onLabelSet: function(){ |
|
this.inherited(arguments); |
|
var labelNode = this.containerNode || this.focusNode; |
|
this.applyTextDir(labelNode); |
|
} |
|
}); |
|
} |
|
|
|
return ButtonMixin; |
|
});
|
|
|