पृष्ठभूमि
मैं स्वचालित परीक्षणों को लिखने की कोशिश करते हुए इस सवाल पर ठोकर खाई, यह सत्यापित करने के लिए कि किसी दिए गए पृष्ठ पर तत्वों के एक निश्चित सेट में एचओएस घटनाओं के लिए सीएसएस द्वारा निर्धारित सीएसएस गुणों के कुछ सेट हैं।
जबकि उपरोक्त उत्तर पूरी तरह से बताता है, कि जेएस द्वारा केवल हॉवर इवेंट को ट्रिगर करना क्यों संभव नहीं है और फिर ब्याज के कुछ सीएसएस मूल्य की जांच करें, यह प्रारंभिक प्रश्न का उत्तर देता है "मैं शुद्ध जावास्क्रिप्ट में माउसओवर का अनुकरण कैसे करता हूं जो CSS को सक्रिय करता है" : मंडराना "?" केवल आंशिक रूप से।
अस्वीकरण
यह एक प्रदर्शन योग्य समाधान नहीं है। हम इसका उपयोग केवल स्वचालित परीक्षण के लिए करते हैं, जहां प्रदर्शन चिंता का विषय नहीं है।
उपाय
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();
}
}
व्याख्या
GenerEvent सभी css फाइल्स को पढ़ता है, रिप्लेस करता है: एक खाली स्ट्रिंग के साथ होवर करें और इसे लागू करें। इसका प्रभाव है, कि सभी: हॉवर शैलियों को लागू किया जाता है। अब एक howered शैली के लिए जांच कर सकते हैं और सिमुलेशन को रोककर प्रारंभिक अवस्था में वापस आ सकते हैं।
हम पूरे दस्तावेज़ के लिए होवर प्रभाव क्यों लागू करते हैं और केवल शीट से प्राप्त करके ब्याज के तत्व के लिए नहीं, और फिर एक तत्व प्रदर्शन करते हैं। (...)?
उस के रूप में किया, शैली इनलाइन लागू किया जाएगा, यह अन्य शैलियों को ओवरराइड करेगा, जो मूल सीएसएस होवर-शैली द्वारा ओवरराइड नहीं किया जा सकता है।
अब मैं किसी एक तत्व के लिए होवर का अनुकरण कैसे करूंगा?
यह बेहतर नहीं है। यदि आपको आवश्यक है, तो आप एलिमेंट के साथ जांच कर सकते हैं। (selectorOfInterest) यदि शैली आपके तत्व के लिए लागू होती है और केवल आपकी शैलियों का उपयोग करती है।
उदाहरण
जैस्मीन में आप अब प्रदर्शन कर सकते हैं:
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");
});
});
:hoverएक तत्व पर राज्य करना है ।