2009-09-09 15 views
82

ile değiştiğini algılar Bir öğenin "display" css özelliğinin değiştirilip değiştirilmediğini algılamanın bir yolu var mı (yok mu yoksa engellen mi yoksa satır içi satır ...)? değilse, herhangi bir eklenti? TeşekkürlerOlay, css özelliğinin Jquery

cevap

86

Evet yapabilirsiniz. DOM L2 Events modülü mutation events; bunlardan biri - DOMAttrModified ihtiyacınız olanı. Verilen, bunlar yaygın olarak uygulanmamaktadır, ancak en azından Gecko ve Opera tarayıcılarında desteklenmektedir. Bu doğrultuda

deneyin şey:

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

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

Ayrıca DOMAttrModified bir yedek olarak IE's "propertychange" event kullanan deneyebilirsiniz. style değişikliklerini güvenilir bir şekilde algılamaya izin vermelidir.

+0

Teşekkürler. Firefox'u destekliyor? –

+0

Evet, IIRC, FF2 ve geçerli olana kadar – kangax

+0

Bir eleman için etkili CSS görüntüleme özelliği dolaylı olarak değiştirilirse, örneğin elemanın CSS sınıfını değiştirerek bu işe yaramaz. –

-16

Yapamazsınız. CSS "olayları" desteklemez. Cesaretin ne için ihtiyacın olduğunu soruyorum? Buradaki post numarasına bakın. Bir olayı stil değişikliğine bağlamak için neden bir sebep düşünemiyorum. Burada, stil değişikliğinin başka bir yerde bir javascript tarafından tetiklendiğini farz ediyorum. Neden orada ekstra mantık eklemiyorsunuz?

+1

birkaç etkinliklere sahip Bu bir kutuyu görünmesini veya tetiklemesini tetikleyebilir. Ve bir şeyleri yapmak için o kutunun görünüşüne bağlı olan başka bir elementim var. Şimdi, kodu tekrarlamak ve kutuya görünüm yapan diğer tüm etkinliklere bağlanmak istemiyorum, ancak bunu yapmanın bir yolu. Sadece fazlalık! –

+0

Bu gereksiz, belki bir kural tabanlı sistem kullanarak çalışır? Yani, başka bir kontrol değiştiğinde bazı kontrollere ne olması gerektiğini tanımlayan bazı JSON benzeri yapı? Bu şekilde, kural nesnesini ve belki de geçerli denetimi (id) parametre olarak kullanan 1 işlevi oluşturmanız gerekir. – Colin

+3

Bu neden azalıyor? Her iki elemanın ebeveynleri için sınıfın tanımlanması ve bunun üzerindeki stilin değiştirilmesi, bunun için tek doğru çözümdür. –

4

CSS özelliklerini test etmek için jQuery'nin css işlevini kullanabilirsiniz. if ($('node').css('display') == 'block').

Colin, belirli bir CSS özelliği değiştiğinde tetiklenen açık bir olay olmadığını doğru. Ancak onu çevirebilir ve ekranı belirleyen bir olayı tetikleyebilir ve başka bir şey yapabilirsiniz.

Ayrıca, istediğiniz davranışı almak için CSS sınıflarını eklemeyi kullanmayı da düşünün. Çoğunlukla, içeren bir öğeye bir sınıf ekleyebilir ve tüm öğeleri etkilemek için CSS kullanabilirsiniz. Bir AJAX yanıtının beklemediğini belirtmek için sıklıkla bir vücut elemanına bir sınıf attım. Sonra istediğim ekranı almak için CSS seçicilerini kullanabilirim.

Aradığınız şeyin bu olduğundan emin değil misiniz?

+0

Bunu nasıl yaparsınız? – crosenblum

16

attrchange jQuery plugin'u kullanabilirsiniz. Eklentinin ana işlevi, HTML öğelerinin özellik değişikliği konusunda bir dinleyici işlevini bağlamaktır.

kod örneği:

CSS geçiş z endeksi için transitionend etkinliği, örnek kullanabilir, etkileyecek olan özellikleri için
$("#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... 
      } 
     } 
    } 
}); 
+0

bazı eklentileri için unutmayın o CSS'yi değiştir evnt.attributeName 'style' değil 'display'. – jerrygarciuh

+0

iyi çalışır ancak bu düzenli ifade arama kullanarak daha hızlıdır ve eğer (evnt.attributeName ...) İlk gerekmez: if (evnt.newValue.indexOf ('display: inline-block')> -1) { ...; dönüş;} –

2

:

$(".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>