Two.JS: «Не удалось выполнить removeChild на узле при попытке удалить фигуры, интерпретированные из SVG.

Я использую Two.JS для рендеринга фигур на сцену, которые были интерпретированы из SVG с использованием метода интерпретации Two.js.

У них добавлено свойство продолжительности жизни, и в цикле рендеринга Two я проверяю иллюстрацию и удаляю ее, если время истекло.

Это работает большую часть времени (> 99%), но иногда форма зависает, и я получаю эту ошибку:

Uncaught NotFoundError: Не удалось выполнить команду removeChild на узле: удаляемый узел не является дочерним по отношению к этому узлу.

showIllustration: (which) =>
    alreadyIllustration = false
    for shape, i in @_shapes
        if shape.isIllustration is true
            alreadyIllustration = true

    if alreadyIllustration is false
        switch which
            when 'food'
                if Math.random() > 0.49
                    id = 'currywurst'
                else
                    id = 'pretzel'
            when 'mascot'
                if Math.random() > 0.49
                    id = 'ample'
                else
                    id = 'bear'
            when 'landmark'
                if Math.random() > 0.49
                    id = 'tower'
                else
                    id = 'tor'

        illustration = @_two.interpret document.getElementById id
        illustration.center().translation.set @_two.width / 2, @_two.height / 2
        @_foreGround.add illustration
        illustration.lifeSpan = 100
        illustration.creationTime = new Date().getTime()
        illustration.isIllustration = true
        @_shapes.push illustration

и вот мой цикл для удаления иллюстраций:

removeShapes: () =>
    time = new Date().getTime()
    for shape, i in @_shapes by -1
        if shape.lifeSpan
            if time - shape.creationTime >= shape.lifeSpan
                shape.remove()
                @_shapes.splice i, 1

вот соответствующий код из two.js, где возникает ошибка.

removeChild: function(id) {
        var elem = this.domElement.querySelector('#' + id);
        if (elem) {
          this.elem.removeChild(elem);
        }
      },

это происходит только с интерпретируемыми svg, а не с фигурами. как формы, так и интерпретируемые формы возвращают объекты two.polygon, поэтому это кажется странным.

Одна вещь, о которой я могу думать, это то, что two.js использует идентификатор элемента, который он интерпретирует как идентификатор созданного многоугольника, и если есть два элемента с одинаковым идентификатором, это вызывает ошибку при попытке удалить. Но проверка уже иллюстраций, кажется, работает правильно каждый раз, чтобы остановить добавление иллюстраций, если они существуют.

Я также попытался установить идентификатор на время его создания вместо идентификатора элемента, чтобы он каждый раз был уникальным, но это вызывает другие проблемы и ошибки.

Большое спасибо.


person Jack Wild    schedule 16.06.2014    source источник
comment
Похоже, у вас есть проблема, аналогичная предыдущему сообщению -array-of-all-shapes" title="некоторые фигуры не удаляются в двух js при переборе массива всех фигур">stackoverflow.com/questions/24155757/ с повторением изменяемого массива. Во всяком случае, я думаю, что это может быть ошибка в Two.js, потому что похоже, что удаляемый элемент не является дочерним элементом группы. Я исправлю это прямо сейчас.   -  person jonobr1    schedule 17.06.2014
comment
В последней сборке two.js в ветке master должно быть исправлено это: raw.githubusercontent.com/jonobr1/two.js/master/build/two.js Попробуйте — ошибок больше не будет.   -  person jonobr1    schedule 17.06.2014
comment
Потрясающе... как вам обслуживание клиентов? Я попробую сегодня вечером и дам вам знать, если это исправлено.   -  person Jack Wild    schedule 18.06.2014
comment
На самом деле это был мой вопрос из предыдущего... они были похожи, но разные проблемы. ;)   -  person Jack Wild    schedule 18.06.2014
comment
Круто, дай знать, как дела.   -  person jonobr1    schedule 18.06.2014
comment
@ jonobr1 Я обновился до последней версии v of Two, дам вам знать, если снова увижу ошибку.   -  person Jack Wild    schedule 20.06.2014


Ответы (1)


Это не совсем полное исправление, но я обнаружил, что проблема связана с событиями размытия/затухания в окне и с тем, как Chrome справляется с этим. Ошибка, похоже, произошла, когда окно не было в фокусе, и сработала та же иллюстрация, которая отображалась в данный момент.

Иллюстрация была удалена из массива, но не удалена из DOM до тех пор, пока окно не вернется в фокус, а это означало, что проверка пройдет успешно и будет отображаться несколько экземпляров одной и той же иллюстрации с одним и тем же идентификатором.

Чтобы предотвратить возникновение проблемы, я отключил события, когда окно не находится в фокусе, поэтому новые иллюстрации не могут отображаться, пока окно не вернется в фокус.

person Jack Wild    schedule 17.06.2014