যদি কোনও সিএসএস ক্লাস jQuery ব্যবহার করে যুক্ত করা বা পরিবর্তন করা হয় তবে আমি কীভাবে একটি ইভেন্ট নিক্ষেপ করতে পারি? সিএসএস শ্রেণি পরিবর্তনের ফলে কি jQuery change()
ইভেন্টের আগুন ?
যদি কোনও সিএসএস ক্লাস jQuery ব্যবহার করে যুক্ত করা বা পরিবর্তন করা হয় তবে আমি কীভাবে একটি ইভেন্ট নিক্ষেপ করতে পারি? সিএসএস শ্রেণি পরিবর্তনের ফলে কি 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
ইভেন্টটি ট্রিগার করতে পারি এবং সেই ইভেন্টে সাবস্ক্রাইব করা সমস্ত বস্তু সেই অনুযায়ী প্রতিক্রিয়া জানাতে পারে।
আইএমএইচও আরও ভাল সমাধান হ'ল @ র্যাম্বনো 5 এবং @ জেসন দ্বারা দুটি উত্তর একত্রিত করা
আমার অর্থ অ্যাডক্লাস ফাংশনকে ওভাররাইড করা এবং একটি কাস্টম ইভেন্ট বলা হয় 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
}
});
});
এই উদাহরণে ইভেন্ট শ্রোতা প্রতিটি উপাদানগুলিতে যুক্ত হয় তবে আপনি এটি বেশিরভাগ ক্ষেত্রেই (স্মৃতি সংরক্ষণ করুন) চান না। আপনি যে উপাদানটি পর্যবেক্ষণ করতে চান তাতে এই "অ্যাট্রিচেন" শ্রোতাকে যুক্ত করুন।
DOMMutationObserver
।
আমি আপনাকে অ্যাডক্লাস ফাংশন ওভাররাইড করার পরামর্শ দেব। আপনি এটি এইভাবে করতে পারেন:
// 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
});
// এমন কোনও কোড যা ডিভিড আপডেট করে যা ক্লাসের প্রয়োজনীয়-এন্ট্রি থাকে যা $ টার্গেটে। টার্গেটে থাকে। টার্গেট.এডিডি ক্লাস ('অনুসন্ধান-শ্রেণি');
change()
যখন কোনও সিএসএস ক্লাস যুক্ত বা সরিয়ে ফেলা হয় বা সংজ্ঞা পরিবর্তিত হয় তখন আগুন জ্বলবে না। এটি যখন নির্বাচিত বাক্সের মানটি নির্বাচিত বা নির্বাচিত না হয় এমন পরিস্থিতিতে আগুন দেয়।
আমি নিশ্চিত না যে আপনি যদি সিএসএস শ্রেণির সংজ্ঞা পরিবর্তিত হয়ে থাকেন (যা প্রোগ্রামিকভাবে করা যায় তবে ক্লান্তিকর এবং সাধারণত প্রস্তাবিত হয় না) বা কোনও শ্রেণিতে কোনও উপাদান যুক্ত করা বা অপসারণ করা হয় কিনা তা নিশ্চিত না not উভয় ক্ষেত্রেই এই ঘটনাটি নির্ভরযোগ্যভাবে ক্যাপচার করার কোনও উপায় নেই।
আপনি অবশ্যই এটির জন্য নিজের ইভেন্ট তৈরি করতে পারেন তবে এটি কেবল উপদেষ্টা হিসাবে বর্ণনা করা যেতে পারে । এটি কোডটি ক্যাপচার করবে না যা এটি আপনার করছে না।
বিকল্পভাবে আপনি addClass()
jQuery এ (ইত্যাদি) পদ্ধতিগুলিকে ওভাররাইড / প্রতিস্থাপন করতে পারেন তবে ভ্যানিলা জাভাস্ক্রিপ্টের মাধ্যমে হয়ে গেলে এটি ক্যাপচার করবে না (যদিও আমি মনে করি আপনিও এই পদ্ধতিগুলি প্রতিস্থাপন করতে পারেন)।
একটি কাস্টম ইভেন্ট ট্রিগার না করে আরও একটি উপায় আছে
রিক স্ট্রহলের এইচটিএমএল এলিমেন্ট সিএসএস পরিবর্তনগুলি নিরীক্ষণ করার জন্য একটি jQuery প্লাগ-ইন
উপরে থেকে উদ্ধৃতি
ঘড়ি প্লাগ-ইন ফায়ারফক্সে ডিওএমএটিট্রোমডিফায়েড, ইন্টারনেট এক্সপ্লোরার-এ প্রোপার্টি চেঞ্জ করা বা অন্যান্য ব্রাউজারগুলির পরিবর্তনের সনাক্তকরণ পরিচালনা করতে সেট-ইনটারওয়াল সহ একটি টাইমার ব্যবহার করে কাজ করে। দুর্ভাগ্যক্রমে ওয়েবকিট এই মুহূর্তে ধারাবাহিকভাবে ডোম্যাট্রাস্টমোডিকে সমর্থন করে না তাই সাফারি এবং ক্রোমকে বর্তমানে ধীর গতির সেট অন্তর্বর্তী প্রক্রিয়াটি ব্যবহার করতে হবে।
ভাল প্রশ্ন. আমি বুটস্ট্র্যাপ ড্রপডাউন মেনু ব্যবহার করছি এবং যখন বুটস্ট্র্যাপ ড্রপডাউনটি লুকানো ছিল তখন একটি ইভেন্ট চালানো দরকার। যখন ড্রপডাউনটি খোলা হয়, "বোতাম-গোষ্ঠী" এর শ্রেণীর নামের সাথে থাকা ডিভটি "ওপেন" শ্রেণি যুক্ত করে; এবং বোতামটিতে নিজেই একটি "আরিয়া-প্রসারিত" বৈশিষ্ট্য সেট করা আছে। যখন ড্রপডাউনটি বন্ধ হয়ে যায়, তখন "ওপেন" শ্রেণীর বিভাগটি ডিভযুক্ত ডিভাইস থেকে সরানো হয় এবং এরিয়া-প্রসারিতটি সত্য থেকে মিথ্যাতে স্যুইচ করা হয়।
এটি আমাকে এই প্রশ্নে নিয়ে যায়, শ্রেণি পরিবর্তন কীভাবে সনাক্ত করতে হয়।
বুটস্ট্র্যাপের সাহায্যে এমন "ড্রপডাউন ইভেন্ট" রয়েছে যা সনাক্ত করা যায়। এই লিঙ্কটিতে "ড্রপডাউন ইভেন্ট" অনুসন্ধান করুন। http://www.w3schools.com/bootstrap/bootstrap_ref_js_dropdown.asp
বুটস্ট্র্যাপ ড্রপডাউনতে এই ইভেন্টটি ব্যবহারের একটি দ্রুত এবং নোংরা উদাহরণ।
$(document).on('hidden.bs.dropdown', function(event) {
console.log('closed');
});
এখন আমি বুঝতে পারি যে এটি জিজ্ঞাসা করা সাধারণ প্রশ্নের চেয়ে বেশি নির্দিষ্ট। তবে আমি কল্পনা করি যে অন্য বিকাশকারীরা একটি বুটস্ট্র্যাপ ড্রপডাউন দিয়ে একটি খোলা বা বন্ধ ইভেন্ট সনাক্ত করার চেষ্টা করছেন এটি সহায়ক হিসাবে খুঁজে পাবে। আমার মতো, তারা প্রাথমিকভাবে কোনও উপাদান শ্রেণীর পরিবর্তন (যা সম্ভবত এতো সহজ নয়) সনাক্ত করার চেষ্টা করার পথে যেতে পারে। ধন্যবাদ।
আপনার যদি কোনও নির্দিষ্ট ইভেন্ট ট্রিগার করতে হয় তবে আপনি 'শ্রেণিবদ্ধ' নামক একটি কাস্টম ইভেন্ট ফায়ার করতে পদ্ধতি অ্যাডক্লাস () পদ্ধতিটিকে ওভাররাইড করতে পারেন।
এখানে কীভাবে:
(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');
});