Arka fon
Otomatik testler yazmaya çalışırken, belirli bir sayfadaki tüm öğelerin aldığı belirli bir dizi öğenin, üzerine gelme etkinlikleri için css tarafından ayarlanan bazı css özelliklerine sahip olduğunu doğrulamak için bu soruya rastladım.
Yukarıdaki yanıt mükemmel bir şekilde açıklasa da, neden sadece JS ile fareyle üzerine gelme olayını tetiklemenin ve ardından ilgili bazı css değerlerini araştırmanın mümkün olmadığını mükemmel bir şekilde açıklasa da, "CSS'yi etkinleştiren saf JavaScript'te fareyle üzerine gelmeyi nasıl simüle ederim" sorusunu yanıtlıyor. : vurgulu ”?" sadece kısmen.
Feragatname
Bu yüksek performanslı bir çözüm değildir. Bunu yalnızca performansın önemli olmadığı otomatik testler için kullanıyoruz.
Çözüm
simulateCssEvent = function(type){
var id = 'simulatedStyle';
var generateEvent = function(selector){
var style = "";
for (var i in document.styleSheets) {
var rules = document.styleSheets[i].cssRules;
for (var r in rules) {
if(rules[r].cssText && rules[r].selectorText){
if(rules[r].selectorText.indexOf(selector) > -1){
var regex = new RegExp(selector,"g")
var text = rules[r].cssText.replace(regex,"");
style += text+"\n";
}
}
}
}
$("head").append("<style id="+id+">"+style+"</style>");
};
var stopEvent = function(){
$("#"+id).remove();
};
switch(type) {
case "hover":
return generateEvent(":hover");
case "stop":
return stopEvent();
}
}
Açıklama
generateEvent tüm css dosyalarını okur,: hover'ı boş bir dizeyle değiştirir ve uygular. Bu, tüm: vurgulu stillerin uygulandığı bir etkiye sahiptir. Artık, güçlü bir stil araştırılabilir ve Simülasyonu durdurarak başlangıç durumuna geri dönülebilir.
Fareyle üzerine gelme efektini neden sadece ilgilendiğimiz öğe için değil de tüm belgeye uygulayıp ardından bir element.css (...) gerçekleştiriyoruz?
Bu şekilde yapıldığında, stil satır içi olarak uygulanır, bu, orijinal css vurgulu stil tarafından geçersiz kılınmayabilecek diğer stilleri geçersiz kılar.
Şimdi tek bir öğe için fareyle üzerine gelme simülasyonunu nasıl yapabilirim?
Bu performans değil, o yüzden yapmasan iyi olur. Gerekirse, stilin öğeniz için geçerli olup olmadığını ve yalnızca bu stilleri kullanıp kullanmadığını element.is (selectorOfInterest) ile kontrol edebilirsiniz.
Misal
Jasmine'de örneğin şimdi şunları gerçekleştirebilirsiniz:
describe("Simulate CSS Event", function() {
it("Simulate Link Hover", function () {
expect($("a").css("text-decoration")).toBe("none");
simulateCssEvent('hover');
expect($("a").css("text-decoration")).toBe("underline");
simulateCssEvent('stop');
expect($("a").css("text-decoration")).toBe("none");
});
});
:hoverbir öğeye zorlama durumu.