Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   удалить экземпляр со всеми его перехватчиками (https://javascript.ru/forum/events/44669-udalit-ehkzemplyar-so-vsemi-ego-perekhvatchikami.html)

gradus 28.01.2014 20:34

удалить экземпляр со всеми его перехватчиками
 
В зависимости от выбора в select, создаются разные экземпляры класса.
В каждом классе есть свои обработчики.
К примеру:
function version1(){
 $('#name').click(function(){
  alert('version1');
 });
 rename_user=function(){
  alert('version 1 (rename_user)');
 }
}


function version2(){
 $('#name').click(function(){
  alert('version2');
 });
 rename_user=function(){
  alert('version 2 (rename_user)');
 }
}

$('#sel').change(function(){
 var class_name=$(this).val();
 new class_name(); // может и не сработает, но это я для примера
});

Проблема в том что если сначала вызвать version1, а потом version2, то события в version1 все равно срабатывают.
Как можно удалить version1, так что бы все его методы и события удалились, не перебирая их ручками ?

рони 28.01.2014 20:57

gradus,
назначить обработчики с помощью on что и так всегда делается в jquery даже если вы не пишите on и off когда нужно отключить.

Vlasenko Fedor 28.01.2014 22:29

<body>
    <select size="3" id="sel">
      <option disabled>Выберите героя</option>
      <option value="1">Чебурашка</option>
      <option selected value="2">Крокодил Гена</option>
      <option value="3">Шапокляк</option>
    </select>
    <input id="test" type="button" value="Test"/>
    <script>
      function version1() {
        alert('version1');
        test.onclick = func1;
      }

      function version2() {
        alert('version2');
        test.onclick = func2;
      }

      function version3() {
        alert('version3');
        test.onclick = func3;
      }
		
      sel.onchange = function () {
        window['version' + this.value]();
      }
      
      function func1(){alert('func1')}
      function func2(){alert('func2')}
      function func3(){alert('func3')}
    </script>
  </body>

kostyanet 29.01.2014 06:42

Нет, проблема вот в чем:

Цитата:

Сообщение от gradus
создаются разные экземпляры класса.

насколько разные, какого класса, куда девается разница и в таком роде.

Меняйте систему.

gradus 29.01.2014 18:03

Poznakomlus, это не вариант. В функциях разные обработчики, почти на разных элементах.
В общем все же сделал ручками :(
function version1(){
 var self=this;
 var myEventName='version1';

 self.docList=function(){
 }; 

 $('#name').bind('click.'+myEventName,self.docList);
 
 self.__destruct=function(){
	 $('#name').unbind('click.'+myEventName,self.docList);
 };
}
my_exc_func= new version1();
// my_exc_func.__destruct();
// delete my_exc_func;

kostyanet, cпасибо за ответ по делу!

Vlasenko Fedor 29.01.2014 23:42

Цитата:

Сообщение от gradus
В функциях разные обработчики

где ты увидел в примерах одинаковые обработчики
self.__destruct че за порнографию написал
где метод __destruct вызывается в js нет деструктора
читать здесь http://javascript.ru/blog/gordon-fre...pt-Kak-dobavit
http://javascript.ru/tutorial/events...-nuzhnogo-tipa

gradus 30.01.2014 20:02

Poznakomlus, прошу прощения, я имел ввиду обработчики на разные элементы.
К примеру в version1 мы вешаем событие на $('#name'), а в version2 нам навешивать событие на этот элемент не нужно (в примере кода я это не указал).
Цитата:

Сообщение от Poznakomlus (Сообщение 294847)
self.__destruct че за порнографию написал
где метод __destruct вызывается в js нет деструктора

Вы истинный программист, который не читает комментарии кода :)
// my_exc_func.__destruct();

И к чему эти ссылки ? чем алгоритм описанный в статье отличается от моего последнего примера ?)

kostyanet 02.02.2014 00:15

Походу behaviour корячится.


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