2013-03-29 2 views
0

У меня есть, например, это:Есть ли способ подключить обратный вызов из одного элемента в другой в jQuery?

$first = $('#firstElement').click(function() { }); 

Но в какой-то момент исполнения страницы, я заменю этот элемент с другим:

$newElement = jQuery('<div />'); 
$first.replaceWith($newElement); 

Но я хочу, чтобы обратные вызовы для первый элемент во втором ...

Возможно ли это?

EDIT 1

Я уже знаю, как сделать это с .on() или .delegate(). Это мой сценарий:

Мне нужно загрузить что-то после смены селектора, однако содержимое этого селектора будет меняться в зависимости от роли зарегистрированного пользователя. У меня уже есть информация, хранящаяся в localstorage. Содержание этого селектор загружается через:

window.Core.setBranchesSelector($('#theElementInWhichTheSelectorWillBe')); 

Эта функция создать <select> элемент. Я могу сделать в js для этой страницы:

$('#parent').on('click', '#theElementInWhichTheSelectorWillBe', function() {}); 

Но я хотел сделать эту функцию как можно более гибким, таким образом, если я somethink как:

$elementToBeReplaced = $('<coolElement />').click(function() {}); 
/* Something really cool with that element */ 
Core.setBranchesSelector($elementToBeReplaced); 

Селектор наследуют функцию обратного вызова для click event ...

+3

Я предлагаю вам использовать делегирование событий и избежать этого сценария. – Nelson

+0

Я уже знаю, как это сделать с помощью .on() или с .delegate(), но я хотел сделать это таким образом ... Спасибо за ваше предложение anyways :) – Cito

ответ

2

Простой ответ на ваш вопрос: Нет, вы не можете этого сделать. По крайней мере, не в новых версиях jQuery (с 1.7 вы можете это сделать, поскольку @undefined уже заявляет в комментариях к ответу # 15708467).

Однако, вот простой пример использования делегации с .on():

http://jsfiddle.net/8dCQT/

$(function() { 
    $("#parent").on("click", ".child", function() { 
     alert($(this).text()); 
    }); 
    $("input").click(function() { 
     $(".child").remove(); 
     $("#parent").append("<div class='child'>I'm a replacement</div>"); 
    }); 
}); 

Вы заметите после нажатия на кнопку, нажав на замену DIV вызывает ту же функцию щелчка и оповещения с текстом нового div.

Примечание: важная часть здесь заключается в том, что замену можно выбрать с помощью того же селектора (в данном случае .child) в качестве оригинала. Я использовал класс здесь, но я мог бы использовать первый ребенок родителя или что-то еще.

Также обратите внимание: вам также не нужно связываться с непосредственным родителем, вы можете привязать весь путь вверху document, но это не рекомендуется, потому что это замедлит ваш код. Вы должны привязываться как можно ближе к элементам, которые вы хотите присоединить к событиям, поэтому код не должен слишком далеко ходить по дереву DOM.

+0

Я выбрал это как ответ, потому что он объясняет, как это будет работать. Кроме того, я добавил реальный ответ на мой вопрос: Нет, вы не можете этого сделать. Спасибо всем :) – Cito

1

jQuery не предоставляет API для прямого доступа к уже связанным событиям.

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

+0

+1 Вот что я имел в виду при делегировании событий. – Nelson

+0

Это не так, 'data ('events')'. – undefined

+0

@undefined Итак, с этим я мог бы получить обратный вызов и назначить другому? – Cito

1

Вам нужно будет указать один и тот же идентификатор в каждом элементе или дать каждому div общий класс. Как только вы это сделаете, это так же просто:

$(document).on('click','.some-common-class',function(){ 
}); 
+1

Вы никогда не должны привязываться к документу. Это создает очень сложный способ управления кодом и в конечном итоге снижает производительность. –

+0

@JosephLennox - Я согласен, но не знаю структуры документа ... это лучшая альтернатива (прямой перевод того, что раньше было '$ ('. Some-common-class'). Live()'). –