[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Копирование обработчиков
Nikitian
Есть элемент, например select. Все его обработчики необходимо перенести на другой элемент, span, причём этот спан находится в блоке, которым заменяется select (jquery replaceWith()).
Нашёл только clone(), но мне не нужен сам элемент, только его обработчики на другом элементе....
С js не очень дружу, как и с jquery (неотрывно от мануала).



Спустя 10 часов, 40 минут, 38 секунд (8.03.2010 - 09:01) Michael написал(а):
Лучше, мне кажется, использовать метод live для таких обработчиков, привязанный к классу или даже id.

$(document).ready(
function()
{
$('#xxx').live('click', function(){alert('111')});
$('#xxx').live('click', function(){alert('222')});
}
);

// Замена
$x = $('<div><span id="xxx">текст</span></div>');
$('#xxx').replaceWith($x);

Спустя 3 часа, 28 минут, 13 секунд (8.03.2010 - 12:29) Nikitian написал(а):
Да, live() вещь хорошая, но вот проблема: я не знаю каким образом обработчик был поставлен и влиять на это теоретически не могу. Вполне возможен вариант, когда всё написано вперемешку. Может всё-таки есть какой-то способ?

Спустя 58 минут, 59 секунд (8.03.2010 - 13:28) glock18 написал(а):
ну, как вариант проходить по циклом по существующему элементу и копировать обработчики на новый. один момент - нужно определять обработчики.

1. typeof == 'function'
2. в зависимости от библиотеки, может меняться а:
- наименование (onClick )
- обработчики могут лежать в каком-то члене класса (че-нить типа listeners)

3. имеет смысл проверить что лежит в объекте, чтобы определить что есть именно обработчики там, и где они лежат.

Спустя 1 час, 18 минут, 43 секунды (8.03.2010 - 14:47) Michael написал(а):
Можно еще попробовать так(если код в событиях не завязан на источнике события):
<select id="xxx">

$(document).ready(
function()
{
//

$('#xxx').click(function(){alert('111')});
$('#xxx').mouseover(function(){alert('over')});
$('#xxx')[0].onmouseout = function(){alert('out')};

}//
);

// замена
var $s = $('#xxx'); // селект
$x = $('<div><span >текст</span></div>');
$x.insertBefore($s); // вставляем перед
$s.hide().appendTo(document.body);// прячем в конце body
// делегируем обработку событий

$('span', $x).bind('click mouseover mouseout',
function(e) {
$s.triggerHandler(e.type);
}
);

Спустя 1 день, 9 часов, 17 минут, 27 секунд (10.03.2010 - 00:04) Nikitian написал(а):
glock18
Не видны обработчики on* если пройти по объекту циклом. Пример тут: http://nikitian.ru/test.html

Michael
Вроде не очень красиво прятать элементы в конце... Надо будет обмозговать ваш вариант.

Спустя 8 часов, 29 минут, 1 секунда (10.03.2010 - 08:33) Michael написал(а):
Цитата (Nikitian @ 9.03.2010 - 23:04)
glock18
Не видны обработчики on* если пройти по объекту циклом. Пример тут: http://nikitian.ru/test.html


Они будут видны если определять их не в теге, а в js:
элемент.onclick = function(){}

- самый нормальный кроссбраузерный подход. Вот интересная статья на эту тему
Я проверял(в условии добавляется чтобы iii начинался с on), а вот куда джи прячет ссылки сам пока не смотрел.

Цитата
Michael
Вроде не очень красиво прятать элементы в конце...

- это был вариант временный, чтобы применить пока разбераешься с копировкой обработчиков, вдруг "горит".
Цитата
Michael
Надо будет обмозговать ваш вариант.

твой вариант smile.gif (я не так стар )

Спустя 55 минут, 4 секунды (10.03.2010 - 09:28) Nikitian написал(а):
Создал обработчик не в теге - в листинге методов объекта он не появился (
И ещё, почему нельзя перекинуть обработчик так?

$(".me").live("change",function(){alert('1');});
$(".notme").bind("click",$(".me").onchange);

Спустя 16 минут, 28 секунд (10.03.2010 - 09:45) Michael написал(а):
Странно, у меня:
<select name="people" onchange="calculate( );" id="sel">

s = '';
for (var i in obj)
{
if (typeof(obj[i]) =="function") {
s+= i + '<br>';
}
}


показывает onchange, когда на чистом js все делаю

Цитата
Создал обработчик не в теге - в листинге методов объекта он не появился (
И ещё, почему нельзя перекинуть обработчик так?

совсем не то. live не создает элементу обработчик а навешивает слушателя на родителя (раньше - document, теперь(1.4) вроде на непосредственного) который при всплытии анализирует источник.

Спустя 3 минуты, 11 секунд (10.03.2010 - 09:48) Nikitian написал(а):
Хм... Если не live и не bind, то как навесить обработчик?
Что-то я совсем запутался %)

Спустя 14 минут, 54 секунды (10.03.2010 - 10:03) Michael написал(а):
bind - прямо элементу назначить функцию обработчик

live - на указанное событие родителю вешается обработчик, который анализирует кто сгенерировал событие - если $(".me") , то выполнит соответствующую функцию.
Вот почему тут можно элементы тасовать - обработка не зависит от элемента - они каждый раз заново определяются. То был <p> потом стал <span> ...

Спустя 25 минут, 44 секунды (10.03.2010 - 10:28) Nikitian написал(а):
Об этом всё догадывался.... А всё же, есть определённый обработчик onchange у селекта. Селект убиваем, но этот обработчик надо оставить, чтобы он срабатывал при изменении скрытого интупа, либо по как-то вызывать его, как функцию с параметрами. Вот тут-то и затык. Биндом ставлю обработчик, но вот вызвать его после замены элемента не получается.

Можете дать какой-нибудь толковый мануал по JS, чувствую, что надо хоть какую-то базу получить, а то совсем плаваю в нём.

Спустя 25 минут, 40 секунд (10.03.2010 - 10:54) Michael написал(а):
Посмотрел как в самом jQuery клонирование и переделал(из obj в obj2) (1):
	var obj =   document.getElementById('xxx');
var obj2 = document.getElementById('ddd');
var events = jQuery.data( obj, "events" );
for ( var type in events ) {
for ( var handler in events[ type ] ) {
jQuery.event.add( obj2, type, events[ type ][ handler ], events[ type ][ handler ].data );
}
}

- это только для jQuery обработчиков.
Как захватить и обработчик указанный в самом теге? Если известен какой, то так(2):
obj2.onclick = $(obj).attr('onclick');				

Если неизвестно что за атрибуты событий у источника имеются то эти атрибуты надо выделить как строки и при создании нового их указывать
var x = $('<div ' + attr+ '></div>').
или вариант - их можно перебрать - $(obj).attr('onclick'), $(obj).attr('onchange'); если возвращают ссылку на функцию - устанавливаем и у себя.

Вообще, по-хорошему, я бы делал так:
- имеем просто html элементы на странице, не используем атрибуты
- навешиваем на них обработчики
- при переносе на другой элемент выполняем кусок кода (1)

Спустя 40 минут, 1 секунда (10.03.2010 - 11:34) Michael написал(а):
Цитата (Nikitian @ 10.03.2010 - 09:28)
А всё же, есть определённый обработчик onchange у селекта. Селект убиваем, но этот обработчик надо оставить, чтобы он срабатывал при изменении скрытого интупа, либо по как-то вызывать его, как функцию с параметрами. Вот тут-то и затык. Биндом ставлю обработчик, но вот вызвать его после замены элемента не получается.

А как изменяются значения скрытого инпута? Программно же?
Если на этом инпуте висит onchange, то и вызвать его надо программно:

   $('#hidd').change(function() {
alert($(this).val());
});

function whatdo()
{
var x = $('#hidd').val();
$('#hidd').val(x+1); // изменяем значение скрытого инпута
$('#hidd').triggerHandler('change'); // обработка изменения
}

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.