Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Клонирование обработчиков событий (https://javascript.ru/forum/events/51653-klonirovanie-obrabotchikov-sobytijj.html)

NapalmRain 14.11.2014 12:33

Клонирование обработчиков событий
 
Доброго всем времени суток!
Есть такая ситуация. На странице есть несколько селектов.
К ним при создании страница по средствам jQuery привязывается обработчик событий
if (typeof($("select"))==="object") {
			$("select").bind('change', validateText);
		}

Но потом происходит инициализация всех селектов, как кастомизированных списков с помощью собственного плагина. А плагин этот селект уничтожает в принципе и вместо него рисует блоки, списки и прочую ерунду, а значение хранит в спрятанном интупе.
Вот возник у меня вопрос: можно ли как-то считать, какие обработчики событий привязаны к объекту и продублировать их на новый объект?

Заранее благодарю за любой ответ!

danik.js 14.11.2014 12:43

Цитата:

Сообщение от NapalmRain
(typeof($("select"))==="object")

Бессмысленная проверка. Всегда будет true. Тут вообще не нужна проверка. Если селектов не найдется - bind просто отработает в холостую.
Кроме того: bind() устарел. Юзай on(). Кроме того typeof - не функция, а языковая конструкция, так что скобки не нужны.

Если бы кастомизатор селектов не удалял нативный селект - все бы работало само собой. А так - инициализируй кастомизатор раньше, затем навешивай обработчики не на нативный select, а на кастомный или хз че там у тя за плагин и как работает.

danik.js 14.11.2014 12:44

А вобще все проще - выкинь нахер этот кастомизатор.
Из моего опыта - заказчик почти всегда соглашается с моими доводами что кастомный селект - зло и отказывается от него.

NapalmRain 14.11.2014 12:52

Цитата:

Сообщение от danik.js (Сообщение 340893)
А вобще все проще - выкинь нахер этот кастомизатор.
Из моего опыта - заказчик почти всегда соглашается с моими доводами что кастомный селект - зло и отказывается от него.

Видимо тебе больше повезло, ибо мне сказано: "Сделай как на шаблоне и не волнует". Доводы слушать отказываются.
Ну да мне и пофигу.
То, что можно вешать обработчик уже на собственный селект, это понятно. Я так вопрос сейчас и решил, но мне стало интересно, возможно ли клонирование/копирование вообще. В принципе, как механизм. Может ведь и пригодиться.

NapalmRain 14.11.2014 12:55

Цитата:

Сообщение от danik.js (Сообщение 340892)
Бессмысленная проверка. Всегда будет true. Тут вообще не нужна проверка. Если селектов не найдется - bind просто отработает в холостую.
Кроме того: bind() устарел. Юзай on(). Кроме того typeof - не функция, а языковая конструкция, так что скобки не нужны.

Вот честно, про то, что bind устарел, не знал. За информацию благодарю. А то, что typeof не функция я понимаю, но скобки пишу исключительно для красоты, не более того.

рони 14.11.2014 13:14

NapalmRain,
неназначайте 'change' селекту а дополните функциональность вашего кастомизатора

NapalmRain 14.11.2014 13:26

Цитата:

Сообщение от рони (Сообщение 340902)
NapalmRain,
неназначайте 'change' селекту а дополните функциональность вашего кастомизатора

Так в этом и стоит вопрос. возможно ли, и если возможно, то Как?

рони 14.11.2014 14:34

Цитата:

Сообщение от NapalmRain
значение хранит в спрятанном интупе

если ваш кастомизатор работает то и меняйте это значение что ещё нужно то?

NapalmRain 14.11.2014 14:41

Цитата:

Сообщение от рони (Сообщение 340912)
если ваш кастомизатор работает то и меняйте это значение что ещё нужно то?

Собственно, сейчас я так и делаю.
Но вопрос я задал с целью узнать, возможно ли автоматическое считывание повешенных обработчиков, для более динамического и гибкого использования кастомизатора. Что просто провёл инициалицацию, а плагин в свою очередь считал, какие обработчики были повешены на селект и повесил их на новый созданный объект.

рони 14.11.2014 15:30

Селект сохранение 'change' для кастомизированного селекта
 
NapalmRain,
хватило бы опции {'change' : validateText} при кастомизации но если хочется поизвращаться и 'changeHandler' был один то можно так
<!doctype html>

<html lang="en">

<head>

  <meta charset="utf-8">

  <title>selectmenu demo</title>

  <link rel="stylesheet" href="http://code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">

  <style>

  label { display: block; }

  select { width: 200px; }

  .overflow { height: 200px; }

  </style>

  <script src="http://code.jquery.com/jquery-1.10.2.js"></script>

  <script src="http://code.jquery.com/ui/1.11.2/jquery-ui.js"></script>

</head>

<body>



<label for="number">Select a number:</label>

<select name="number" id="number">

  <option value="1">1</option>

  <option value="2" selected>2</option>

  <option value="3">3</option>

  <option value="4">4</option>

  <option value="5">5</option>

  <option value="6">6</option>

  <option value="7">7</option>

  <option value="8">8</option>

  <option value="9">9</option>

  <option value="10">10</option>

  <option value="11">11</option>

  <option value="12">12</option>

  <option value="13">13</option>

  <option value="14">14</option>

  <option value="15">15</option>

  <option value="16">16</option>

  <option value="17">17</option>

  <option value="18">18</option>

  <option value="19">19</option>

</select>



<script>
 function validateText()
       {
            alert(this.value)
       }
 $("select").on('change', validateText);

var sel = $( "#number" ) ;

  sel.selectmenu({change: $._data(sel[0], 'events')['change'][0]['handler']})

  .selectmenu( "menuWidget" )

    .addClass( "overflow" );

</script>



</body>

</html>


Часовой пояс GMT +3, время: 22:56.