Ситуация в некотором роде
var someVar = some_other_function();
someObj.addEventListener("click", function(){
some_function(someVar);
}, false);
Проблема в том, что значение функции someVar
не видно внутри функции слушателя addEventListener
, где оно, вероятно, рассматривается как новая переменная.
javascript
dom
addeventlistener
Абхишек Ядав
источник
источник
Ответы:
В написанном вами коде нет ничего плохого. Оба
some_function
иsomeVar
должны быть доступны, если они были доступны в контексте, где анонимнобыл создан.
Проверьте, дает ли предупреждение значение, которое вы искали, убедитесь, что оно будет доступно в области анонимной функции (если только у вас нет кода, который работает с той же
someVar
переменной рядом с вызовомaddEventListener
)источник
bound function
помощью.bind()
метода позволит решить проблему с петлями developer.mozilla.org/en/docs/Web/JavaScript/Reference/...Почему бы просто не получить аргументы из целевого атрибута события?
Пример:
JavaScript - это ориентированный на прототип язык, помните!
источник
evt.currentTarget.myParam
? Если внутри 'someInput' есть другой элемент, этоevt.target
может быть ссылка на внутренний элемент. ( jsfiddle.net/qp5zguay/1 )this
! Использование этого метода в машинописи требует, чтобы элемент былany
или имел подтип.addEventListener
дляdocument
,evt.target.myParam
не работал для меня. Я должен был использоватьevt.currentTarget.myParam
вместо этого.Этот вопрос старый, но я решил предложить альтернативу, использующую ES5 .bind () - для будущих поколений. :)
Просто имейте в виду, что вам нужно настроить функцию слушателя с первым параметром в качестве аргумента, который вы передаете в bind (ваша другая функция), а второй параметр теперь является событием (а не первым, как это было бы) ,
источник
Function.prototype.bind()
вы не можете удалить прослушиватель событий , лучше вместо этого использовать функцию каррирования (см. Ответ @ tomcek112)some_other_func
переменная, вы можете передать любое значение, которое вы хотитеsome_func
.Вы можете просто связать все необходимые аргументы с помощью 'bind':
Таким образом, вы всегда получите
event
,arg1
и другие вещи , переданныеmyPrettyHandler
.http://passy.svbtle.com/partial-application-in-javascript-using-bind
источник
.bind()
но без нуля в качестве первого параметра. который не работал.null
, он отлично работает.bind(event, arg1)
, по крайней мере, с VueJS.Довольно старый вопрос, но у меня была такая же проблема сегодня. Самое чистое решение, которое я нашел, - это использовать концепцию карри.
Код для этого:
Называя функцию curried, она позволяет вам вызывать Object.removeEventListener для отмены регистрации eventListener в более позднее время выполнения.
источник
Вы можете добавлять и удалять списки событий с аргументами, объявив функцию как переменную.
myaudio.addEventListener('ended',funcName=function(){newSrc(myaudio)},false);
newSrc
это метод с myaudio в качестве параметраfuncName
является переменной имени функцииВы можете удалить слушателя с помощью
myaudio.removeEventListener('ended',func,false);
источник
Вы можете передать somevar по значению (не по ссылке) через функцию JavaScript, известную как закрытие :
Или вы можете написать общую функцию обтекания, такую как
wrapEventCallback
:Вот
wrapEventCallback(func,var1,var2)
как:источник
someVar
Значение должно быть доступно только вsome_function()
контексте, а не из слушателя. Если вам нравится иметь его внутри слушателя, вы должны сделать что-то вроде:и использовать
newVar
вместо.Другой способ - вернуть
someVar
значение изsome_function()
для дальнейшего использования в слушателе (как новая локальная переменная):источник
Вот еще один способ (этот работает внутри для циклов):
источник
Function.prototype.bind () - это способ привязать целевую функцию к определенной области и, при необходимости, определить
this
объект в целевой функции.Или захватить часть лексической области видимости, например, в цикле:
Наконец, если
this
параметр не нужен в целевой функции:источник
использование
И если вы хотите передать любое пользовательское значение в эту анонимную функцию, то самый простой способ сделать это
Отлично работает в моем проекте. Надеюсь, это поможет
источник
for
цикле.Вот как я получил событие прошло правильно.
источник
Отправка аргументов в функцию обратного вызова eventListener требует создания изолированной функции и передачи аргументов этой изолированной функции.
Вот хорошая маленькая вспомогательная функция, которую вы можете использовать. На основе приведенного выше примера "Привет, мир!"
Также необходимо сохранить ссылку на функцию, чтобы мы могли аккуратно удалить слушателя.
источник
storeFunc
должен быть вашей переменной ref. Поместите удаление слушателя в такой эффект, и все готово:useEffect(() => { return () => { window.removeEventListener('scroll', storeFunc, false); } }, [storeFunc])
Один из способов сделать это с помощью внешней функции :
Этот метод обертывания анонимной функции в скобках и немедленного ее вызова называется IIFE немедленного ( немедленного функции)
Вы можете проверить пример с двумя параметрами в http://codepen.io/froucher/pen/BoWwgz .
источник
Если я не ошибаюсь, использование вызова функции
bind
фактически создает новую функцию, которая возвращаетсяbind
методом. Это вызовет проблемы позже или если вы захотите удалить прослушиватель событий, так как это в основном похоже на анонимную функцию:Так что имейте это в виду.
Если вы используете ES6, вы можете сделать то же самое, что предложено, но немного чище:
источник
хорошая альтернатива в одну строку
источник
Также попробуйте это (IE8 + Chrome. Я не знаю для FF):
Надеюсь нет опечаток :-)
источник
Я застрял в этом, поскольку использовал его в цикле для поиска элементов и добавления к нему списка. Если вы используете его в цикле, то это будет отлично работать
источник
В 2019 году много изменений API, лучший ответ больше не работает, без исправления ошибки.
поделитесь рабочим кодом.
Вдохновлен всем приведенным выше ответом.
источник
Внутри всех функций есть специальная переменная: arguments . Вы можете передавать свои параметры как анонимные параметры и получать к ним доступ (по порядку) через переменную arguments .
Пример:
источник
источник
Следующий подход работал хорошо для меня. Модифицировано отсюда .
источник
Следующий ответ правильный, но приведенный ниже код не работает в IE8, если предположить, что вы сжали файл js с помощью yuicompressor. (На самом деле, большинство людей в США все еще используют IE8)
Таким образом, мы можем исправить вышеуказанную проблему следующим образом, и она отлично работает во всех браузерах
Надеюсь, это будет полезно для тех, кто сжимает файл js в производственной среде.
Удачи!!
источник
Следующий код работал нормально для меня (Firefox):
Вывод:
источник
Тебе нужно:
источник
Вероятно, не оптимально, но достаточно просто для тех, кто не супер смекалка. Поместите функцию, которая вызывает addEventListener, в свою собственную функцию. Таким образом, любые значения функций, передаваемые в него, сохраняют свою область видимости, и вы можете выполнять итерацию по этой функции столько раз, сколько захотите.
Пример Я работал с чтением файла, так как мне нужно было захватить и сделать предварительный просмотр изображения и имени файла. Мне потребовалось некоторое время, чтобы избежать асинхронных проблем при использовании нескольких типов загрузки файлов. Я бы случайно увидел одно и то же «имя» на всех рендерах, несмотря на загрузку разных файлов.
Первоначально все функции readFile () находились внутри функции readFiles (). Это вызвало асинхронные проблемы с областями видимости.
источник
просто хотел бы добавить. если кто-то добавляет функцию, которая обновляет флажки для прослушивателя событий, вам придется использовать
event.target
вместоthis
обновления флажки.источник
У меня очень упрощенный подход. Это может работать для других, поскольку это помогло мне. Это ... Когда у вас есть несколько элементов / переменных, которым назначена одна и та же функция, и вы хотите передать ссылку, самое простое решение ...
Вот и все. Это сработало для меня. Так просто.
источник
Другая альтернатива, возможно, не такая элегантная, как использование bind, но она действительна для событий в цикле
Он был протестирован для расширений Google Chrome и, возможно, e.srcElement должен быть заменен на e.source в других браузерах.
Я нашел это решение, используя комментарий, опубликованный Imatoria, но не могу пометить его как полезное, потому что у меня недостаточно репутации: D
источник
Это решение может хорошо смотреться
или связывать валидные тоже будет хорошо
источник