Skip to content

Commit dd179ad

Browse files
committedFeb 26, 2012
Factor out the tag name case conversions into a single function to reduce minified code size and clarify usage
1 parent 7c62b80 commit dd179ad

File tree

3 files changed

+52
-46
lines changed

3 files changed

+52
-46
lines changed
 

‎src/binding/defaultBindings.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ ko.bindingHandlers['value'] = {
156156
});
157157
},
158158
'update': function (element, valueAccessor) {
159-
var valueIsSelectOption = element.tagName.toLowerCase() == "select";
159+
var valueIsSelectOption = ko.utils.tagNameUpper(element) === "SELECT";
160160
var newValue = ko.utils.unwrapObservable(valueAccessor());
161161
var elementValue = ko.selectExtensions.readValue(element);
162162
var valueHasChanged = (newValue != elementValue);
@@ -187,12 +187,12 @@ ko.bindingHandlers['value'] = {
187187

188188
ko.bindingHandlers['options'] = {
189189
'update': function (element, valueAccessor, allBindingsAccessor) {
190-
if (element.tagName.toLowerCase() != "select")
190+
if (ko.utils.tagNameUpper(element) !== "SELECT")
191191
throw new Error("options binding applies only to SELECT elements");
192192

193193
var selectWasPreviouslyEmpty = element.length == 0;
194194
var previousSelectedValues = ko.utils.arrayMap(ko.utils.arrayFilter(element.childNodes, function (node) {
195-
return node.tagName && node.tagName.toLowerCase() == "option" && node.selected;
195+
return node.tagName && (ko.utils.tagNameUpper(node) === "OPTION") && node.selected;
196196
}), function (node) {
197197
return ko.selectExtensions.readValue(node) || node.innerText || node.textContent;
198198
});
@@ -308,7 +308,7 @@ ko.bindingHandlers['selectedOptions'] = {
308308
var nodes = element.childNodes;
309309
for (var i = 0, j = nodes.length; i < j; i++) {
310310
var node = nodes[i];
311-
if (node.tagName.toLowerCase() == "option")
311+
if (ko.utils.tagNameUpper(node) === "OPTION")
312312
ko.utils.setOptionNodeSelectionState(node, ko.utils.arrayIndexOf(newValue, ko.selectExtensions.readValue(node)) >= 0);
313313
}
314314
}

‎src/binding/selectExtensions.js

+40-40
Original file line numberDiff line numberDiff line change
@@ -6,52 +6,52 @@
66
// that are arbitrary objects. This is very convenient when implementing things like cascading dropdowns.
77
ko.selectExtensions = {
88
readValue : function(element) {
9-
switch (element.tagName.toLowerCase()) {
10-
case 'option':
11-
if (element[hasDomDataExpandoProperty] === true)
12-
return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
13-
return element.getAttribute("value");
14-
case 'select':
15-
return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
16-
default:
17-
return element.value;
9+
switch (ko.utils.tagNameUpper(element)) {
10+
case 'OPTION':
11+
if (element[hasDomDataExpandoProperty] === true)
12+
return ko.utils.domData.get(element, ko.bindingHandlers.options.optionValueDomDataKey);
13+
return element.getAttribute("value");
14+
case 'SELECT':
15+
return element.selectedIndex >= 0 ? ko.selectExtensions.readValue(element.options[element.selectedIndex]) : undefined;
16+
default:
17+
return element.value;
1818
}
1919
},
2020

2121
writeValue: function(element, value) {
22-
switch (element.tagName.toLowerCase()) {
23-
case 'option':
24-
switch(typeof value) {
25-
case "string":
26-
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
27-
if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
28-
delete element[hasDomDataExpandoProperty];
29-
}
30-
element.value = value;
31-
break;
32-
default:
33-
// Store arbitrary object using DomData
34-
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
35-
element[hasDomDataExpandoProperty] = true;
22+
switch (ko.utils.tagNameUpper(element)) {
23+
case 'OPTION':
24+
switch(typeof value) {
25+
case "string":
26+
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, undefined);
27+
if (hasDomDataExpandoProperty in element) { // IE <= 8 throws errors if you delete non-existent properties from a DOM node
28+
delete element[hasDomDataExpandoProperty];
29+
}
30+
element.value = value;
31+
break;
32+
default:
33+
// Store arbitrary object using DomData
34+
ko.utils.domData.set(element, ko.bindingHandlers.options.optionValueDomDataKey, value);
35+
element[hasDomDataExpandoProperty] = true;
3636

37-
// Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
38-
element.value = typeof value === "number" ? value : "";
39-
break;
40-
}
41-
break;
42-
case 'select':
43-
for (var i = element.options.length - 1; i >= 0; i--) {
44-
if (ko.selectExtensions.readValue(element.options[i]) == value) {
45-
element.selectedIndex = i;
46-
break;
37+
// Special treatment of numbers is just for backward compatibility. KO 1.2.1 wrote numerical values to element.value.
38+
element.value = typeof value === "number" ? value : "";
39+
break;
40+
}
41+
break;
42+
case 'SELECT':
43+
for (var i = element.options.length - 1; i >= 0; i--) {
44+
if (ko.selectExtensions.readValue(element.options[i]) == value) {
45+
element.selectedIndex = i;
46+
break;
47+
}
4748
}
48-
}
49-
break;
50-
default:
51-
if ((value === null) || (value === undefined))
52-
value = "";
53-
element.value = value;
54-
break;
49+
break;
50+
default:
51+
if ((value === null) || (value === undefined))
52+
value = "";
53+
element.value = value;
54+
break;
5555
}
5656
}
5757
};

‎src/utils.js

+8-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ ko.utils = new (function () {
2929
isIe7 = ieVersion === 7;
3030

3131
function isClickOnCheckableElement(element, eventType) {
32-
if ((element.tagName.toLowerCase() != "input") || !element.type) return false;
32+
if ((ko.utils.tagNameUpper(element) !== "INPUT") || !element.type) return false;
3333
if (eventType.toLowerCase() != "click") return false;
3434
var inputType = element.type.toLowerCase();
3535
return (inputType == "checkbox") || (inputType == "radio");
@@ -204,6 +204,12 @@ ko.utils = new (function () {
204204
return ko.utils.domNodeIsContainedBy(node, document);
205205
},
206206

207+
tagNameUpper: function(element) {
208+
// Possible future optimization: If we know it's an element from an HTML document (not XHTML),
209+
// we don't need to do the .toUpperCase() as it will always be uppercase anyway
210+
return element.tagName.toUpperCase();
211+
},
212+
207213
registerEventHandler: function (element, eventType, handler) {
208214
if (typeof jQuery != "undefined") {
209215
if (isClickOnCheckableElement(element, eventType)) {
@@ -369,7 +375,7 @@ ko.utils = new (function () {
369375
var url = urlOrForm;
370376

371377
// If we were given a form, use its 'action' URL and pick out any requested field values
372-
if((typeof urlOrForm == 'object') && (urlOrForm.tagName.toLowerCase() == "form")) {
378+
if((typeof urlOrForm == 'object') && (ko.utils.tagNameUpper(urlOrForm) === "FORM")) {
373379
var originalForm = urlOrForm;
374380
url = originalForm.action;
375381
for (var i = includeFields.length - 1; i >= 0; i--) {

0 commit comments

Comments
 (0)
Please sign in to comment.