You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.3 KiB
JavaScript
105 lines
2.3 KiB
JavaScript
import {CLASS_LIST, NEXT, PREV, VALUE} from './symbols.js';
|
|
|
|
import {knownAdjacent, knownSiblings} from './utils.js';
|
|
|
|
import {attributeChangedCallback as ceAttributes} from '../interface/custom-element-registry.js';
|
|
import {attributeChangedCallback as moAttributes} from '../interface/mutation-observer.js';
|
|
|
|
export const emptyAttributes = new Set([
|
|
'allowfullscreen',
|
|
'allowpaymentrequest',
|
|
'async',
|
|
'autofocus',
|
|
'autoplay',
|
|
'checked',
|
|
'class',
|
|
'contenteditable',
|
|
'controls',
|
|
'default',
|
|
'defer',
|
|
'disabled',
|
|
'draggable',
|
|
'formnovalidate',
|
|
'hidden',
|
|
'id',
|
|
'ismap',
|
|
'itemscope',
|
|
'loop',
|
|
'multiple',
|
|
'muted',
|
|
'nomodule',
|
|
'novalidate',
|
|
'open',
|
|
'playsinline',
|
|
'readonly',
|
|
'required',
|
|
'reversed',
|
|
'selected',
|
|
'style',
|
|
'truespeed'
|
|
]);
|
|
|
|
export const setAttribute = (element, attribute) => {
|
|
const {[VALUE]: value, name} = attribute;
|
|
attribute.ownerElement = element;
|
|
knownSiblings(element, attribute, element[NEXT]);
|
|
if (name === 'class')
|
|
element.className = value;
|
|
moAttributes(element, name, null);
|
|
ceAttributes(element, name, null, value);
|
|
};
|
|
|
|
export const removeAttribute = (element, attribute) => {
|
|
const {[VALUE]: value, name} = attribute;
|
|
knownAdjacent(attribute[PREV], attribute[NEXT]);
|
|
attribute.ownerElement = attribute[PREV] = attribute[NEXT] = null;
|
|
if (name === 'class')
|
|
element[CLASS_LIST] = null;
|
|
moAttributes(element, name, value);
|
|
ceAttributes(element, name, value, null);
|
|
};
|
|
|
|
export const booleanAttribute = {
|
|
get(element, name) {
|
|
return element.hasAttribute(name);
|
|
},
|
|
set(element, name, value) {
|
|
if (value)
|
|
element.setAttribute(name, '');
|
|
else
|
|
element.removeAttribute(name);
|
|
}
|
|
};
|
|
|
|
export const numericAttribute = {
|
|
get(element, name) {
|
|
return parseFloat(element.getAttribute(name) || 0);
|
|
},
|
|
set(element, name, value) {
|
|
element.setAttribute(name, value);
|
|
}
|
|
};
|
|
|
|
export const stringAttribute = {
|
|
get(element, name) {
|
|
return element.getAttribute(name) || '';
|
|
},
|
|
set(element, name, value) {
|
|
element.setAttribute(name, value);
|
|
}
|
|
};
|
|
|
|
/* oddly enough, this apparently is not a thing
|
|
export const nullableAttribute = {
|
|
get(element, name) {
|
|
return element.getAttribute(name);
|
|
},
|
|
set(element, name, value) {
|
|
if (value === null)
|
|
element.removeAttribute(name);
|
|
else
|
|
element.setAttribute(name, value);
|
|
}
|
|
};
|
|
*/
|