Проблема проста. У меня массивное приложение javascript. И в приложении много раз, когда я использую код, который выглядит примерно так:
$('#treat').html(new_data);
....
....
$('#cool').html(some_html_data);
....
....
$('#not_cool').html(ajax_data);
Поэтому я хочу, чтобы каждый раз, когда вызывается эта функция html(), я хочу выполнить набор функций.
function do_these_things_every_time_data_is_loaded_into_a_div()
{
$('select').customSelect();
$('input').changeStyle();
etc.
}
Как мне это сделать? Спасибо.
Для этого вы можете использовать специальные обработчики событий:
$('#treat').html(new_data);
// Trigger the custom event after html change
$('#treat').trigger('custom');
// Custom event handler
$('#treat').on('custom', function( event) {
// do_these_things_every_time_data_is_loaded_into_a_div
alert('Html had changed!');
});
ОБНОВИТЬ
На основании ответа здесь и с некоторыми изменениями вы можете сделать это:
// create a reference to the old '.html()' function
$.fn.htmlOriginal = $.fn.html;
// redefine the '.html()' function to accept a callback
$.fn.html = function (html, callback) {
// run the old '.html()' function with the first parameter
this.htmlOriginal(html);
// run the callback (if it is defined)
if (typeof callback == "function") {
callback();
}
}
$("#treat").html(new_data, function () {
do_these_things_every_time_data_is_loaded_into_a_div();
});
$("#cool").html(new_data, function () {
do_these_things_every_time_data_is_loaded_into_a_div();
});
Легко поддерживаемый и меньше кода в соответствии с вашими требованиями.
.html()
? Разве это не было бы довольно долго?
Вы можете перезаписать метод jQuery.fn.html(), как описано в разделе Функции переопределения jQuery
Например, используйте это:
var oHtml = jQuery.fn.html;
jQuery.fn.html = function(value) {
if(typeof value !== "undefined")
{
jQuery('select').customSelect();
jQuery('input').changeStyle();
}
// Now go back to jQuery original html()
return oHtml.apply(this, value);
};
У меня для вас небольшой скрипт. Вставьте это в свой javascript:
//@Author Karl-André Gagnon
$.hook = function(){
$.each(arguments, function(){
var fn = this
if(!$.fn['hooked'+fn]){
$.fn['hooked'+fn] = $.fn[fn];
$.fn[fn] = function(){
var r = $.fn['hooked'+fn].apply(this, arguments);
$(this).trigger(fn, arguments);
return r
}
}
})
}
Это позволяет вам "перехватывать" функцию jQuery и запускать событие, когда вы его вызываете.
Здесь, как вы его используете, вы сначала связываете функцию, которую вы хотите вызвать. В вашем случае это будет .html()
:
$.hook('html');
Затем вы добавляете прослушиватель событий с .on
. В нем нет динамически добавленного элемента, вы можете использовать прямую привязку, иначе делегированные работы evets:
$(document).on('html', '#threat, #cool, #not_cool',function(){
alert('B');
})
Функция запускается каждый раз #threat, #cool or #not_cool
вызывают .html
.
Плагин $.hook
не полностью текстовый, некоторые ошибки могут быть здесь, но для вашего HTML, он работает.
Пример: http://jsfiddle.net/5svVQ/
Вы можете заменить функцию html своей собственной функцией, а затем вызвать функцию html:
$.fn.html = (function(oldHtml) {
var _oldHtml = oldHtml;
return function(param) {
// your code
alert(param);
return _oldHtml.apply(this, [param]);
};
})($.fn.html);
Когда вызывается html()
, обычно происходит изменение объекта DOM, поэтому вы можете искать обработчик события DOM change, он вызывается всякий раз, когда изменяется ваш HTML-код главной страницы. я нашел
Есть ли прослушиватель изменений JavaScript/jQuery DOM?
если это поможет вашему делу.
ajaxComplete
дляajaxComplete
ответа AJAX, но я не знаю,ajaxComplete
ли он до или после определенных обработчиков ответа AJAX.html()
в свою собственную функцию, которая также вызывает эти методы.