Возрождаю, потому что недавно вспомнил кое-что о JavaScript. Это зависит от того, как проверяется NodeList, но...
const singleNode = ((nodeList) => (node) => {
const layer = { // define our specific case
0: { value: node, enumerable: true },
length: { value: 1 },
item: {
value(i) {
return this[+i || 0];
},
enumerable: true,
},
};
return Object.create(nodeList, layer); // put our case on top of true NodeList
})(document.createDocumentFragment().childNodes); // scope a true NodeList
Теперь, если вы сделаете
const list = singleNode(document.body); // for example
list instanceof NodeList; // true
list.constructor === NodeList; // true
и list
имеет свойства length 1
и 0 в качестве вашего узла, а также все, что унаследовано от NodeList.
Если вы не можете использовать Object.create
, вы можете сделать то же самое, но в качестве конструктора с прототипом nodelist
и установить this['0'] = node;
, this['length'] = 1;
и создать с new
.
версия ES5
var singleNode = (function () {
// make an empty node list to inherit from
var nodelist = document.createDocumentFragment().childNodes;
// return a function to create object formed as desired
return function (node) {
return Object.create(nodelist, {
'0': {value: node, enumerable: true},
'length': {value: 1},
'item': {
"value": function (i) {
return this[+i || 0];
},
enumerable: true
}
}); // return an object pretending to be a NodeList
};
}());
person
Paul S.
schedule
04.07.2013