在CSS更改时使用Jquery触发事件?

时间:2011-12-29 17:18:53

标签: javascript jquery css

我很好奇是否有一个事件监听器或者一种方法来构造一个在CSS发生变化时会触发的方法?

我的样式表使用媒体查询,我想知道是否有一种方法可以附加一个监听器,以查看这些媒体查询何时进出。例如,我有一个媒体查询,隐藏某个屏幕宽度的按钮

@media screen and (max-width: 480px) {
  #search-button {
    display: none;
  }
}

我会使用什么事件监听器来检测该显示何时发生变化?我现在正在这样做:

$(window).resize(function() {
  if($('#search-button').css("display") == "none") {
    //do something
  } else {
    //do something else
  }
});

哪个工作正常,但每次用户更改屏幕时都会调用监听器,而我只是在按钮的css发生变化时才启动它。我希望这是有道理的。

例如,这就是我想要的

$('#search-button').cssEventListenerOfSomeKind(function() {
  alert('the display changed');
});

3 个答案:

答案 0 :(得分:4)

绑定到window.resize是您最好的选择(我相信)。更改元素的CSS时没有触发任何事件。但是,您可以通过缓存使用的选择器来优化一点:

var $searcButton = $('#search-button');
$(window).resize(function() {
    if($searcButton.css("display") == "none") {
        //do something
    } else {
        //do something else
    }
});

或者您可以使用$(window).width()检查视口的宽度:

var $window = $(window);
$window.resize(function() {
    if($window.width() <= 480) {
        //do something
    } else {
        //do something else
    }
});

<强>更新

您始终可以限制自己的事件处理程序:

var $window   = $(window),
    resize_ok = true,
    timer;

timer = setInterval(function () {
    resize_ok = true;
}, 250);

$window.resize(function() {
    if (resize_ok === true) {
        resize_ok = false;
        if($window.width() <= 480) {
            //do something
        } else {
            //do something else
        }
    }
});

这会阻止resize事件处理程序中的代码每四分钟运行一次以上。

答案 1 :(得分:0)

如果只是一次性事件,您可以尝试取消绑定事件。

http://api.jquery.com/unbind/

答案 2 :(得分:0)

我知道这已经过时但我设法用这个逻辑来解决它

    // set width and height of element that is controlled by the media query
    var page_width = $page.width();
    var page_height = $page.height();


    $window = $(window).resize(function(){
        if( $page.width() != page_width ) {
            // update page_width and height so it only executes your 
            // function when a change occurs
            page_width = $page.width();
            page_height = $page.height();
            // do something
            // ...
        }
    });