如何使用 javascript/jquery 编写 onshow 事件?

Posted

技术标签:

【中文标题】如何使用 javascript/jquery 编写 onshow 事件?【英文标题】:How to write onshow event using javascript/jquery? 【发布时间】:2010-11-28 18:16:14 【问题描述】:

我的页面上有一个锚标记,我想要一个附加到它的事件,该事件将在此元素的显示发生变化时触发。

我该如何编写这个活动?并在此元素的显示发生变化时捕获?

【问题讨论】:

【参考方案1】:

这是我在 onShow 上做的方式,作为一个 jQuery 插件。但是,它可能会也可能不会完全执行您正在执行的操作。

(function($)
  $.fn.extend( 
    onShow: function(callback, unbind)
      return this.each(function()
        var _this = this;
        var bindopt = (unbind==undefined)?true:unbind; 
        if($.isFunction(callback))
          if($(_this).is(':hidden'))
            var checkVis = function()
              if($(_this).is(':visible'))
                callback.call(_this);
                if(bindopt)
                  $('body').unbind('click keyup keydown', checkVis);
                
                                       
            
            $('body').bind('click keyup keydown', checkVis);
          
          else
            callback.call(_this);
          
        
      );
    
  );
)(jQuery);

您可以在 $(document).ready() 函数中调用它,并使用回调在元素显示时触发,就像这样。

$(document).ready(function()
  $('#myelement').onShow(function()
    alert('this element is now shown');
  );
);

它通过将 click、keyup 和 keydown 事件绑定到 body 来检查元素是否显示,因为这些事件最有可能导致元素显示并且用户非常频繁地执行这些事件。这可能不是非常优雅,但可以完成工作。此外,一旦显示元素,这些事件就会与主体解除绑定,以免继续触发并降低性能。

【讨论】:

我不得不将 :visible 替换为 if($(obj).is(':visible')) 中的 :hidden,但除此之外效果很好。 将 callback.call() 改为 callback.call(obj);其中注入了元素。如果我错了,请告诉我。【参考方案2】:

您不能直接在 javascript 中获得 onshow 事件。请记住,以下方法是非标准

在 IE 中你可以使用

onpropertychange event

在元素的属性之后触发 变化

对于 Mozilla

你可以使用

watch

监视要分配的属性 一个值并在那个时候运行一个函数 发生。

【讨论】:

这个的标准是什么?【参考方案3】:

你也可以覆盖 jQuery 的默认显示方法:

var orgShow = $.fn.show;
$.fn.show = function()

    $(this).trigger( 'myOnShowEvent' );
    orgShow.apply( this, arguments );
    return this;

现在只需将您的代码绑定到事件:

$('#foo').bind( "myOnShowEvent", function()

    console.log( "SHOWN!" )
);

【讨论】:

如果您知道您将使用.show(),这是一个非常酷的解决方案。但是,它不适用于所有显示元素的情况,无论是通过设置display:blockfadeIn()slideDown() 等...虽然仍然是独一无二的。【参考方案4】:

此链接中的代码对我有用:http://viralpatel.net/blogs/jquery-trigger-custom-event-show-hide-element/

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

$('#foo').on('show', function() 
      console.log('#foo is now visible');
);

$('#foo').on('hide', function() 
      console.log('#foo is hidden');
);

但是,首先调用回调函数,然后显示/隐藏元素。所以如果你有一些与同一个选择器相关的操作,需要在显示或隐藏后进行,临时的解决方法是添加几毫秒的超时。

【讨论】:

以上是关于如何使用 javascript/jquery 编写 onshow 事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Javascript/jQuery 确定图像是不是已加载?

使用 Google Chrome 逐行调试 Javascript

Java(随笔)——利用HTML,CSS,JavaScript,JQuery编写的简易计算器

Javascript/Jquery 加载回调和编写基本函数

如何使用 jquery/javascript 将文本插入 json [重复]

如何使用 JavaScript/JQuery 创建一个简单的地图 [重复]