2 var hasDomDataExpandoProperty = '__ko__hasDomDataOptionValue__';
4 // Normally, SELECT elements and their OPTIONs can only take value of type 'string' (because the values
5 // are stored on DOM attributes). ko.selectExtensions provides a way for SELECTs/OPTIONs to have values
6 // that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.
7 ko.selectExtensions = {
8 readValue : function(element) {
9 switch (ko.utils.tagNameLower(element)) {
11 if (element[hasDomDataExpandoProperty] === true)
12 return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
13 return ko.utils.ieVersion <= 7
14 ? (element.getAttributeNode('value').specified ? element.value : element.text)
17 return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
23 writeValue: function(element, value) {
24 switch (ko.utils.tagNameLower(element)) {
26 switch(typeof value) {
28 ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
29 if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
30 delete element[hasDomDataExpandoProperty];
32 element.value = value;
35 // Store arbitrary object using DomData
36 ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
37 element[hasDomDataExpandoProperty] = true;
39 // Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
40 element.value = typeof value === "number" ? value : "";
45 for (var i = element.options.length - 1; i >= 0; i--) {
46 if (ko.selectExtensions.readValue(element.options[i]) == value) {
47 element.selectedIndex = i;
53 if ((value === null) || (value === undefined))
55 element.value = value;
62 ko.exportSymbol('selectExtensions', ko.selectExtensions);
63 ko.exportSymbol('selectExtensions.readValue', ko.selectExtensions.readValue);
64 ko.exportSymbol('selectExtensions.writeValue', ko.selectExtensions.writeValue);