dijit
Version:
Dijit provides a complete collection of user interface controls based on Dojo, giving you the power to create web applications that are highly optimized for usability, performance, internationalization, accessibility, but above all deliver an incredible u
105 lines (92 loc) • 3.32 kB
JavaScript
define([
"dojo/_base/declare", // declare
"dojo/_base/kernel",
"dojo/_base/lang", // hitch
"dojo/query", // query
"../registry", // registry.byNode
"../popup", // dijit.popup2.hide
"./Button",
"../_Container",
"../_HasDropDown",
"dojo/text!./templates/DropDownButton.html",
"../a11yclick" // template uses ondijitclick
], function(declare, kernel, lang, query, registry, popup, Button, _Container, _HasDropDown, template){
// module:
// dijit/form/DropDownButton
return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], {
// summary:
// A button with a drop down
//
// example:
// | <button data-dojo-type="dijit/form/DropDownButton">
// | Hello world
// | <div data-dojo-type="dijit/Menu">...</div>
// | </button>
//
// example:
// | var button1 = new DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) });
// | win.body().appendChild(button1);
//
baseClass: "dijitDropDownButton",
templateString: template,
_fillContent: function(){
// Overrides _TemplatedMixin#_fillContent().
// My inner HTML possibly contains both the button label and/or a drop down widget, like
// <DropDownButton> <span>push me</span> <Menu> ... </Menu> </DropDownButton>
var source = this.srcNodeRef;
var dest = this.containerNode;
if(source && dest){
while(source.hasChildNodes()){
var child = source.firstChild;
if(child.hasAttribute && (child.hasAttribute("data-dojo-type") || child.hasAttribute("dojoType") ||
child.hasAttribute("data-" + kernel._scopeName + "-type") ||
child.hasAttribute(kernel._scopeName + "Type"))){
// The parser hasn't gotten to this node yet, so save it in a wrapper <div>
// and then grab the instantiated widget in startup().
this.dropDownContainer = this.ownerDocument.createElement("div");
this.dropDownContainer.appendChild(child);
}else{
dest.appendChild(child);
}
}
}
},
startup: function(){
if(this._started){
return;
}
// the child widget from srcNodeRef is the dropdown widget. Insert it in the page DOM,
// make it invisible, and store a reference to pass to the popup code.
if(!this.dropDown && this.dropDownContainer){
this.dropDown = registry.byNode(this.dropDownContainer.firstChild);
delete this.dropDownContainer;
}
if(this.dropDown){
popup.hide(this.dropDown);
}
this.inherited(arguments);
},
isLoaded: function(){
// Returns whether or not we are loaded - if our dropdown has an href,
// then we want to check that.
var dropDown = this.dropDown;
return (!!dropDown && (!dropDown.href || dropDown.isLoaded));
},
loadDropDown: function(/*Function*/ callback){
// Default implementation assumes that drop down already exists,
// but hasn't loaded it's data (ex: ContentPane w/href).
// App must override if the drop down is lazy-created.
var dropDown = this.dropDown;
var handler = dropDown.on("load", lang.hitch(this, function(){
handler.remove();
callback();
}));
dropDown.refresh(); // tell it to load
},
isFocusable: function(){
// Overridden so that focus is handled by the _HasDropDown mixin, not by
// the _FormWidget mixin.
return this.inherited(arguments) && !this._mouseDown;
}
});
});