Создайте редактируемую копию объекта dom - PullRequest
0 голосов
/ 09 июня 2019

Я хочу создать программу, которая копирует 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
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...