Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!

Как эмулировать клик по элементу после того, как он отрендерился?

Доброго времени суток уважаемые!

Подскажите пожалуйста, как правильно "вызвать" click() на элементе после того как он отрендерился?

Суть проблемы, и мои попытки её решения:
methods: {
    clickFunction() { //Функция которая "эмулирует" событие "click"
        document.querySelector('#myInput').click(); //Вот так - всё работает, проблема только в том, что в этот момент времени элемент ещё не успел отрендерится, по этому "кликать некуда"

        //Порывшись в документации VueJS нашел вот такое "решение":
        this.$nextTick(function() {
            document.querySelector('#myInput').click(); //Не работает
        }

        //Нашел некий "костыль" призванный исправить сие
        setTimeout(function () {
            document.querySelector('#myInput').click(); //Но... он тоже не работает
        }, 0); //И если добавить времени, например 500 или 1000мс - он тоже не работает
    }
}


Можно как-то с этим бороться, и если можно, то как?

P.S. Я в целом понимаю, откуда у проблемы "растут ноги" и имею общее понимание на тему "почему оно именно так"... Я не понимаю, как это правильно решить и можно ли это решить вообще, правильно. Я думаю, задача довольно банальная, "подождать пока элемент отрендерится и что-то с ним сделать".

Элемент - представленный в примере - это FileInput (кликать нужно на него, что бы вызвать диалог выбора файлов), варианты уровня "заменить его на что-то ещё" или "заранее создать миллион инпутов и потом их использовать" и т.п. варианты - отпадают сразу.

Через this.$refs тоже пробовал, эффект аналогичный (не работает).

UPD. Алтернативный вариант, для простоты понимания:
methods: {
    async clickFunction() {
        await this.$nextTick();
        document.querySelector('#myInput').click(); //Так работать не будет, но если бы функция не была асинхронной - всё бы работало исправно
    }
}
  • Вопрос задан
  • 1322 просмотра
Пригласить эксперта
Ответы на вопрос 2
filgaponenko
@filgaponenko
frontend developer
Вы можете попробовать использовать хук жизненного цикла компонента mounted.
Для генерации события нужно использовать метод dispatchEvent в который передавать событие нужного типа созданное с помощью конструктора.
Пример
Ответ написан
0xD34F
@0xD34F Куратор тега JavaScript
Элемент - представленный в примере - это FileInput (кликать нужно на него, что бы вызвать диалог выбора файлов)

Нет, ничего у вас не получится. Этот диалог может быть открыт только в результате настоящих действий пользователя (и то не всех: клик, нажатие клавиши - окей; скролл, движение мыши, вызов контекстного меню - нет), а не их имитации. По крайней мере, в Хроме. В Фаерфоксе имитировать можно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы