diff options
Diffstat (limited to 'ext/js/dom/dom-data-binder.js')
-rw-r--r-- | ext/js/dom/dom-data-binder.js | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/ext/js/dom/dom-data-binder.js b/ext/js/dom/dom-data-binder.js index 4f35ba33..185dc439 100644 --- a/ext/js/dom/dom-data-binder.js +++ b/ext/js/dom/dom-data-binder.js @@ -126,10 +126,9 @@ class DOMDataBinder { _createObserver(element) { const metadata = this._createElementMetadata(element); - const nodeName = element.nodeName.toUpperCase(); const observer = { element, - type: (nodeName === 'INPUT' ? element.type : null), + type: this._getNormalizedElementType(element), value: null, hasValue: false, onChange: null, @@ -157,28 +156,21 @@ class DOMDataBinder { _isObserverStale(element, observer) { const {type, metadata} = observer; - const nodeName = element.nodeName.toUpperCase(); return !( - type === (nodeName === 'INPUT' ? element.type : null) && + type === this._getNormalizedElementType(element) && this._compareElementMetadata(metadata, this._createElementMetadata(element)) ); } _setElementValue(element, value) { - switch (element.nodeName.toUpperCase()) { - case 'INPUT': - switch (element.type) { - case 'checkbox': - element.checked = value; - break; - case 'text': - case 'number': - element.value = value; - break; - } + switch (this._getNormalizedElementType(element)) { + case 'checkbox': + element.checked = value; break; - case 'TEXTAREA': - case 'SELECT': + case 'text': + case 'number': + case 'textarea': + case 'select': element.value = value; break; } @@ -188,22 +180,35 @@ class DOMDataBinder { } _getElementValue(element) { + switch (this._getNormalizedElementType(element)) { + case 'checkbox': + return !!element.checked; + case 'text': + return `${element.value}`; + case 'number': + return DOMDataBinder.convertToNumber(element.value, element); + case 'textarea': + case 'select': + return element.value; + } + return null; + } + + _getNormalizedElementType(element) { switch (element.nodeName.toUpperCase()) { case 'INPUT': - switch (element.type) { - case 'checkbox': - return !!element.checked; - case 'text': - return `${element.value}`; - case 'number': - return DOMDataBinder.convertToNumber(element.value, element); - } - break; + { + let {type} = element; + if (type === 'password') { type = 'text'; } + return type; + } case 'TEXTAREA': + return 'textarea'; case 'SELECT': - return element.value; + return 'select'; + default: + return null; } - return null; } // Utilities |