আমি কীভাবে ব্রাউজার উইন্ডোর পুনরায় আকারের ইভেন্টটিতে প্রবেশ করতে পারি?
আছে পুনরায় আকার দেওয়ার ঘটনা শোনার জন্য অপেক্ষা একটি jQuery পথ কিন্তু আমি শুধু এই এক প্রয়োজন আমার প্রকল্পে এটা আনতে পছন্দ না করেন যাবে।
আমি কীভাবে ব্রাউজার উইন্ডোর পুনরায় আকারের ইভেন্টটিতে প্রবেশ করতে পারি?
আছে পুনরায় আকার দেওয়ার ঘটনা শোনার জন্য অপেক্ষা একটি jQuery পথ কিন্তু আমি শুধু এই এক প্রয়োজন আমার প্রকল্পে এটা আনতে পছন্দ না করেন যাবে।
উত্তর:
jQuery কেবল স্ট্যান্ডার্ড resize
DOM ইভেন্ট মোড়ানো হয় , যেমন।
window.onresize = function(event) {
...
};
পুনরায় আকারের ইভেন্টটি সমস্ত ব্রাউজারে নিয়মিতভাবে চালিত হয় তা নিশ্চিত করতে jQuery কিছু কাজ করতে পারে তবে ব্রাউজারগুলির মধ্যে কোনওরকমের পার্থক্য রয়েছে কিনা তা সম্পর্কে আমি নিশ্চিত নই, তবে আমি আপনাকে ফায়ারফক্স, সাফারি এবং আইআইতে পরীক্ষা করতে উত্সাহিত করব।
window.addEventListener('resize', function(){}, true);
window.onresize = () => { /* code */ };
বা আরও ভাল:window.addEventListener('resize', () => { /* code */ });
প্রথমত, আমি জানি যে addEventListener
পদ্ধতিটি উপরের মন্তব্যে উল্লিখিত হয়েছে, তবে আমি কোনও কোড দেখিনি। যেহেতু এটি পছন্দসই পদ্ধতির, তাই এটি এখানে:
window.addEventListener('resize', function(event){
// do stuff here
});
removeEventListener
।
উইন্ডোটি কখনই ওভাররাইড করবেন না function
পরিবর্তে, অবজেক্ট বা উপাদানটিতে ইভেন্ট শ্রোতা যুক্ত করতে একটি ফাংশন তৈরি করুন। এই শ্রোতাগুলি কাজ করে না এমনটি পরীক্ষা করে তোলে এবং এরপরে এটি শেষ অবলম্বন হিসাবে অবজেক্টের ফাংশনটিকে ওভাররাইড করে। এটি jQuery এর মতো লাইব্রেরিতে ব্যবহৃত পছন্দসই পদ্ধতি।
object
: উপাদান বা উইন্ডো অবজেক্ট
type
: আকার পরিবর্তন, স্ক্রোল (ইভেন্টের ধরণ)
callback
: ফাংশন রেফারেন্স
var addEvent = function(object, type, callback) {
if (object == null || typeof(object) == 'undefined') return;
if (object.addEventListener) {
object.addEventListener(type, callback, false);
} else if (object.attachEvent) {
object.attachEvent("on" + type, callback);
} else {
object["on"+type] = callback;
}
};
তারপরে ব্যবহারটি এরকম:
addEvent(window, "resize", function_reference);
বা বেনামে ফাংশন সহ:
addEvent(window, "resize", function(event) {
console.log('resized');
});
attachEvent
আর সমর্থিত নয়। ভবিষ্যতের জন্য পছন্দসই উপায় addEventListener
।
elem == undefined
। এটি সম্ভব (যদিও অসম্ভব) তবে স্থানীয়ভাবে "অপরিবর্তিত" অন্য কিছু হিসাবে সংজ্ঞায়িত হয়েছে। stackoverflow.com/questions/8175673/…
পুনরায় আকারের ইভেন্টটি কখনই সরাসরি ব্যবহার করা উচিত নয় কারণ এটি আমাদের আকার পরিবর্তন করার সাথে সাথে অবিচ্ছিন্নভাবে চালিত হয়।
অতিরিক্ত কলগুলি প্রশমিত করতে একটি ডেবিউ ফাংশন ব্যবহার করুন।
window.addEventListener('resize',debounce(handler, delay, immediate),false);
এখানে জলের চারদিকে প্রচলিত একটি সাধারণ উত্সাহ রয়েছে, যদিও লোডাসে আরও বেশি উন্নত লোকের সন্ধান করুন।
const debounce = (func, wait, immediate) => {
var timeout;
return () => {
const context = this, args = arguments;
const later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
};
const callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
এটি এর মতো ব্যবহার করা যেতে পারে ...
window.addEventListener('resize', debounce(() => console.log('hello'),
200, false), false);
এটি প্রতি 200 মিমিগুলিতে একবারের বেশি জ্বলবে না।
মোবাইল ওরিয়েন্টেশন পরিবর্তনের জন্য ব্যবহার করুন:
window.addEventListener('orientationchange', () => console.log('hello'), false);
খুব সুন্দরভাবে এটি যত্ন নেওয়ার জন্য আমি এখানে একটি ছোট লাইব্রেরি রেখেছি।
(...arguments) => {...}
(বা ...args
কম বিভ্রান্তির জন্য) থাকা দরকার কারণ arguments
ভেরিয়েবলটি তাদের সুযোগটি আর উপলব্ধ নেই।
2018+ এর সমাধান:
আপনার ResizeObserver ব্যবহার করা উচিত । এটি ব্রাউজার-নেটিভ সমাধান যা resize
ইভেন্টটি ব্যবহারের চেয়ে অনেক বেশি ভাল পারফরম্যান্স পেয়েছে । উপরন্তু, এটা না শুধুমাত্র এর ইভেন্টে সমর্থন document
কিন্তু নির্বিচারে উপর elements
।
var ro = new ResizeObserver( entries => { for (let entry of entries) { const cr = entry.contentRect; console.log('Element:', entry.target); console.log(`Element size: ${cr.width}px x ${cr.height}px`); console.log(`Element padding: ${cr.top}px ; ${cr.left}px`); } }); // Observe one or multiple elements ro.observe(someElement);
বর্তমানে ফায়ারফক্স, ক্রোম এবং সাফারি এটিকে সমর্থন করে । অন্যান্য (এবং আরও পুরানো) ব্রাউজারগুলির জন্য আপনাকে পলিফিল ব্যবহার করতে হবে ।
আমি বিশ্বাস করি যে সঠিক উত্তর ইতিমধ্যে @ অ্যালেক্স ভি দ্বারা সরবরাহ করা হয়েছে, তবুও উত্তরটি বর্তমানে কিছুটা আধুনিকীকরণের প্রয়োজন কারণ এটি এখন পাঁচ বছরেরও বেশি পুরানো।
দুটি প্রধান সমস্যা আছে:
object
প্যারামিটারের নাম হিসাবে কখনও ব্যবহার করবেন না । এটি একটি সংরক্ষিত শব্দ। এটি বলা হচ্ছে, @ অ্যালেক্স ভি এর সরবরাহিত ফাংশন কাজ করবে না strict mode
।
addEvent
@Alex ভী দ্বারা উপলব্ধ ফাংশন ফেরত দেয় না event object
যদি addEventListener
পদ্ধতি ব্যবহার করা হয়। এটির addEvent
অনুমতি দেওয়ার জন্য ফাংশনে আরও একটি প্যারামিটার যুক্ত করা উচিত ।
দ্রষ্টব্য: নতুন প্যারামিটারটি addEvent
alচ্ছিক করা হয়েছে যাতে এই নতুন ফাংশন সংস্করণে স্থানান্তর করা এই ফাংশনে কোনও পূর্ববর্তী কলগুলিকে ভঙ্গ না করে। সমস্ত উত্তরাধিকার ব্যবহার সমর্থন করা হবে।
addEvent
এই পরিবর্তনগুলি সহ আপডেট করা ফাংশনটি এখানে :
/*
function: addEvent
@param: obj (Object)(Required)
- The object which you wish
to attach your event to.
@param: type (String)(Required)
- The type of event you
wish to establish.
@param: callback (Function)(Required)
- The method you wish
to be called by your
event listener.
@param: eventReturn (Boolean)(Optional)
- Whether you want the
event object returned
to your callback method.
*/
var addEvent = function(obj, type, callback, eventReturn)
{
if(obj == null || typeof obj === 'undefined')
return;
if(obj.addEventListener)
obj.addEventListener(type, callback, eventReturn ? true : false);
else if(obj.attachEvent)
obj.attachEvent("on" + type, callback);
else
obj["on" + type] = callback;
};
নতুন addEvent
ফাংশনে একটি উদাহরণ কল :
var watch = function(evt)
{
/*
Older browser versions may return evt.srcElement
Newer browser versions should return evt.currentTarget
*/
var dimensions = {
height: (evt.srcElement || evt.currentTarget).innerHeight,
width: (evt.srcElement || evt.currentTarget).innerWidth
};
};
addEvent(window, 'resize', watch, true);
Http://mbccs.blogspot.com/2007/11/fixing-window-resize-event-in-ie.html এ আমার ব্লগ পোস্টটি উল্লেখ করার জন্য ধন্যবাদ ।
আপনি যখন স্ট্যান্ডার্ড উইন্ডো রিজাইজ ইভেন্টটি সন্ধান করতে পারেন, আপনি দেখতে পাবেন যে আইআই-তে, ইভেন্টটি প্রতি এক্স এর জন্য একবার এবং প্রতিটি ওয়াই অক্ষের চলাচলের জন্য একবার চালিত হয়, ফলস্বরূপ এক টন ইভেন্টগুলি বরখাস্ত হয় যার পারফরম্যান্স থাকতে পারে আপনার সাইটের উপর প্রভাব যদি রেন্ডারিং একটি নিবিড় কাজ হয়।
আমার পদ্ধতিতে একটি সংক্ষিপ্ত সময়সীমা জড়িত যা পরবর্তী ইভেন্টগুলিতে বাতিল হয়ে যায় যাতে ব্যবহারকারী উইন্ডোটির আকার পরিবর্তন না করা অবধি ইভেন্টটি আপনার কোডটিতে বুদবুদ না হয়ে যায়।
window.onresize = function() {
// your code
};
নিম্নলিখিত ব্লগ পোস্ট আপনার জন্য দরকারী হতে পারে: আইই মধ্যে উইন্ডো পুনরায় আকার ইভেন্ট ফিক্সিং
এটি এই কোড সরবরাহ করে:
Sys.Application.add_load(function(sender, args) { $addHandler(window, 'resize', window_resize); }); var resizeTimeoutId; function window_resize(e) { window.clearTimeout(resizeTimeoutId); resizeTimeoutId = window.setTimeout('doResizeCode();', 10); }
উপরে উল্লিখিত ইতিমধ্যে উল্লিখিত সমাধানগুলি কেবলমাত্র উইন্ডো এবং উইন্ডোর আকার পরিবর্তন করতে চাইলে কাজ করবে। তবে, আপনি যদি পুনরায় আকারটি শিশু উপাদানগুলিতে প্রচার করতে চান তবে আপনাকে ইভেন্টটি নিজে প্রচার করতে হবে। এটি করার জন্য এখানে কয়েকটি উদাহরণ কোড রয়েছে:
window.addEventListener("resize", function () {
var recResizeElement = function (root) {
Array.prototype.forEach.call(root.childNodes, function (el) {
var resizeEvent = document.createEvent("HTMLEvents");
resizeEvent.initEvent("resize", false, true);
var propagate = el.dispatchEvent(resizeEvent);
if (propagate)
recResizeElement(el);
});
};
recResizeElement(document.body);
});
নোট করুন যে কোনও শিশু উপাদান কল করতে পারে
event.preventDefault();
পুনরায় আকারের ইভেন্টের প্রথম আরগ হিসাবে পাস হওয়া ইভেন্ট অবজেক্টে। উদাহরণ স্বরূপ:
var child1 = document.getElementById("child1");
child1.addEventListener("resize", function (event) {
...
event.preventDefault();
});
var EM = new events_managment();
EM.addEvent(window, 'resize', function(win,doc, event_){
console.log('resized');
//EM.removeEvent(win,doc, event_);
});
function events_managment(){
this.events = {};
this.addEvent = function(node, event_, func){
if(node.addEventListener){
if(event_ in this.events){
node.addEventListener(event_, function(){
func(node, event_);
this.events[event_](win_doc, event_);
}, true);
}else{
node.addEventListener(event_, function(){
func(node, event_);
}, true);
}
this.events[event_] = func;
}else if(node.attachEvent){
var ie_event = 'on' + event_;
if(ie_event in this.events){
node.attachEvent(ie_event, function(){
func(node, ie_event);
this.events[ie_event]();
});
}else{
node.attachEvent(ie_event, function(){
func(node, ie_event);
});
}
this.events[ie_event] = func;
}
}
this.removeEvent = function(node, event_){
if(node.removeEventListener){
node.removeEventListener(event_, this.events[event_], true);
this.events[event_] = null;
delete this.events[event_];
}else if(node.detachEvent){
node.detachEvent(event_, this.events[event_]);
this.events[event_] = null;
delete this.events[event_];
}
}
}