2011-12-29 17 views
10

Tengo curiosidad por saber si hay un oyente de eventos o quizás una forma de construir un método que se active cuando ocurra un cambio de CSS.Evento desencadenante usando Jquery en cambio CSS?

Mi hoja de estilo utiliza consultas de medios y deseo saber si hay una forma de adjuntar un oyente para ver cuándo entran y salen esas consultas de medios. Por ejemplo, tengo una consulta de medios que esconde un botón en determinados anchos de pantalla

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

Lo detector de eventos debería utilizar para detectar cuando esa pantalla cambia? Actualmente estoy haciendo esto:

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

que funciona muy bien, pero requiere que el oyente cada vez que el usuario cambia la pantalla y yo prefiero tenerlo disparar sólo cuando el css del botón cambia. Espero que tenga sentido.

por ejemplo, esto es lo que me gustaría

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

stackoverflow.com/questions/1397251/event-detect-when-css-property-changed-using-jquery – xyz

Respuesta

4

La unión al window.resize es su mejor opción (creo). No hay ningún evento disparado cuando cambia el CSS de un elemento. Sin embargo, puede optimizar un poco a almacenamiento en caché el selector utilizado:

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

O puede utilizar $(window).width() para comprobar el ancho de la ventana gráfica:

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

ACTUALIZACIÓN

Siempre se puede estrangular su propio manejador de eventos:

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 
     } 
    } 
}); 

Esto evitará que el código en su controlador de eventos resize se ejecute más de una vez cada cuarto de segundo.

+0

Creo que sí ... Supongo que no me gusta la idea de que la función de cambio de tamaño se dispare tantas veces. Sin embargo, si es la mejor/única manera de lograr esto que cest la vi ¿verdad? Aceptaré esto como la respuesta si nadie tiene una alternativa pronto. – Brodie

+0

@Brodie Revisa mi ** actualización **, si aceleras el manejador de eventos 'resize' puedes reducir la sobrecarga de la CPU cuando el usuario cambia el tamaño de su navegador. – Jasper

+0

@Ajinkya Borraste tu publicación, pero pensé que era un enlace útil (puede que no sea bien soportado en los navegadores, pero sigue siendo una buena información): http://stackoverflow.com/questions/1397251/event-detect-when-css -property-changed-using-jquery – Jasper

0

Si es sólo un evento de una sola vez que se podría tratar de desvincular el evento.

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

+0

¿Cómo funciona esto se aplica a la pregunta? – Jasper

+0

A partir de esto "Lo que funciona bien, pero llama al oyente cada vez que el usuario cambia la pantalla y prefiero que se active solo cuando cambia el CSS del botón". Parecía que tu problema era que el evento era recurrente. Tal vez lo extraño, pero si no quieres que el evento siga disparándolo, podrías intentar desvincular el evento y volver a vincularlo. –

0

Sé que esto es viejo, pero me las arreglé para solucionarlo con esta lógica

// 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 
      // ... 
     } 
    }); 
Cuestiones relacionadas