Неперехваченная ошибка типа: объект не является функцией (вызов функции onchange)

#javascript #jquery #html

#javascript #jquery #HTML

Вопрос:

Мой код большой, поэтому я буду держать его коротким. Я пытаюсь запустить событие onchange атрибута Select. Проблема в том, что когда я запускаю его, я получаю эту ошибку:

 Uncaught TypeError: object is not a function
  

Поскольку мой код большой, я покажу вам коды, в которых я описываю событие onchange и когда я его запускаю.

Вот когда объявляется функция onchange:

  function e(b, c) {
        function a() {
            if (b.current_modal) {
                b.current_modal.className = "hide"
            }
            f("overlay").className = "hide"
        }
        jigsaw.UI.close_lightbox = a;
        Util.$("overlay").click(a);
        Util.$("set-parts").change(function () {
            if (this.parts != 9) {
                jsaw.set_image("images/puzzle.jpeg")
            } else {
                jsaw.set_image("images/puzzle1.jpeg")
            }
            c.emit(jigsaw.Events.PARTS_NUMBER_CHANGED,  this.value);
            c.emit(jigsaw.Events.RENDER_REQUEST)
        });
        Util.$("game-options").click("a", function (h) {
            if (jigsaw.Events[this.id]) {
                h.preventDefault();
                c.emit(jigsaw.Events[this.id])
            }
        })
    }
  

и вот когда я запускаю событие onchange:

 show_time: function () {
           /*.....*/

        javascript: document.getElementById("date").innerHTML = ScoreResult;
        document.getElementById("set-parts").selectedIndex = 1;
        document.getElementById('set-parts').onchange();


    }
  

Комментарии:

1. @Joe document.getElementById(‘set-parts’).onchange();

2. Если у вас есть jQuery, почему вы используете ванильный DOM?

3. Я пытаюсь запустить событие onchange с помощью JavaScript. Функция onChange работает, когда я изменяю атрибут select на веб-сайте (в HTML), но когда я хочу вызвать событие onchange с помощью JavaScript, я получил эту ошибку @Joe

4. Я пробовал это @Joe, но ничего не срабатывает…

5. Попробуйте вызвать onchange следующим образом: document.getElementById(‘set-parts’).dispatchEvent(новое событие (‘change’)); если ti сработает, я дам вам полный ответ о том, почему

Ответ №1:

Я не использую jquery, но в JavaScript есть разница в том, как работает addEventListener(eventName, …) и on*eventName* = function(){} .

Я полагаю, что не современная библиотека будет использовать интерфейс on * eventName * по одной простой причине: я могу содержать только одного слушателя. Но on * eventName * все еще существует для поддержки устаревшего кода.

Теперь, в вашем конкретном случае, когда вы добавляете событие, ваша библиотека использует интерфейс addEventListener / removeEventListener / dispatchEvent подчеркивания DOM. Это не приведет к настройке устаревшего свойства on * eventName * для вашего обратного вызова, поэтому единственный способ, которым вы можете напрямую вызвать его, отправив событие с помощью метода DOM dispatchEvent (или вашей библиотечной оболочки) с объектом события с типом ‘change’. Это то, что делает «новое событие (‘change’)». Если вам нужно передать дополнительные свойства событию, вы можете создать его следующим образом:

 new Event('change', { foo : 1, bar : 'hello, world!' })
  

и эти свойства будут доступны в аргументах обратного вызова вашего слушателя [0] под любым именем, которое вы задали своему аргументу (в вашем случае вы оставили его пустым).