Jump to content
  • 0

jQuery установить обработчик событий вперед уже имеющихся.


Kypaku
 Share

Question

Здравствуйте!
У меня на странице есть некоторый элемент при клике на него вызывается функция f1.
Мне нужно установить обработчик так чтобы при клике моя функция f2 вызывалась сначала, а потом уже f1.
Притом что я не могу явным образом отредактировать код вызывающий f1 - так как я делаю это из расширения браузера.

Link to comment
Share on other sites

11 answers to this question

Recommended Posts

  • 0

2wwt

А если название f1 не известно?

 

 

 

2wwt

А если название f1 не известно?

нет. Даже не известно как она привязана к событию.

 

 

Можно клонировать оригинальный элемент вместе с событиями (элемент то известен)

function f1(){  alert('default');}$('button').on('click', f1);//клонируем элемент вместе с обработчиками событийvar b_clone = $('button').clone(true);// Удаляем события click у оригинала$('button').off('click');// навешиваем свое$('button').on('click', function(){  alert('new');  // Запускам нужное оригинальное событие у клона  $(b_clone).trigger('click');});

Но тут есть несколько спорных моментов, это что делать с клоном потом (решать вам), ну и лучше проверить сколько и каких обработчиков навешано на элемент, посмотреть можно вот так:

console.log($._data( $('button').get(0) , 'events'));

А уж дальше решать как организовывать свой код.

  • Like 1
Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0
Не смог так получить список обработчиков

Значит они навешаны не с помощью jQuery, а другими средствами, jQuery хранит в кэше только то что сам навесил =)

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

Все верно, поэтому я и написал что прежде чем так делать нужно понимать что вообще происходит с элементом.

Link to comment
Share on other sites

  • 0

но судя по тому, что делает человек расширение для браузера, которое теоретически может запускаться на разных сайтах которые посещает пользователь через браузер, а там в свою очередь может быть сделано что угодно и как угодно, то тут нужно именно каким-то образом ставить обработчик до уже существующих. И опять же подозреваю, что <tag onClick="alert('')"> будет всегда отрабатывать первым. По крайней мере в хроме оно так и есть. А тут получается легко можно получить уже существующий код и вставить в его начало вызов своей функции.

  • Like 1
Link to comment
Share on other sites

  • 0

но судя по тому, что делает человек расширение для браузера, которое теоретически может запускаться на разных сайтах которые посещает пользователь через браузер, а там в свою очередь может быть сделано что угодно и как угодно, то тут нужно именно каким-то образом ставить обработчик до уже существующих. И опять же подозреваю, что <tag onClick="alert('')"> будет всегда отрабатывать первым. По крайней мере в хроме оно так и есть. А тут получается легко можно получить уже существующий код и вставить в его начало вызов своей функции.

Когда пытаюсь навесить через onclick в теге то alert - срабатывает быстрее чем стандартная функция, но если я пытаюсь выполнить JQuery-код перед ним, то он вообще не срабатывает, а только стандартная функция

Edited by Kypaku
Link to comment
Share on other sites

  • 0
но если я пытаюсь выполнить JQuery-код перед ним, то он вообще не срабатывает

Какой код, как пытаетесь выполнить?

 

У меня получается, что $('#Click').on('click',function(){}) отрабатывает раньше свойства onClick и addEventListener даже если он был добавлен последним

onClick и addEventListener выполняются в порядке добавления

обработчик навешанный на document всегда отрабатывает последним

 

Как опередить обработчик навешанный через $('#Click').on('click',function(){}) пока не знаю

Link to comment
Share on other sites

  • 0

В итоге придется писать част ькода на

но если я пытаюсь выполнить JQuery-код перед ним, то он вообще не срабатывает

Какой код, как пытаетесь выполнить?

У меня получается, что $('#Click').on('click',function(){}) отрабатывает раньше свойства onClick и addEventListener даже если он был добавлен последним

onClick и addEventListener выполняются в порядке добавления

обработчик навешанный на document всегда отрабатывает последним

Как опередить обработчик навешанный через $('#Click').on('click',function(){}) пока не знаю

любой, например jQuery(); alert(1);... - то алерт уже не работает. Придется использовать чистый JS чтобы выполнить опережающее действие.

Но в данном случае я проверял на одном сайте с котором были проблемы - конкретно на vk.com. На некоторых остальных jQuery работает.

Edited by Kypaku
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy