Добавление события мыши в динамически созданный элемент Vuejs

Мне просто интересно, пробовал ли кто-нибудь сделать что-то подобное (это в рамках созданного метода vuejs):

for (let i = 0; i < this.items.length; i++) {
    let bar = document.createElement('div');
  bar.className = this.items[i].colour;
  bar.style.cssText = `width: ${this.items[i].weight}%`;
  bar.setAttribute("mouseover", this.showBlock(500, false)); //not working
    document.querySelector('.bar').appendChild(bar);
}

https://jsfiddle.net/phfilly/eywraw8t/167799/

Я пытаюсь добавить событие при наведении курсора мыши (строка 32) на только что созданный элемент. Есть ли другой способ добиться чего-то подобного?

Так и должно быть. bar.addEventListener ("наведение указателя мыши", this.showBlock (500, false)); Обычный javascript

saiyan 13.07.2018 15:33

Почему бы вам не использовать Vue для создания элементов для items? Затем вы можете добавить директиву @mouseover.

juzraai 13.07.2018 15:34

@saiyan Я тоже пробовал с addEventListener ... все еще нет реакции в методе showBlock.

Muppet 13.07.2018 15:43

@juzraai, это хорошая идея, позволь мне попробовать

Muppet 13.07.2018 15:44

Разве это не то, чего ты хочешь? jsfiddle.net/n8p917Lr

Bert 13.07.2018 16:22

@Bert Спасибо, сэр, это правильно. Не знаю, что усложнил для себя

Muppet 14.07.2018 17:01
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
460
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это . Я внес некоторые изменения в ваш код jsfiddle.

for (let i = 0; i < this.items.length; i++) {
        let bar = document.createElement('div');
      bar.className = this.items[i].colour;
      bar.style.cssText = `width: ${this.items[i].weight}%`;
            // ?
     // bar.setAttribute("mouseover", this.showBlock(500, false));
        document.querySelector('.bar').appendChild(bar);



    }
    var that=this;
    setTimeout(function(){
      document.querySelector('.bar').childNodes.forEach(function(e,y){
        e.addEventListener("mouseover", function(){that.showBlock(500, false)});
      });},100);

работал у меня в jsfiddle

Ответ принят как подходящий

Проблема:

Посмотрим на проблемную строку:

bar.setAttribute("mouseover", this.showBlock(500, false));

Я вижу следующие проблемы:

  • Сначала он вычисляет возвращаемое значениеthis.showBlock(500, false), затем устанавливает для него атрибут mouseover. Скорее всего, это значение undefined, поскольку ваша функция ничего не возвращает.
  • Значение даже не имеет значения, потому что атрибут mouseover не имеет абсолютно никакого значения ни в HTML, ни во Vue, который ищет v-on:mouseover или @mouseover.
  • Vue ищет эти атрибуты / директивы только при инициализации, но вы добавляете элементы после инициализации Vue.

Возможные решения:

А) Убедитесь, что ваша модель Vue доступна как глобальная переменная (например, window.app), тогда вы можете проделать трюк с атрибутом HTML onmouseover и преобразованием вызова функции в строку:

bar.setAttribute("onmouseover", "app.showBlock(500, false)");

Б) Добавить прослушиватель событий вместо атрибута. Что-то вроде этого:

bar.addEventListener("mouseover", function () { app.showBlock(500, false); });

Это также требует, чтобы ваш экземпляр Vue был доступен.

См. Полное решение в @ saiyan ответ.

C) Поскольку вы не делаете ничего, что не может сделать Vue, вы можете (и я советую вам) использовать Vue для создания элементов. На мой взгляд, в этом суть Vue - облегчить боль при создании и изменении элементов. Основываясь на вашем процитированном цикле for, реализация Vue будет выглядеть так (в вашем HTML):

<div class = "bar">
  <div v-for = "i in items" :class = "i.colour" :style = "{ width: i.weight + '%' }" @mouseover = "showBlock(500, false)"></div>
</div>

Для полного решения, пожалуйста, проверьте @ Скрипка Берта.

Другие вопросы по теме