自定义jQuery方法独立于元素的每个实例

时间:2013-06-12 14:15:47

标签: javascript jquery

我创建了一种方法,可以在鼠标悬停时在图像的一侧显示黑条。当它只有一个图像时,一切都很好,但是当应用于多个图像时,如果鼠标悬停,则两个图像上都会出现黑条。

是否可以让每个图像彼此独立地操作,以便鼠标悬停事件仅激活该特定图像的黑条?


jsFiddle - http://jsfiddle.net/7kw8z/11/


我通过$("img.edit").panzoom();

调用该方法

这是方法:

!function($){


$.fn.panzoom = function() {
    var $this = $(this);
    this.imagesLoaded(function(){

        $this.wrap('<div class="img_wrapper" />');

        var imgEl = $this.parent(".img_wrapper");

        imgEl.width($this.width());
        imgEl.height($this.height());
        //imgEl.offset({top:$this.offset().top,left:$this.offset().left});

        imgEl.append('<div class="img_menu" />');
        menuEl = imgEl.children(".img_menu");


        imgEl.hover(function() {
            $(menuEl).css("visibility", "visible");
        },  function() {
            $(menuEl).css("visibility", "hidden");
        });

    });
}

}(window.jQuery);

4 个答案:

答案 0 :(得分:5)

你可以做到

$.fn.panzoom = function() {
return this.each(function(){
    var $this = $(this);
    $this.imagesLoaded(function(){
        $this.wrap('<div class="img_wrapper" />');

        var imgEl = $this.parent(".img_wrapper");

        imgEl.width($this.width());
        imgEl.height($this.height());

        imgEl.append('<div class="img_menu" />');
        var menuEl = imgEl.children(".img_menu");

        imgEl.hover(function() {
            menuEl.css("visibility", "visible");
        },  function() {
            menuEl.css("visibility", "hidden");
        });
    });
});
}     

http://jsfiddle.net/7kw8z/21/

答案 1 :(得分:3)

mouseenter / leave的范围是当前元素,因此您可以使用$(this)。你可以使用find来获取你想要显示/隐藏的元素。

    imgEl.hover(function() {
        $(this).find(".img_menu").css("visibility", "visible");
    },  function() {
        $(this).find(".img_menu").css("visibility", "hidden");
    });

答案 2 :(得分:1)

不确定为什么你在js中都这样做,你能用CSS吗?只需删除

    imgEl.hover(function() {
        $(menuEl).css("visibility", "visible");
    },  function() {
        $(menuEl).css("visibility", "hidden");
    });

你可以添加

.img_wrapper:hover .img_menu {
    visibility: visible;
}

http://jsfiddle.net/7kw8z/14/

如果你真的需要javascript,你需要意识到你的menuEl不是一个元素,而是一组元素* s *,由imgEl.children表示。

答案 3 :(得分:0)

人们打败了我,但是我的回答是,在这里创建一个插件是理想的方式!

$.fn.panelize = function (initState) {

  // set a default show state
  var show = initState || false;

  var animation = {
    duration: 300,
    easing:   'linear',
  };

  return this.each(function() {
    _this = $(this);

    var element = {
      show:    $('.show', _this),
      close:   $('.close', _this),
      content: $('.panel-content', _this),
    };

    var hidePanel = function () {
      _this.animate({
        bottom: -(element.content.height()),
      }, 
      animation.duration, 
      animation.easing, 
      function () {    
        element.show.show();
        element.close.hide();
      })
    };

    var showPanel = function () {
      _this.animate({
        bottom: 0,
      }, 
      animation.duration,
      animation.easing,
      function () {
        element.close.show();
        element.show.hide();
      })
    }

    // search for the show button within this context
    element.show.on('click', function () {
      showPanel();
    }) 

    // search for the close button within this context.
    element.close.on('click', function () {
      hidePanel();
    }); 

    // hide panel initally, if configured
    if (!show) hidePanel();

  });
}

// reduced to a single class
$('.infoToggle').panelize();

Html现在看起来像这样。

   <div class="infoToggle">
        <div class="panel-controller">
            <div class="tab-controller">
                <span class="close">CLOSE</span>
                <span class="show">MORE INFO</span>
            </div>
        </div>
        <div class="panel-content">
            Content goes here
        </div>
    </div>

    <div class="infoToggle">
        <div class="panel-controller">
            <div class="tab-controller">
                <span class="close">CLOSE</span>
                <span class="show">MORE INFO</span>
            </div>
        </div>
        <div class="panel-content">
            Content goes here
        </div>
    </div>