সারসংক্ষেপ:
আমি এখানে একটি নো-জিকিউয়ারি ক্রস-ব্রাউজার ডেস্কটপ এবং মোবাইলের সীমাবদ্ধতা / স্লাইডার ইন্টারঅ্যাকশনগুলিতে ধারাবাহিকভাবে প্রতিক্রিয়া জানাতে সক্ষম করি যা বর্তমান ব্রাউজারগুলিতে সম্ভব নয়। এটি মূলত সমস্ত ব্রাউজারগুলিকে on("change"...
তাদের on("change"...
বা on("input"...
ইভেন্টগুলির জন্য আই 11 এর ইভেন্ট অনুকরণ করতে বাধ্য করে । নতুন ফাংশনটি হ'ল ...
function onRangeChange(r,f) {
var n,c,m;
r.addEventListener("input",function(e){n=1;c=e.target.value;if(c!=m)f(e);m=c;});
r.addEventListener("change",function(e){if(!n)f(e);});
}
... r
আপনার সীমার ইনপুট উপাদানটি কোথায় এবং f
আপনার শ্রোতা। শ্রোতাদের যে কোনও মিথস্ক্রিয়া বা পরিসীমা / স্লাইডারের মান পরিবর্তনের সাথে যোগাযোগ করা হবে তবে সেই মান পরিবর্তন করে না এমন কথোপকথনের পরে নয়, বর্তমান স্লাইডারের অবস্থানে প্রাথমিক মাউস বা স্পর্শ ইন্টারঅ্যাকশন সহ বা স্লাইডারের উভয় প্রান্তে সরে যাওয়ার পরে।
সমস্যা:
জুন ২০১ early এর শুরুর দিকে, বিভিন্ন ব্রাউজারগুলি পরিসীমা / স্লাইডার ব্যবহারে কীভাবে প্রতিক্রিয়া জানায় সে অনুসারে তারতম্য। পাঁচটি পরিস্থিতি প্রাসঙ্গিক:
- বর্তমান স্লাইডার অবস্থানে প্রাথমিক মাউস ডাউন (বা টাচ-স্টার্ট)
- নতুন স্লাইডার অবস্থানে প্রাথমিক মাউস-ডাউন (বা টাচ-স্টার্ট)
- স্লাইডার বরাবর 1 বা 2 এর পরে পরবর্তী কোনও মাউস (বা স্পর্শ) যেকোন আন্দোলন
- 1 বা 2 এর পরে পরবর্তী কোনও মাউস (বা স্পর্শ) গতি স্লাইডারের শেষ প্রান্তে
- চূড়ান্ত মাউস-আপ (বা স্পর্শ-শেষ)
উপরের টেবিলটি দেখায় যে উপরোক্ত পরিস্থিতিগুলির মধ্যে তারা কীভাবে প্রতিক্রিয়া জানায়, কমপক্ষে তিনটি পৃথক ডেস্কটপ ব্রাউজার তাদের আচরণে কীভাবে আলাদা হয়:
সমাধান:
onRangeChange
ফাংশন পরিসীমা / স্লাইডার পারস্পরিক ক্রিয়ার জন্য একটি সামঞ্জস্যপূর্ণ এবং আন্দাজের ক্রস ব্রাউজার প্রতিক্রিয়া প্রদান করে। এটি সমস্ত ব্রাউজারগুলিকে নিম্নলিখিত টেবিল অনুযায়ী আচরণ করতে বাধ্য করে:
আইই ১১ এ, কোডটি মূলত স্থিতাবস্থা অনুসারে সমস্ত কিছু পরিচালনা করার অনুমতি দেয়, অর্থাত্ এটি "change"
ইভেন্টটিকে তার আদর্শ পদ্ধতিতে কাজ করতে দেয় এবং ইভেন্টটি "input"
অপ্রাসঙ্গিক কারণ এটি কোনওভাবেই আগুনে ছোঁড়া হয় না। অন্যান্য ব্রাউজারগুলিতে, "change"
ইভেন্টটি কার্যকরভাবে নিঃশব্দ করা হয় (অতিরিক্ত এবং কখনও কখনও সহজেই দৃশ্যমান হওয়াগুলিকে গুলি চালানো থেকে রোধ করতে)। "input"
তদ্ব্যতীত , ইভেন্টটি তার শ্রোতাদের তখনই সরিয়ে দেয় যখন সীমা / স্লাইডারের মান পরিবর্তন হয়। কিছু ব্রাউজারের জন্য (যেমন ফায়ারফক্স) এটি ঘটে কারণ শ্রোতারা উপরের তালিকা থেকে 1, 4 এবং 5 এর পরিস্থিতিতে দৃ effectively়তার সাথে চুপ করে গেছেন।
(যদি আপনার শ্রোতা যদি সত্যই 1, 4 এবং / অথবা 5 দৃশ্যে সক্রিয় হওয়ার প্রয়োজন হয় তবে আপনি "mousedown"
/ "touchstart"
, "mousemove"
/ "touchmove"
এবং / অথবা "mouseup"
/ "touchend"
ইভেন্টগুলি অন্তর্ভুক্ত করার চেষ্টা করতে পারেন Such এই জাতীয় সমাধানটি এই উত্তরের বাইরে নয়))
মোবাইল ব্রাউজারগুলিতে কার্যকারিতা:
আমি এই কোডটি ডেস্কটপ ব্রাউজারগুলিতে পরীক্ষা করেছি তবে কোনও মোবাইল ব্রাউজারে নয়। তবে এই পৃষ্ঠার অন্য উত্তরে এমবউর্ন দেখিয়েছে যে এখানে আমার সমাধান "... আমি যে প্রতিটি ব্রাউজারে খুঁজে পেতে পারি তাতে এটি উপস্থিত রয়েছে (উইন ডেস্কটপ: আই, ক্রোম, অপেরা, এফএফ; অ্যান্ড্রয়েড ক্রোম, অপেরা এবং এফএফ, আইওএস সাফারি) " । (ধন্যবাদ এমবিউর্ন।)
ব্যবহার:
এই সমাধানটি ব্যবহার করতে, onRangeChange
আপনার নিজস্ব কোডে উপরের সংক্ষিপ্তসারটি (সরলিকৃত / মিনাইফাইড) বা নীচের ডেমো কোড স্নিপেট (কার্যত অভিন্ন, তবে আরও স্ব-ব্যাখ্যামূলক) থেকে ফাংশনটি অন্তর্ভুক্ত করুন । এটি নিম্নলিখিত হিসাবে আহ্বান:
onRangeChange(myRangeInputElmt, myListener);
যেখানে myRangeInputElmt
আপনার পছন্দসই হয় <input type="range">
DOM উপাদান এবং myListener
শ্রোতা / হ্যান্ডলার ফাংশন তোমার উপর প্রার্থনা চাই "change"
-একটি ইভেন্ট নেই।
আপনার শ্রোতা পছন্দসই হলে প্যারামিটার-কম হতে পারে বা event
প্যারামিটারটি ব্যবহার করতে পারে , যেমন আপনার প্রয়োজনের উপর নির্ভর করে নিম্নলিখিতগুলির মধ্যে দুটি কাজ করবে:
var myListener = function() {...
অথবা
var myListener = function(evt) {...
( input
উপাদান শ্রোতাদের উপাদান থেকে সরানো (যেমন ব্যবহার করা removeEventListener
) এই উত্তরে সম্বোধন করা হয়নি))
ডেমো বর্ণনা:
নীচে কোড স্নিপেটে, ফাংশন onRangeChange
সর্বজনীন সমাধান সরবরাহ করে। কোডের বাকী অংশটি এর ব্যবহার প্রদর্শনের জন্য কেবল উদাহরণ। যে ভেরিয়েবলটি দিয়ে শুরু হয় my...
তা সর্বজনীন সমাধানের সাথে অপ্রাসঙ্গিক এবং কেবল ডেমোর জন্যই উপস্থিত।
ডেমো শো পরিসীমা / স্লাইডার মান সেইসাথে বার মান সংখ্যা "change"
, "input"
এবং কাস্টম "onRangeChange"
ঘটনা বহিস্কার করেছে (সারি, A, B এবং C যথাক্রমে)। বিভিন্ন ব্রাউজারে এই স্নিপেটটি চালানোর সময়, আপনি পরিসীমা / স্লাইডারের সাথে ইন্টারেক্ট করার সময় নীচের বিষয়গুলি নোট করুন:
- আইই 11 এ, সারি A এবং C উভয় মানের উপরের 2 এবং 3 পরিস্থিতিতে পরিবর্তিত হয় এবং সারি বি কখনই পরিবর্তিত হয় না।
- ক্রোম এবং সাফারিতে, সারি বি এবং সি উভয়ের মান 2 এবং 3 দৃশ্যে পরিবর্তিত হয় এবং সারি এ কেবলমাত্র 5 এর দৃশ্যের জন্য পরিবর্তিত হয়।
- ফায়ারফক্সে, সারি এ-এর মান কেবলমাত্র 5 দৃশ্যের পরিবর্তিত হয়, সারি বি সমস্ত পাঁচটি দৃশ্যের জন্য পরিবর্তন হয় এবং সারি সি কেবলমাত্র 2 এবং 3 পরিস্থিতিতে পরিবর্তিত হয়।
- উপরের সমস্ত ব্রাউজারগুলিতে সারি সি (প্রস্তাবিত সমাধান) এর পরিবর্তনগুলি অভিন্ন, অর্থাত্ কেবলমাত্র 2 এবং 3 এর জন্য।
ডেমো কোড:
// main function for emulating IE11's "change" event:
function onRangeChange(rangeInputElmt, listener) {
var inputEvtHasNeverFired = true;
var rangeValue = {current: undefined, mostRecent: undefined};
rangeInputElmt.addEventListener("input", function(evt) {
inputEvtHasNeverFired = false;
rangeValue.current = evt.target.value;
if (rangeValue.current !== rangeValue.mostRecent) {
listener(evt);
}
rangeValue.mostRecent = rangeValue.current;
});
rangeInputElmt.addEventListener("change", function(evt) {
if (inputEvtHasNeverFired) {
listener(evt);
}
});
}
// example usage:
var myRangeInputElmt = document.querySelector("input" );
var myRangeValPar = document.querySelector("#rangeValPar" );
var myNumChgEvtsCell = document.querySelector("#numChgEvtsCell");
var myNumInpEvtsCell = document.querySelector("#numInpEvtsCell");
var myNumCusEvtsCell = document.querySelector("#numCusEvtsCell");
var myNumEvts = {input: 0, change: 0, custom: 0};
var myUpdate = function() {
myNumChgEvtsCell.innerHTML = myNumEvts["change"];
myNumInpEvtsCell.innerHTML = myNumEvts["input" ];
myNumCusEvtsCell.innerHTML = myNumEvts["custom"];
};
["input", "change"].forEach(function(myEvtType) {
myRangeInputElmt.addEventListener(myEvtType, function() {
myNumEvts[myEvtType] += 1;
myUpdate();
});
});
var myListener = function(myEvt) {
myNumEvts["custom"] += 1;
myRangeValPar.innerHTML = "range value: " + myEvt.target.value;
myUpdate();
};
onRangeChange(myRangeInputElmt, myListener);
table {
border-collapse: collapse;
}
th, td {
text-align: left;
border: solid black 1px;
padding: 5px 15px;
}
<input type="range"/>
<p id="rangeValPar">range value: 50</p>
<table>
<tr><th>row</th><th>event type </th><th>number of events </th><tr>
<tr><td>A</td><td>standard "change" events </td><td id="numChgEvtsCell">0</td></tr>
<tr><td>B</td><td>standard "input" events </td><td id="numInpEvtsCell">0</td></tr>
<tr><td>C</td><td>new custom "onRangeChange" events</td><td id="numCusEvtsCell">0</td></tr>
</table>
ক্রেডিট:
যদিও এখানে বাস্তবায়নটি মূলত আমার নিজের, এটি এমবিউরনের উত্তরে অনুপ্রাণিত হয়েছিল । এই অন্যান্য উত্তরে পরামর্শ দেওয়া হয়েছিল যে "ইনপুট" এবং "পরিবর্তন" ইভেন্টগুলি একত্রিত করা যেতে পারে এবং ফলাফল কোডটি ডেস্কটপ এবং মোবাইল ব্রাউজার উভয় ক্ষেত্রেই কাজ করবে। যাইহোক, এই উত্তরের কোডটি গোপন "অতিরিক্ত" ইভেন্টগুলিকে বহিষ্কার করার ফলাফল দেয় যা নিজে এবং নিজেই সমস্যাযুক্ত এবং ঘটনাগুলি ব্রাউজারগুলির মধ্যে পৃথক হয়, আরও একটি সমস্যা। আমার বাস্তবায়ন এখানে এই সমস্যাগুলি সমাধান করে।
মূলশব্দ:
জাভাস্ক্রিপ্ট ইনপুট টাইপ পরিসীমা স্লাইডার ইভেন্টগুলি ইনপুট ব্রাউজারের সামঞ্জস্যতা ক্রস-ব্রাউজার ডেস্কটপ মোবাইল নো-জিকুয়েরি পরিবর্তন করে
onchange
আগুন না। সমস্যাটি সমাধান করার সময় আমি এই প্রশ্নটি পেয়েছি।