Нашёл только 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. 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
Вроде не очень красиво прятать элементы в конце... Надо будет обмозговать ваш вариант.
Не видны обработчики 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 Надо будет обмозговать ваш вариант. |
твой вариант

Спустя 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 написал(а):
Странно, у меня:
показывает onchange, когда на чистом js все делаю
<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> ...
live - на указанное событие родителю вешается обработчик, который анализирует кто сгенерировал событие - если $(".me") , то выполнит соответствующую функцию.
Вот почему тут можно элементы тасовать - обработка не зависит от элемента - они каждый раз заново определяются. То был <p> потом стал <span> ...
Спустя 25 минут, 44 секунды (10.03.2010 - 10:28) Nikitian написал(а):
Об этом всё догадывался.... А всё же, есть определённый обработчик onchange у селекта. Селект убиваем, но этот обработчик надо оставить, чтобы он срабатывал при изменении скрытого интупа, либо по как-то вызывать его, как функцию с параметрами. Вот тут-то и затык. Биндом ставлю обработчик, но вот вызвать его после замены элемента не получается.
Можете дать какой-нибудь толковый мануал по JS, чувствую, что надо хоть какую-то базу получить, а то совсем плаваю в нём.
Можете дать какой-нибудь толковый мануал по JS, чувствую, что надо хоть какую-то базу получить, а то совсем плаваю в нём.
Спустя 25 минут, 40 секунд (10.03.2010 - 10:54) Michael написал(а):
Посмотрел как в самом jQuery клонирование и переделал(из obj в obj2) (1):
- это только для jQuery обработчиков.
Как захватить и обработчик указанный в самом теге? Если известен какой, то так(2):
Если неизвестно что за атрибуты событий у источника имеются то эти атрибуты надо выделить как строки и при создании нового их указывать
var x = $('<div ' + attr+ '></div>').
или вариант - их можно перебрать - $(obj).attr('onclick'), $(obj).attr('onchange'); если возвращают ссылку на функцию - устанавливаем и у себя.
Вообще, по-хорошему, я бы делал так:
- имеем просто html элементы на странице, не используем атрибуты
- навешиваем на них обработчики
- при переносе на другой элемент выполняем кусок кода (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'); // обработка изменения
}