2013-05-23 18 views
7

Có cách nào để nhận thông báo khi đối tượng CSSStyleDeclaration bị thay đổi giống như thay đổi DOM có thể được theo dõi bằng các sự kiện như DomAttrModified không?Phát hiện các thay đổi của đối tượng CSSStyleDeclaration trong JS

Vì vậy, nếu có ví dụ được một số mã JS như

document.styleSheets[0].rules[0].style.backgroundImage = "url(myimage.png)"; 

là có cách nào để nhận được thông báo về sự thay đổi trong một handler JS mà không thay đổi các đoạn mã trên ở tất cả?

Cảm ơn trước!

+0

Tôi nghĩ rằng, bạn có thể giữ cssText trong một biến và so sánh nó sau này. –

+1

@Mr_Green không giải quyết được sự cố, OP đang hỏi liệu có sự kiện nào mà anh ấy có thể móc trên đó sẽ kích hoạt khi CSS thay đổi không. Giống như sự kiện Đột biến DOM. Câu hỏi thú vị OP. –

+0

@Mr_Green bỏ phiếu chuỗi lớn không chính xác hiệu quả –

Trả lời

1

Tôi không nghĩ có bất kỳ điều gì khả dụng cho điều này.

Tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể dễ dàng xây dựng trình bao bọc, để mã của bạn sử dụng trình bao bọc và thông báo cho người nghe biết có gì đó đã thay đổi.

Something khá cơ bản như thế này:

function Wrapper() { 
    var listeners = [] 

    return { 
     addListener: function(fn) { 
      listeners.push(fn) 
     }, 
     removeListener: function(fn) { 
      listeners.splice(listeners.indexOf(fn), 1) // indexOf needs shim in IE<9 
     }, 
     set: function(prop, val) { 
      prop = val 
      // forEach needs shim in IE<9, or you could use a plain "for" loop 
      listeners.forEach(call) 

      function call(fn) { 
       fn(prop, val) 
      }) 
     } 
    } 
} 

Mà bạn có thể sử dụng như thế này:

var wrapper = Wrapper() 
wrapper.addListener(function(prop, val) { 
    // When you'll change a prop, it'll get there and you'll see 
    // which property is changed to which value 
}) 

// This sets the property and notifies all the listeners 
wrapper.set(document.styleSheets[0].rules[0].style.backgroundImage, "url(myimage.png)") 
+0

+1 Đây có lẽ là cách duy nhất hoạt động trên tất cả các trình duyệt, ngay cả trong bất kỳ trình duyệt bỏ qua các nightlies. –

Các vấn đề liên quan