mirror of
https://github.com/marko-js/marko.git
synced 2025-12-08 19:26:05 +00:00
78 lines
2.4 KiB
JavaScript
78 lines
2.4 KiB
JavaScript
function syncBooleanAttrProp(fromEl, toEl, name) {
|
|
if (fromEl[name] !== toEl[name]) {
|
|
fromEl[name] = toEl[name];
|
|
if (fromEl[name]) {
|
|
fromEl.setAttribute(name, '');
|
|
} else {
|
|
fromEl.removeAttribute(name, '');
|
|
}
|
|
}
|
|
}
|
|
|
|
module.exports = {
|
|
/**
|
|
* Needed for IE. Apparently IE doesn't think that "selected" is an
|
|
* attribute when reading over the attributes using selectEl.attributes
|
|
*/
|
|
OPTION: function(fromEl, toEl) {
|
|
syncBooleanAttrProp(fromEl, toEl, 'selected');
|
|
},
|
|
/**
|
|
* The "value" attribute is special for the <input> element since it sets
|
|
* the initial value. Changing the "value" attribute without changing the
|
|
* "value" property will have no effect since it is only used to the set the
|
|
* initial value. Similar for the "checked" attribute, and "disabled".
|
|
*/
|
|
INPUT: function(fromEl, toEl) {
|
|
syncBooleanAttrProp(fromEl, toEl, 'checked');
|
|
syncBooleanAttrProp(fromEl, toEl, 'disabled');
|
|
|
|
if (fromEl.value != toEl.value) {
|
|
fromEl.value = toEl.value;
|
|
}
|
|
|
|
if (!toEl.$__hasAttribute('value')) {
|
|
fromEl.removeAttribute('value');
|
|
}
|
|
},
|
|
|
|
TEXTAREA: function(fromEl, toEl) {
|
|
var newValue = toEl.value;
|
|
if (fromEl.value != newValue) {
|
|
fromEl.value = newValue;
|
|
}
|
|
|
|
var firstChild = fromEl.firstChild;
|
|
if (firstChild) {
|
|
// Needed for IE. Apparently IE sets the placeholder as the
|
|
// node value and vise versa. This ignores an empty update.
|
|
var oldValue = firstChild.nodeValue;
|
|
|
|
if (oldValue == newValue || (!newValue && oldValue == fromEl.placeholder)) {
|
|
return;
|
|
}
|
|
|
|
firstChild.nodeValue = newValue;
|
|
}
|
|
},
|
|
SELECT: function(fromEl, toEl) {
|
|
if (!toEl.$__hasAttribute('multiple')) {
|
|
var selectedIndex = -1;
|
|
var i = 0;
|
|
var curChild = toEl.firstChild;
|
|
while(curChild) {
|
|
if (curChild.$__nodeName == 'OPTION') {
|
|
if (curChild.$__hasAttribute('selected')) {
|
|
selectedIndex = i;
|
|
break;
|
|
}
|
|
i++;
|
|
}
|
|
curChild = curChild.nextSibling;
|
|
}
|
|
|
|
fromEl.selectedIndex = i;
|
|
}
|
|
}
|
|
};
|