Как определить, когда функция .html () вызывается в jQuery?

0

Проблема проста. У меня массивное приложение 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.
}

Как мне это сделать? Спасибо.

  • 1
    Разве не было бы чище просто явно вызывать вашу функцию из ваших обработчиков успеха AJAX? Вы также можете попробовать использовать глобальное событие ajaxComplete для ajaxComplete ответа AJAX, но я не знаю, ajaxComplete ли он до или после определенных обработчиков ответа AJAX.
  • 1
    Оберните html() в свою собственную функцию, которая также вызывает эти методы.
Теги:

5 ответов

2

Для этого вы можете использовать специальные обработчики событий:

$('#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();
});

Легко поддерживаемый и меньше кода в соответствии с вашими требованиями.

  • 1
    Это, наверное, лучшая идея, она чистая и отделенная.
  • 0
    @palash, ему нужно сделать этот пользовательский вызов для каждой функции .html() ? Разве это не было бы довольно долго?
Показать ещё 3 комментария
1

Вы можете перезаписать метод 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);
};
0

У меня для вас небольшой скрипт. Вставьте это в свой 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/

0

Вы можете заменить функцию html своей собственной функцией, а затем вызвать функцию html:

$.fn.html = (function(oldHtml) {
        var _oldHtml = oldHtml;

        return function(param) {
            // your code
            alert(param);
            return _oldHtml.apply(this, [param]);
        };
    })($.fn.html);
0

Когда вызывается html(), обычно происходит изменение объекта DOM, поэтому вы можете искать обработчик события DOM change, он вызывается всякий раз, когда изменяется ваш HTML-код главной страницы. я нашел

Есть ли прослушиватель изменений JavaScript/jQuery DOM?

если это поможет вашему делу.

  • 0
    Изменения DOM для всех намерений и целей непригодны. Старый API устарел, а новый в IE не поддерживается.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню