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
183 lines (159 loc) • 5.46 kB
JavaScript
define([
"dojo/_base/declare", // declare
"dojo/dom", // dom.setSelectable
"dojo/dom-attr", // domAttr.set
"dojo/dom-class", // domClass.toggle
"dojo/_base/kernel", // kernel.deprecated
"dojo/sniff", // has("ie")
"dojo/_base/lang", // lang.hitch
"./_Widget",
"./_TemplatedMixin",
"./_Contained",
"./_CssStateMixin",
"dojo/text!./templates/MenuItem.html"
], function(declare, dom, domAttr, domClass, kernel, has, lang,
_Widget, _TemplatedMixin, _Contained, _CssStateMixin, template){
// module:
// dijit/MenuItem
var MenuItem = declare("dijit.MenuItem" + (has("dojo-bidi") ? "_NoBidi" : ""),
[_Widget, _TemplatedMixin, _Contained, _CssStateMixin], {
// summary:
// A line item in a Menu Widget
// Make 3 columns
// icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
templateString: template,
baseClass: "dijitMenuItem",
// label: String
// Menu text as HTML
label: "",
_setLabelAttr: function(val){
this._set("label", val);
var shortcutKey = "";
var text;
var ndx = val.search(/{\S}/);
if(ndx >= 0){
shortcutKey = val.charAt(ndx + 1);
var prefix = val.substr(0, ndx);
var suffix = val.substr(ndx + 3);
text = prefix + shortcutKey + suffix;
val = prefix + '<span class="dijitMenuItemShortcutKey">' + shortcutKey + '</span>' + suffix;
}else{
text = val;
}
this.domNode.setAttribute("aria-label", text + " " + this.accelKey);
this.containerNode.innerHTML = val;
this._set('shortcutKey', shortcutKey);
},
/*=====
// shortcutKey: [readonly] String
// Single character (underlined when the parent Menu is focused) used to navigate directly to this widget,
// also known as [a mnemonic](http://en.wikipedia.org/wiki/Mnemonics_(keyboard%29).
// This is denoted in the label by surrounding the single character with {}.
// For example, if label="{F}ile", then shortcutKey="F".
shortcutKey: "",
=====*/
// iconClass: String
// Class to apply to DOMNode to make it display an icon.
iconClass: "dijitNoIcon",
_setIconClassAttr: { node: "iconNode", type: "class" },
// accelKey: String
// Text for the accelerator (shortcut) key combination, a control, alt, etc. modified keystroke meant to
// execute the menu item regardless of where the focus is on the page.
//
// Note that although Menu can display accelerator keys, there is no infrastructure to actually catch and
// execute those accelerators.
accelKey: "",
// disabled: Boolean
// If true, the menu item is disabled.
// If false, the menu item is enabled.
disabled: false,
_fillContent: function(/*DomNode*/ source){
// If button label is specified as srcNodeRef.innerHTML rather than
// this.params.label, handle it here.
if(source && !("label" in this.params)){
this._set('label', source.innerHTML);
}
},
buildRendering: function(){
this.inherited(arguments);
var label = this.id + "_text";
domAttr.set(this.containerNode, "id", label); // only needed for backward compat
if(this.accelKeyNode){
domAttr.set(this.accelKeyNode, "id", this.id + "_accel"); // only needed for backward compat
}
dom.setSelectable(this.domNode, false);
},
onClick: function(/*Event*/){
// summary:
// User defined function to handle clicks
// tags:
// callback
},
focus: function(){
// summary:
// Focus on this MenuItem
try{
if(has("ie") == 8){
// needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275)
this.containerNode.focus();
}
this.focusNode.focus();
}catch(e){
// this throws on IE (at least) in some scenarios
}
},
_setSelected: function(selected){
// summary:
// Indicate that this node is the currently selected one
// tags:
// private
domClass.toggle(this.domNode, "dijitMenuItemSelected", selected);
},
setLabel: function(/*String*/ content){
// summary:
// Deprecated. Use set('label', ...) instead.
// tags:
// deprecated
kernel.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0");
this.set("label", content);
},
setDisabled: function(/*Boolean*/ disabled){
// summary:
// Deprecated. Use set('disabled', bool) instead.
// tags:
// deprecated
kernel.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0");
this.set('disabled', disabled);
},
_setDisabledAttr: function(/*Boolean*/ value){
// summary:
// Hook for attr('disabled', ...) to work.
// Enable or disable this menu item.
this.focusNode.setAttribute('aria-disabled', value ? 'true' : 'false');
this._set("disabled", value);
},
_setAccelKeyAttr: function(/*String*/ value){
// summary:
// Hook for attr('accelKey', ...) to work.
// Set accelKey on this menu item.
if(this.accelKeyNode){
this.accelKeyNode.style.display = value ? "" : "none";
this.accelKeyNode.innerHTML = value;
//have to use colSpan to make it work in IE
domAttr.set(this.containerNode, 'colSpan', value ? "1" : "2");
}
this._set("accelKey", value);
}
});
if(has("dojo-bidi")){
MenuItem = declare("dijit.MenuItem", MenuItem, {
_setLabelAttr: function(val){
this.inherited(arguments);
if(this.textDir === "auto"){
this.applyTextDir(this.textDirNode);
}
}
});
}
return MenuItem;
});