Я хочу создать программу, которая копирует HTML-элемент как объект, чтобы впоследствии манипулировать без изменения реального DOM.
Я создаю простую многоцелевую функцию, которая принимает строку в качестве входных данных, а затем просматривает document.body
, чтобы найти родительский тег этого текста.Я использую парсер DOM для этого, но быстро обнаружил, что не могу скопировать узел HTML с Object.create
.
Вот код, который вызывает проблему:
[...(Object.create(document.body).childNodes)]
Я ожидал, что результат будет редактируемой копией всех дочерних узлов document.body
, но вместо этого получил эту ошибку:
TypeError: Illegal invocation
at Object.module.exports (bundle.js:6)
at Object.1.../Util/parsers (bundle.js:10)
at o (bundle.js:1)
at r (bundle.js:1)
at bundle.js:1
Примечание: Я использую browserify по порядкучтобы связать мой код.
Вот весь мой (незаконченный) код:
основной скрипт:
require('../Util/parsers')
module.exports = function(searchString, opts = {}) {
const options = Object.assign({start: document.body, textOnly: true, parentLevel: 1, excludeTags: []}, opts)
console.log([...(Object.create(options.start).childNodes)].mapFlat('childNodes', i => i instanceof NodeList ? [...i] : i))
}
try{
module.exports()
} catch(e) {
console.log(e)
}
Util / parsers:
Array.prototype.mapFlat = function(property, failed = i => i) {
function runMap(retval, property, failed = i => i) {
retval = retval.map(i => {
if(i[property]) {
const retval = [i, i[property]].flat(Infinity)
delete i[property]
return retval
}
return failed(i)
}).flat(Infinity)
return retval
}
let retval = this
retval = runMap(retval, property, failed)
while(retval.filter(i => i[property])[0]) {
retval = runMap(retval, property, failed)
}
return retval
}