अगर jQuery का उपयोग करके CSS क्लास जोड़ी या बदली जाती है तो मैं किसी घटना को कैसे फायर कर सकता हूं? क्या CSS वर्ग के बदलने से jQuery change()
ईवेंट में आग लग जाती है ?
अगर jQuery का उपयोग करके CSS क्लास जोड़ी या बदली जाती है तो मैं किसी घटना को कैसे फायर कर सकता हूं? क्या CSS वर्ग के बदलने से jQuery change()
ईवेंट में आग लग जाती है ?
जवाबों:
जब भी आप अपनी स्क्रिप्ट में एक क्लास बदलते हैं, तो आप trigger
अपनी खुद की घटना को बढ़ाने के लिए उपयोग कर सकते हैं ।
$(this).addClass('someClass');
$(mySelector).trigger('cssClassChanged')
....
$(otherSelector).bind('cssClassChanged', data, function(){ do stuff });
लेकिन अन्यथा, नहीं, जब क्लास बदलती है तो किसी घटना को आग लगाने का कोई तरीका नहीं है। change()
फ़ोकस के बाद केवल आग एक इनपुट छोड़ती है जिसका इनपुट बदल दिया गया है।
$(function() {
var button = $('.clickme')
, box = $('.box')
;
button.on('click', function() {
box.removeClass('box');
$(document).trigger('buttonClick');
});
$(document).on('buttonClick', function() {
box.text('Clicked!');
});
});
.box { background-color: red; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="box">Hi</div>
<button class="clickme">Click me</button>
changeColor
घटना को ट्रिगर कर सकता हूं , और उस घटना की सदस्यता लेने वाले सभी ऑब्जेक्ट तदनुसार प्रतिक्रिया कर सकते हैं।
IMHO बेहतर समाधान @ RamboNo5 और @ जेसन द्वारा दो उत्तरों को संयोजित करना है
मेरा मतलब है AddClass फ़ंक्शन को ओवरराइड करना और एक कस्टम ईवेंट जोड़ना cssClassChanged
// Create a closure
(function(){
// Your base, I'm in it!
var originalAddClassMethod = jQuery.fn.addClass;
jQuery.fn.addClass = function(){
// Execute the original method.
var result = originalAddClassMethod.apply( this, arguments );
// trigger a custom event
jQuery(this).trigger('cssClassChanged');
// return the original result
return result;
}
})();
// document ready function
$(function(){
$("#YourExampleElementID").bind('cssClassChanged', function(){
//do stuff here
});
});
$()
, जब आप वास्तविक क्रिया शुरू करते हैं, तब तक सैकड़ों घटनाओं को पूरा करते हैं ।
cssClassChanged
घटना को एक तत्व से बांधते हैं , तो आपको पता होना चाहिए कि यह तब भी निकाल दिया जाएगा जब इसका बच्चा अपनी कक्षा बदल दे। इसलिए अगर उदाहरण के लिए आप उनके लिए इस घटना को आग नहीं देना चाहते हैं, तो बस $("#YourExampleElementID *").on('cssClassChanged', function(e) { e.stopPropagation(); });
अपने बंधन के बाद कुछ ऐसा जोड़ें । वैसे भी, वास्तव में अच्छा समाधान, धन्यवाद!
यदि आप वर्ग परिवर्तन का पता लगाना चाहते हैं, तो सबसे अच्छा तरीका म्यूटेशन ऑब्जर्वर का उपयोग करना है, जो आपको किसी भी विशेषता परिवर्तन पर पूर्ण नियंत्रण प्रदान करता है। हालाँकि आपको अपने आप को श्रोता को परिभाषित करने की आवश्यकता है, और इसे उस तत्व से जोड़ना होगा जो आप सुन रहे हैं। अच्छी बात यह है कि श्रोता के जुड़ने के बाद आपको मैन्युअल रूप से कुछ भी ट्रिगर करने की आवश्यकता नहीं है।
$(function() {
(function($) {
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
$.fn.attrchange = function(callback) {
if (MutationObserver) {
var options = {
subtree: false,
attributes: true
};
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(e) {
callback.call(e.target, e.attributeName);
});
});
return this.each(function() {
observer.observe(this, options);
});
}
}
})(jQuery);
//Now you need to append event listener
$('body *').attrchange(function(attrName) {
if(attrName=='class'){
alert('class changed');
}else if(attrName=='id'){
alert('id changed');
}else{
//OTHER ATTR CHANGED
}
});
});
इस उदाहरण में ईवेंट श्रोता को हर तत्व से जोड़ा जाता है, लेकिन आप नहीं चाहते कि ज्यादातर मामलों में (मेमोरी को बचाएं)। इस "attrchange" श्रोता को उस तत्व में शामिल करें जिसे आप निरीक्षण करना चाहते हैं।
DOMMutationObserver
।
मैं आपको AddClass फ़ंक्शन को ओवरराइड करने का सुझाव दूंगा। आप इसे इस तरह से कर सकते हैं:
// Create a closure
(function(){
// Your base, I'm in it!
var originalAddClassMethod = jQuery.fn.addClass;
jQuery.fn.addClass = function(){
// Execute the original method.
var result = originalAddClassMethod.apply( this, arguments );
// call your function
// this gets called everytime you use the addClass method
myfunction();
// return the original result
return result;
}
})();
// document ready function
$(function(){
// do stuff
});
बस अवधारणा का एक प्रमाण:
कुछ एनोटेशन देखने और अद्यतित रहने के लिए जिस्ट को देखें:
https://gist.github.com/yckart/c893d7db0f49b1ea4dfb
(function ($) {
var methods = ['addClass', 'toggleClass', 'removeClass'];
$.each(methods, function (index, method) {
var originalMethod = $.fn[method];
$.fn[method] = function () {
var oldClass = this[0].className;
var result = originalMethod.apply(this, arguments);
var newClass = this[0].className;
this.trigger(method, [oldClass, newClass]);
return result;
};
});
}(window.jQuery || window.Zepto));
उपयोग काफी सरल है, बस आप जिस नोड को देखना चाहते हैं उस पर एक नया लिस्टेंडर जोड़ें और आमतौर पर कक्षाओं में हेरफेर करें:
var $node = $('div')
// listen to class-manipulation
.on('addClass toggleClass removeClass', function (e, oldClass, newClass) {
console.log('Changed from %s to %s due %s', oldClass, newClass, e.type);
})
// make some changes
.addClass('foo')
.removeClass('foo')
.toggleClass('foo');
this[0]
अपरिभाषित होता है ... बस लाइनों के अंत को निम्नलिखित असाइनमेंट के साथ var oldClass
और var newClass
= (this[0] ? this[0].className : "");
नवीनतम jquery म्यूटेशन का उपयोग करना
var $target = jQuery(".required-entry");
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.attributeName === "class") {
var attributeValue = jQuery(mutation.target).prop(mutation.attributeName);
if (attributeValue.indexOf("search-class") >= 0){
// do what you want
}
}
});
});
observer.observe($target[0], {
attributes: true
});
// कोई भी कोड जो div div class class -entry को अपडेट करता है जो $ target.addClass ('सर्च-क्लास') जैसे $ लक्ष्य में है;
change()
जब CSS क्लास जोड़ी जाती है या हटा दी जाती है या परिभाषा बदल जाती है तो आग नहीं लगती है। यह उन परिस्थितियों में आग लगती है जैसे जब एक चुनिंदा बॉक्स मूल्य चुना जाता है या अचयनित होता है।
मुझे यकीन नहीं है कि अगर आपका मतलब है अगर CSS वर्ग की परिभाषा को बदल दिया जाए (जो प्रोग्रामेटिक रूप से किया जा सकता है लेकिन थकाऊ है और आमतौर पर अनुशंसित नहीं है) या यदि एक वर्ग जोड़ा जाता है या किसी तत्व को हटाया जाता है। इस मामले में मज़बूती से कब्जा करने का कोई तरीका नहीं है।
आप निश्चित रूप से इसके लिए अपनी स्वयं की घटना बना सकते हैं लेकिन इसे केवल सलाहकार के रूप में वर्णित किया जा सकता है । यह उस कोड को कैप्चर नहीं करेगा जो आपका नहीं है।
वैकल्पिक रूप से आप addClass()
jQuery में (आदि) तरीकों को ओवरराइड / रिप्लेस कर सकते हैं लेकिन जब वेनिला जावास्क्रिप्ट के माध्यम से किया जाता है तो यह कैप्चर नहीं करेगा (हालांकि मुझे लगता है कि आप उन तरीकों को भी बदल सकते हैं)।
कस्टम इवेंट को ट्रिगर किए बिना एक और तरीका है
रिक स्ट्राल द्वारा एचटीएमएल तत्व सीएसएस परिवर्तन की निगरानी के लिए एक jQuery प्लग-इन
ऊपर से उद्धृत करना
वॉच प्लग-इन काम करता है। DOMAttrModified को FireFox में हुक करके, इंटरनेट एक्सप्लोरर में onPropertyChanged पर, या अन्य ब्राउज़रों के लिए परिवर्तनों का पता लगाने के लिए setInterval के साथ टाइमर का उपयोग करके। दुर्भाग्य से WebKit इस समय DOMAttrModified का लगातार समर्थन नहीं करता है इसलिए Safari और Chrome को वर्तमान में धीमे setInvval तंत्र का उपयोग करना होगा।
अच्छा प्रश्न। मैं बूटस्ट्रैप ड्रॉपडाउन मेनू का उपयोग कर रहा हूं, और बूटस्ट्रैप ड्रॉपडाउन के छिपे होने पर एक घटना को निष्पादित करने की आवश्यकता है। जब ड्रॉपडाउन खोला जाता है, तो "बटन-समूह" के एक वर्ग नाम के साथ युक्त डिव "ओपन" का एक वर्ग जोड़ता है; और बटन में ही "aria- विस्तारित" विशेषता सच है। जब ड्रॉपडाउन बंद हो जाता है, तो "ओपन" के उस वर्ग को युक्त डिव से हटा दिया जाता है, और एरिया-विस्तारित को सही से गलत में बदल दिया जाता है।
यह मुझे इस सवाल की ओर ले गया कि कैसे वर्ग परिवर्तन का पता लगाया जाए।
बूटस्ट्रैप के साथ, "ड्रॉपडाउन इवेंट" हैं जिन्हें पता लगाया जा सकता है। इस लिंक पर "ड्रॉपडाउन इवेंट्स" देखें। http://www.w3schools.com/bootstrap/bootstrap_ref_js_dropdown.asp
यहां बूटस्ट्रैप ड्रॉपडाउन पर इस घटना का उपयोग करने का एक त्वरित और गंदा उदाहरण है।
$(document).on('hidden.bs.dropdown', function(event) {
console.log('closed');
});
अब मुझे एहसास हुआ कि यह पूछे जाने वाले सामान्य प्रश्न से अधिक विशिष्ट है। लेकिन मुझे लगता है कि बूटस्ट्रैप ड्रॉपडाउन के साथ एक खुली या बंद घटना का पता लगाने की कोशिश करने वाले अन्य डेवलपर्स को यह मददगार लगेगा। मेरी तरह, वे शुरू में एक तत्व वर्ग परिवर्तन का पता लगाने की कोशिश कर सकते हैं (जो स्पष्ट रूप से इतना सरल नहीं है)। धन्यवाद।
यदि आपको एक विशिष्ट ईवेंट को ट्रिगर करने की आवश्यकता है, तो आप 'classadded' नामक एक कस्टम ईवेंट को आग लगाने के लिए विधि addClass () को ओवरराइड कर सकते हैं।
यहाँ कैसे:
(function() {
var ev = new $.Event('classadded'),
orig = $.fn.addClass;
$.fn.addClass = function() {
$(this).trigger(ev, arguments);
return orig.apply(this, arguments);
}
})();
$('#myElement').on('classadded', function(ev, newClasses) {
console.log(newClasses + ' added!');
console.log(this);
// Do stuff
// ...
});
आप DOMSubtreeModified इवेंट को बाइंड कर सकते हैं। मैं यहां एक उदाहरण जोड़ता हूं:
एचटीएमएल
<div id="mutable" style="width:50px;height:50px;">sjdfhksfh<div>
<div>
<button id="changeClass">Change Class</button>
</div>
जावास्क्रिप्ट
$(document).ready(function() {
$('#changeClass').click(function() {
$('#mutable').addClass("red");
});
$('#mutable').bind('DOMSubtreeModified', function(e) {
alert('class changed');
});
});
यदि आप जानते हैं कि किस घटना ने पहली बार कक्षा को बदल दिया है तो आप उसी घटना पर थोड़ी देरी और कक्षा के लिए जाँच कर सकते हैं। उदाहरण
//this is not the code you control
$('input').on('blur', function(){
$(this).addClass('error');
$(this).before("<div class='someClass'>Warning Error</div>");
});
//this is your code
$('input').on('blur', function(){
var el= $(this);
setTimeout(function(){
if ($(el).hasClass('error')){
$(el).removeClass('error');
$(el).prev('.someClass').hide();
}
},1000);
});
var timeout_check_change_class;
function check_change_class( selector )
{
$(selector).each(function(index, el) {
var data_old_class = $(el).attr('data-old-class');
if (typeof data_old_class !== typeof undefined && data_old_class !== false)
{
if( data_old_class != $(el).attr('class') )
{
$(el).trigger('change_class');
}
}
$(el).attr('data-old-class', $(el).attr('class') );
});
clearTimeout( timeout_check_change_class );
timeout_check_change_class = setTimeout(check_change_class, 10, selector);
}
check_change_class( '.breakpoint' );
$('.breakpoint').on('change_class', function(event) {
console.log('haschange');
});