jQuery event to trigger action when a div is made visible

后端 未结 22 2212
你的背包
你的背包 2020-11-22 12:03

I\'m using jQuery in my site and I would like to trigger certain actions when a certain div is made visible.

Is it possible to attach some sort of \"isvisible\" even

相关标签:
22条回答
  • 2020-11-22 12:30

    my solution:

    ; (function ($) {
    $.each([ "toggle", "show", "hide" ], function( i, name ) {
        var cssFn = $.fn[ name ];
        $.fn[ name ] = function( speed, easing, callback ) {
            if(speed == null || typeof speed === "boolean"){
                var ret=cssFn.apply( this, arguments )
                $.fn.triggerVisibleEvent.apply(this,arguments)
                return ret
            }else{
                var that=this
                var new_callback=function(){
                    callback.call(this)
                    $.fn.triggerVisibleEvent.apply(that,arguments)
                }
                var ret=this.animate( genFx( name, true ), speed, easing, new_callback )
                return ret
            }
        };
    });
    
    $.fn.triggerVisibleEvent=function(){
        this.each(function(){
            if($(this).is(':visible')){
                $(this).trigger('visible')
                $(this).find('[data-trigger-visible-event]').triggerVisibleEvent()
            }
        })
    }
    })(jQuery);
    

    example usage:

    if(!$info_center.is(':visible')){
        $info_center.attr('data-trigger-visible-event','true').one('visible',processMoreLessButton)
    }else{
        processMoreLessButton()
    }
    
    function processMoreLessButton(){
    //some logic
    }
    
    0 讨论(0)
  • 2020-11-22 12:31

    You could always add to the original .show() method so you don't have to trigger events every time you show something or if you need it to work with legacy code:

    Jquery extension:

    jQuery(function($) {
    
      var _oldShow = $.fn.show;
    
      $.fn.show = function(speed, oldCallback) {
        return $(this).each(function() {
          var obj         = $(this),
              newCallback = function() {
                if ($.isFunction(oldCallback)) {
                  oldCallback.apply(obj);
                }
                obj.trigger('afterShow');
              };
    
          // you can trigger a before show if you want
          obj.trigger('beforeShow');
    
          // now use the old function to show the element passing the new callback
          _oldShow.apply(obj, [speed, newCallback]);
        });
      }
    });
    

    Usage example:

    jQuery(function($) {
      $('#test')
        .bind('beforeShow', function() {
          alert('beforeShow');
        }) 
        .bind('afterShow', function() {
          alert('afterShow');
        })
        .show(1000, function() {
          alert('in show callback');
        })
        .show();
    });
    

    This effectively lets you do something beforeShow and afterShow while still executing the normal behavior of the original .show() method.

    You could also create another method so you don't have to override the original .show() method.

    0 讨论(0)
  • 2020-11-22 12:35

    Hope this will do the job in simplest manner:

    $("#myID").on('show').trigger('displayShow');
    
    $('#myID').off('displayShow').on('displayShow', function(e) {
        console.log('This event will be triggered when myID will be visible');
    });
    
    0 讨论(0)
  • 2020-11-22 12:36

    This support easing and trigger event after animation done! [tested on jQuery 2.2.4]

    (function ($) {
        $.each(['show', 'hide', 'fadeOut', 'fadeIn'], function (i, ev) {
            var el = $.fn[ev];
            $.fn[ev] = function () {
                var result = el.apply(this, arguments);
                var _self=this;
                result.promise().done(function () {
                    _self.triggerHandler(ev, [result]);
                    //console.log(_self);
                });
                return result;
            };
        });
    })(jQuery);
    

    Inspired By http://viralpatel.net/blogs/jquery-trigger-custom-event-show-hide-element/

    0 讨论(0)
  • 2020-11-22 12:36

    I changed the hide/show event trigger from Catalint based on Glenns idea. My problem was that I have a modular application. I change between modules showing and hiding divs parents. Then when I hide a module and show another one, with his method I have a visible delay when I change between modules. I only need sometimes to liten this event, and in some special childs. So I decided to notify only the childs with the class "displayObserver"

    $.each(["show", "hide", "toggleClass", "addClass", "removeClass"], function () {
        var _oldFn = $.fn[this];
        $.fn[this] = function () {
            var hidden = this.find(".displayObserver:hidden").add(this.filter(":hidden"));
            var visible = this.find(".displayObserver:visible").add(this.filter(":visible"));
            var result = _oldFn.apply(this, arguments);
            hidden.filter(":visible").each(function () {
                $(this).triggerHandler("show");
            }); 
            visible.filter(":hidden").each(function () {
                $(this).triggerHandler("hide");
            });
            return result;
        }
    });
    

    Then when a child wants to listen for "show" or "hide" event I have to add him the class "displayObserver", and when It does not want to continue listen it, I remove him the class

    bindDisplayEvent: function () {
       $("#child1").addClass("displayObserver");
       $("#child1").off("show", this.onParentShow);
       $("#child1").on("show", this.onParentShow);
    },
    
    bindDisplayEvent: function () {
       $("#child1").removeClass("displayObserver");
       $("#child1").off("show", this.onParentShow);
    },
    

    I wish help

    0 讨论(0)
  • 2020-11-22 12:37

    You can use jQuery's Live Query plugin. And write code as follows:

    $('#contentDiv:visible').livequery(function() {
        alert("do something");
    });
    

    Then everytime the contentDiv is visible, "do something" will be alerted!

    0 讨论(0)
提交回复
热议问题