2011-12-29 33 views
10

Tôi tò mò là có một người nghe sự kiện hoặc có lẽ là một cách để xây dựng một phương pháp sẽ kích hoạt khi thay đổi CSS xảy ra?Sự kiện kích hoạt bằng cách sử dụng Jquery khi thay đổi CSS?

Biểu định kiểu của tôi sử dụng truy vấn phương tiện và tôi muốn biết liệu có cách nào để đính kèm người nghe để xem khi nào các truy vấn phương tiện đó bắt đầu vào và ra. Ví dụ: Tôi có truy vấn phương tiện ẩn một nút ở độ rộng màn hình nhất định

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

Tôi sẽ sử dụng trình xử lý sự kiện nào để phát hiện khi màn hình đó thay đổi? Tôi hiện đang làm điều này:

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

Làm việc tốt, nhưng nó gọi người nghe mỗi lần người dùng thay đổi màn hình và tôi chỉ muốn kích hoạt khi nút của nút thay đổi. Tôi hy vọng điều đó đúng.

ví dụ này là những gì tôi muốn

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

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

Trả lời

4

Ràng buộc với window.resize là lựa chọn tốt nhất của bạn (Tôi tin). Không có bất kỳ sự kiện nào được kích hoạt khi bạn thay đổi CSS của phần tử. Tuy nhiên bạn có thể tối ưu hóa một chút bằng cách cache chọn sử dụng:

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

Hoặc bạn có thể sử dụng $(window).width() để kiểm tra độ rộng của khung nhìn:

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

CẬP NHẬT

Bạn luôn có thể tăng tốc trình xử lý sự kiện của riêng bạn:

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

Điều này sẽ ngăn mã trong trình xử lý sự kiện resize của bạn hoạt động nhiều hơn một lần mỗi giây.

+0

Tôi cũng nghĩ vậy ... Tôi đoán tôi không thích ý tưởng về chức năng thay đổi kích thước bị bắn quá nhiều lần. Tuy nhiên, nếu đó là cách tốt nhất/duy nhất để thực hiện điều này hơn cest la vi phải không? Tôi sẽ chấp nhận điều này như là câu trả lời nếu không có ai thay thế sớm. – Brodie

+0

@Brodie Kiểm tra cập nhật ** của tôi **, nếu bạn điều chỉnh trình xử lý sự kiện 'resize', bạn có thể giảm chi phí CPU khi người dùng thay đổi kích thước trình duyệt của họ. – Jasper

+0

@Ajinkya Bạn đã xóa bài đăng của mình nhưng tôi nghĩ đây là một liên kết hữu ích (nó có thể không được hỗ trợ tốt trong các trình duyệt nhưng nó vẫn là thông tin tốt): http://stackoverflow.com/questions/1397251/event-detect-when-css -property-changed-using-jquery – Jasper

0

Nếu nó chỉ là một sự kiện một lần bạn có thể thử để unbind sự kiện này.

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

+0

như thế nào điều này áp dụng cho câu hỏi? – Jasper

+0

Từ "Điều này hoạt động tốt, nhưng nó gọi người nghe mỗi khi người dùng thay đổi màn hình và tôi muốn chỉ có nó cháy khi css của nút thay đổi". Có vẻ như vấn đề của bạn là sự kiện đã được tái diễn. Có lẽ tôi đã bỏ lỡ hiểu, nhưng nếu bạn không muốn sự kiện tiếp tục bắn nó, bạn có thể thử unbinding sự kiện và rebinding nó. –

0

Tôi biết điều này là cũ nhưng tôi quản lý để giải quyết nó với logic này

// 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 
      // ... 
     } 
    }); 
Các vấn đề liên quan