Присоединение события click к объекту JQuery, еще не добавленному в DOM
У меня возникли проблемы с подключением события click к объекту JQuery, прежде чем добавлять его в DOM.
В основном у меня есть эта кнопка, возвращающая мою функцию, а затем добавляю ее в DOM. Я хочу вернуть кнопку с помощью собственного обработчика кликов. Я не хочу выбирать его из DOM для прикрепления обработчика.
Мой код:
createMyButton = function(data) {
var button = $('<div id="my-button"></div>')
.css({
'display' : 'inline',
'padding' : '0px 2px 2px 0px',
'cursor' : 'pointer'
}).append($('<a>').attr({
//'href' : Share.serializeJson(data),
'target' : '_blank',
'rel' : 'nofollow'
}).append($('<image src="css/images/Facebook-icon.png">').css({
"padding-top" : "0px",
"margin-top" : "0px",
"margin-bottom" : "0px"
})));
button.click(function () {
console.log("asdfasdf");
});
return button;
}
Кнопка, которая возвращает, не может поймать событие клика. Однако, если я это сделаю (после того, как кнопка добавлена в DOM):
$('#my-button').click(function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});
Это работает... но не для меня, а не для того, что я хочу.
Я потратил часы, пытаясь сделать эту работу, похоже, связан с тем, что объект еще не является частью DOM. Любая помощь будет очень оценена.
О! Кстати, я работаю с OpenLayers, а объектом DOM, к которому я добавляю эту кнопку, является OpenLayers.FramedCloud(Wich еще не является частью DOM, но будет сразу после запуска нескольких событий).
Ответы
Ответ 1
Используйте это. Вы можете заменить тело на любой родительский элемент, который существует в dom ready
$('body').on('click', '#my-button', function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});
Посмотрите http://api.jquery.com/on/ для получения дополнительной информации о том, как использовать on(), поскольку он заменяет live() с версии 1.7+.
Ниже перечислены, какую версию вы должны использовать
$(селектор).live(события, данные, обработчик);//jQuery 1.3 +
$(document).delegate(селектор, события, данные, обработчик);//jQuery 1.4.3 +
$(document).on(события, селектор, данные, обработчик);//jQuery 1.7 +
Ответ 2
Я действительно удивлен, что никто не опубликовал это еще
$(document).on('click','#my-butt', function(){
console.log('document is always there');
})
Если вы не знаете, какие элементы будут на этой странице в то время, просто присоедините его к document
.
Примечание: это не оптимально с точки зрения производительности - чтобы получить максимальную скорость, нужно попытаться подключиться к ближайшему родительскому элементу, который будет вставлен.
Ответ 3
Попробуйте это.... Замените тело родительским селектором
$('body').on('click', '#my-button', function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});
Ответ 4
Try:
$('body').on({
hover: function() {
console.log("yeahhhh!!! but this doesn't work for me :(");
},
click: function() {
console.log("yeahhhh!!! but this doesn't work for me :(");
}
},'#my-button');
пример jsfiddle.
При использовании .on() и привязки к динамическому элементу вам нужно обратиться к элементу, который уже существует на странице (например, в примере). Если вы можете использовать более конкретный элемент, который улучшил бы производительность.
Обработчики событий привязаны только к выбранным в данный момент элементам; Oни должен существовать на странице в момент, когда ваш код выполняет вызов .on(). Чтобы убедиться, что элементы присутствуют и могут быть выбраны, выполните событие привязка внутри готового документа документа для элементов, находящихся в HTML-разметка на странице. Если на страницу вводится новый HTML-код, выберите элементы и присоедините обработчики событий после того, как новый HTML помещен на страницу. Или используйте делегированные события для присоединения события обработчик, как описано ниже.
Src: http://api.jquery.com/on/
Ответ 5
Вам нужно добавить его. Создайте элемент с помощью:
var $div = $("<div>my div</div>");
$div.click(function(){alert("clicked")})
return $div;
Затем, если вы добавите его, он будет работать.
Взгляните на ваш пример здесь и простую версию здесь.
Ответ 6
В случае события
$('#my-button').on('click', function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});
Или добавьте событие после добавления
Ответ 7
Использует ли с вами работу .live?
$("#my-button").live("click", function(){ alert("yay!"); });
http://api.jquery.com/live/
ИЗМЕНИТЬ
Как и в jQuery 1.7, метод .live() устарел. Используйте .on() для присоединения обработчиков событий. Пользователи более старых версий jQuery должны использовать .delegate() в предпочтении .live().
http://api.jquery.com/on/
Ответ 8
Метод jQuery.on используется для связывания событий даже без присутствия элемента при загрузке страницы.
Вот ссылка
Он используется следующим образом:
$("#dataTable tbody tr").on("click", function(event){
alert($(this).text());
});
Прежде чем использовать jquery 1.7, метод live(), но теперь он устарел.
Ответ 9
Дополнение информации для тех людей, которые используют .on() для прослушивания событий, связанных с входами внутри недавно загруженных ячеек таблицы; Мне удалось связать обработчики событий с такими ячейками таблицы, используя делегат(), но .on() не будет работать.
Я привязал идентификатор таблицы к .delegate() и использовал селектор, который описывает входы.
например.
HTML
<table id="#mytable">
<!-- These three lines below were loaded post-DOM creation time, using a live callback for example -->
<tr><td><input name="qty_001" /></td></tr>
<tr><td><input name="qty_002" /></td></tr>
<tr><td><input name="qty_003" /></td></tr>
</table>
JQuery
$('#mytable').delegate('click', 'name^=["qty_"]', function() {
console.log("you clicked cell #" . $(this).attr("name"));
});
Ответ 10
Возможно, bind() поможет:
button.bind('click', function() {
alert('User clicked');
});