Sự kiện phát hiện khi thuộc tính css thay đổi bằng cách sử dụng Jquery


91

Có cách nào để phát hiện xem thuộc tính css "display" của một phần tử có bị thay đổi hay không (thành không hoặc khối hoặc khối nội tuyến ...)? nếu không, bất kỳ plugin nào? Cảm ơn

Câu trả lời:


93

Ghi chú

Sự kiện đột biến đã không được chấp nhận kể từ khi bài đăng này được viết và có thể không được hỗ trợ bởi tất cả các trình duyệt. Thay vào đó, hãy sử dụng máy quan sát đột biến .

Có bạn có thể. Mô-đun Sự kiện DOM L2 xác định các sự kiện đột biến ; một trong số đó - DOMAttrModified là cái bạn cần. Tuy nhiên, những điều này không được triển khai rộng rãi, nhưng được hỗ trợ trong ít nhất các trình duyệt Gecko và Opera.

Hãy thử điều gì đó dọc theo những dòng sau:

document.documentElement.addEventListener('DOMAttrModified', function(e){
  if (e.attrName === 'style') {
    console.log('prevValue: ' + e.prevValue, 'newValue: ' + e.newValue);
  }
}, false);

document.documentElement.style.display = 'block';

Bạn cũng có thể thử sử dụng sự kiện "propertychange" của IE để thay thế DOMAttrModified. Nó sẽ cho phép phát hiện các stylethay đổi một cách đáng tin cậy.


Cảm ơn. Nó sẽ hỗ trợ Firefox?
HP.

7
@Boldewyn: Đúng, nhưng việc thay đổi classthuộc tính (hoặc bất kỳ thuộc tính nào khác nếu các bộ chọn thuộc tính có trong CSS) của tổ tiên của phần tử cũng có thể thay đổi phần tử, vì vậy bạn phải xử lý tất cả các DOMAttrModifiedsự kiện trên phần tử gốc tài liệu để hãy nắm bắt mọi thứ.
Tim Down

12
Sự kiện đó không được chấp nhận trong w3c. Nó phải là một cách khác.
ccsakuweb

8
Các sự kiện đột biến đã được đánh dấu là không được dùng nữa trong đặc tả Sự kiện DOM, vì thiết kế của API có sai sót. Người quan sát đột biến là người thay thế được đề xuất. Đây là liên kết [ developer.mozilla.org/en-US/docs/DOM/Mutation_events]
Anmol Saraf

1
Anmol - liên kết MDN cho sự kiện Mutation phải là: developer.mozilla.org/en-US/docs/Web/Guide/Events/…
Grocoder

19

Bạn có thể sử dụng plugin jQuery attrchange . Chức năng chính của plugin là liên kết một hàm lắng nghe về sự thay đổi thuộc tính của các phần tử HTML.

Mẫu mã:

$("#myDiv").attrchange({
    trackValues: true, // set to true so that the event object is updated with old & new values
    callback: function(evnt) {
        if(evnt.attributeName == "display") { // which attribute you want to watch for changes
            if(evnt.newValue.search(/inline/i) == -1) {

                // your code to execute goes here...
            }
        }
    }
});

Lưu ý rằng đối với một số plugin sửa đổi CSS evnt.attributeName là "style" chứ không phải "display".
jerrygarciuh

Hoạt động tốt nhưng cách này nhanh hơn so với việc sử dụng tìm kiếm regex và bạn không cần đến if (evnt.attributeName ...): if (evnt.newValue.indexOf ('display: inline-block')> -1) {. ..; return;}
Dan Randolph

4

Bạn có thể sử dụng csshàm của jQuery để kiểm tra các thuộc tính CSS, ví dụ: if ($('node').css('display') == 'block').

Colin nói đúng, rằng không có sự kiện rõ ràng nào được kích hoạt khi một thuộc tính CSS cụ thể bị thay đổi. Nhưng bạn có thể lật nó xung quanh và kích hoạt một sự kiện thiết lập màn hình và bất cứ điều gì khác.

Ngoài ra, hãy cân nhắc sử dụng thêm các lớp CSS để có được hành vi bạn muốn. Thông thường, bạn có thể thêm một lớp vào một phần tử chứa và sử dụng CSS để ảnh hưởng đến tất cả các phần tử. Tôi thường vỗ một lớp vào phần tử body để cho biết rằng phản hồi AJAX đang chờ xử lý. Sau đó, tôi có thể sử dụng bộ chọn CSS để có được màn hình mà tôi muốn.

Không chắc đây có phải là thứ bạn đang tìm kiếm hay không.


3

Đối với các thuộc tính mà quá trình chuyển đổi css sẽ ảnh hưởng, có thể sử dụng sự kiện chuyển tiếp, ví dụ cho z-index:

$(".observed-element").on("webkitTransitionEnd transitionend", function(e) {
  console.log("end", e);
  alert("z-index changed");
});

$(".changeButton").on("click", function() {
  console.log("click");
  document.querySelector(".observed-element").style.zIndex = (Math.random() * 1000) | 0;
});
.observed-element {
  transition: z-index 1ms;
  -webkit-transition: z-index 1ms;
}
div {
  width: 100px;
  height: 100px;
  border: 1px solid;
  position: absolute;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="changeButton">change z-index</button>
<div class="observed-element"></div>


-17

Bạn không thể. CSS không hỗ trợ "sự kiện". Tôi có dám hỏi bạn cần nó để làm gì không? Kiểm tra bài đăng này ở đây trên SO. Tôi không thể nghĩ ra lý do tại sao bạn lại muốn kết nối một sự kiện để thay đổi phong cách. Tôi giả sử ở đây rằng sự thay đổi kiểu được kích hoạt ở nơi khác bởi một đoạn javascript. Tại sao không thêm logic bổ sung vào đó?


1
Tôi có một số sự kiện có thể kích hoạt một hộp xuất hiện hoặc không. Và tôi có một yếu tố khác phụ thuộc vào sự xuất hiện của chiếc hộp đó để thực hiện mọi thứ. Bây giờ, tôi không muốn lặp lại mã và kết nối với tất cả các sự kiện khác làm xuất hiện hộp mặc dù đó là một cách để làm điều đó. Chỉ là thừa!
HP.

Nó là thừa, có thể sử dụng một hệ thống dựa trên quy tắc sẽ hoạt động? tức là, một số cấu trúc giống như JSON xác định điều gì sẽ xảy ra với một số điều khiển khi một điều khiển khác thay đổi? theo cách này, bạn sẽ chỉ cần tạo 1 hàm tht sử dụng đối tượng quy tắc và có lẽ điều khiển hiện tại (id) làm tham số?
Colin

3
Tại sao điều này bị phản đối? Xác định lớp cho cha của cả hai phần tử và thay đổi kiểu trên nó là giải pháp phù hợp duy nhất cho việc này.
Ilia G

11
Bị phản đối vì "Tôi không nghĩ ra lý do tại sao bạn lại muốn kết nối một sự kiện để thay đổi phong cách" - nếu bạn không thể nghĩ ra lý do thì không có nghĩa là không có lý do khả thi và vì "Tại sao không thêm logic ở đó? " - bởi vì bạn không thể luôn luôn sửa đổi các tập lệnh.
Andrei Cojea

Để cung cấp một ví dụ, tôi muốn thay đổi thuộc tính tô của đường dẫn svg khi thuộc tính màu của phần tử mẹ thay đổi.
Andrei Cojea
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.