Попытка вызвать события до и после jQuery show () - PullRequest
9 голосов
/ 23 февраля 2012

Я пытаюсь запустить часть нашего JavaScript после того, как какой-то сторонний код вызывает модальное диалоговое окно. Я видел довольно изящную идею угона функции jQuery show , но, к сожалению, она не работает. Я предполагаю, что эта идея работала над старой версией jQuery еще в 2009 году, но не сейчас над последней версией. Вот jsFiddle с реализацией и примером:

http://jsfiddle.net/mkmurray/drv5w/2/

Как вы можете увидеть, запустив пример, он будет предупреждать о событии beforeShow, но не о событии afterShow, и с некоторой отладкой я вижу, что он не вызывает функцию newCallback полностью.

Заранее благодарим вас за любую помощь, которую вы можете оказать.

Ответы [ 3 ]

9 голосов
/ 24 февраля 2012

Похоже, я смог найти решение.С оригиналом было связано несколько ошибок:

  1. Поскольку первоначальное написание кода, которое я видел, jQuery добавил еще один необязательный параметр с именем easing.Это действительно испортило то, как я делегировал исходный метод show в jQuery, вызывая _oldShow.apply(...).
  2. После того, как я это исправил, я обнаружил, что иногда метод show вызывает ряд других методов, которыеиногда рекурсивно звоните show снова.Мне нужен был способ, чтобы моя реализация не перехватила эти рекурсивные вызовы;Я обнаружил, что могу положиться, если есть свойство selector или нет.

Работающую реализацию можно найти здесь по этому jsFiddle:

http://jsfiddle.net/mkmurray/drv5w/27/

Эта реализация во многом зависит от того, jQuery не меняет сигнатуру метода show.Таким образом, вы должны решить, хотите ли вы модифицировать сторонние плагины jQuery, а не делать это.В любом случае, если вы хотите получить последнюю версию стороннего плагина или последнюю версию jQuery, некоторые новые изменения могут нарушить вашу реализацию.Так что это решение не обязательно лучше или хуже, чем модификация сторонних плагинов.

3 голосов
/ 06 июня 2015

Я нашел другое решение по этому поводу здесь , с небольшим собственным изменением.

(function($){
    $.each(['show','hide'],function(i,ev){
        var el = $.fn[ev];              
        $.fn[ev] = function(){
            this.trigger(ev);
            return el.apply(this,arguments);
        };
    });                  
})(jQuery);

Оно не предлагает события до / после других примеров, но ономожно было бы уточнить на.Пока он работает для меня, и надеюсь, что так и будет продолжаться - это приятный маленький подход, который можно легко расширить на другие функции jQuery, включая различные альтернативы, чтобы показать.

** Обратите внимание, что это также вызываетсобытие для «спрятаться».

0 голосов
/ 23 февраля 2012

Я ничего не тестировал, но делюсь несколькими вещами, которые знаю

  1. show имеет необязательный второй параметр - замедление. jQuery автоматически обнаруживает это, но для идеального решения вы должны учитывать это.

    _oldShow.apply(obj, [speed, null, newCallback]); 
    
  2. Обратный вызов имеет смысл только при наличии задержки, что означает значение для speed. Я надеюсь, что ваше afterShow событие будет запущено, если будет задержка. Если нет задержки, вы можете запустить ее после вызова _oldShow, например,

    _oldShow.apply(obj, [speed, null, newCallback]); 
    if(!speed){
      obj.trigger('afterShow');
    }
    

EDIT:

Я устал от нескольких вещей и узнал, что я бы предложил вам создать новую функцию показа вместо переопределения.

jQuery.fn.extend({

    show2:function( speed, easing, callback ) {
        this.trigger('beforeShow');
        this.show(speed, easing, function(){
            $(this).trigger('afterShow');
            if ($.isFunction(callback)) {
                callback.apply(this);
            }
        });
        if(!speed){
            this.trigger('afterShow');            
        }          
    }


});

демо: http://jsfiddle.net/9F8ea/2/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...