सारांश:
मैं यहाँ एक j-jQuery क्रॉस-ब्राउज़र डेस्कटॉप-एंड-मोबाइल की क्षमता प्रदान करता हूं, जो कि वर्तमान ब्राउज़र / रेंज इंटरैक्शन का लगातार जवाब देने की क्षमता है, जो वर्तमान ब्राउज़रों में संभव नहीं है। यह अनिवार्य रूप से सभी ब्राउज़रों को on("change"...
उनके on("change"...
या on("input"...
घटनाओं के लिए IE11 की घटना का अनुकरण करने के लिए मजबूर करता है । नया कार्य है ...
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
आपका श्रोता है। श्रोता को किसी भी इंटरैक्शन के बाद बुलाया जाएगा जो रेंज / स्लाइडर मूल्य को बदलता है, लेकिन उन इंटरैक्शन के बाद नहीं जो उस मूल्य को नहीं बदलते हैं, जिसमें वर्तमान स्लाइडर स्थिति में प्रारंभिक माउस या टच इंटरैक्शन शामिल हैं या स्लाइडर के दोनों छोर को बंद करने पर।
संकट:
जून 2016 की शुरुआत में, विभिन्न ब्राउज़र इस बात के संदर्भ में भिन्न हैं कि वे रेंज / स्लाइडर के उपयोग पर कैसे प्रतिक्रिया देते हैं। पांच परिदृश्य प्रासंगिक हैं:
- वर्तमान स्लाइडर स्थिति में प्रारंभिक माउस-डाउन (या टच-स्टार्ट)
- एक नए स्लाइडर स्थिति में प्रारंभिक माउस-डाउन (या टच-स्टार्ट)
- स्लाइडर के साथ 1 या 2 के बाद किसी भी बाद में माउस (या स्पर्श) आंदोलन
- स्लाइडर के 1 या 2 अतीत के बाद किसी भी बाद में माउस (या स्पर्श) आंदोलन
- अंतिम माउस-अप (या टच-एंड)
निम्न तालिका से पता चलता है कि कम से कम तीन अलग-अलग डेस्कटॉप ब्राउज़र उनके व्यवहार में भिन्न होते हैं जिनके संबंध में वे उपरोक्त परिदृश्यों में से किसके प्रति प्रतिक्रिया करते हैं:
उपाय:
onRangeChange
समारोह रेंज / स्लाइडर बातचीत के लिए एक सुसंगत और उम्मीद के मुताबिक क्रॉस-ब्राउज़र प्रतिक्रिया प्रदान करता है। यह सभी ब्राउज़रों को निम्न तालिका के अनुसार व्यवहार करने के लिए मजबूर करता है:
IE11 में, कोड अनिवार्य रूप से यथास्थिति के अनुसार सब कुछ संचालित करने की अनुमति देता है, अर्थात यह "change"
घटना को अपने मानक तरीके से कार्य करने की अनुमति देता है और यह "input"
घटना अप्रासंगिक है क्योंकि यह कभी भी आग नहीं लगाती है। अन्य ब्राउज़रों में, "change"
घटना को प्रभावी ढंग से चुप कराया जाता है (गोलीबारी से अतिरिक्त और कभी-कभी आसानी से स्पष्ट घटनाओं को रोकने के लिए)। इसके अलावा, "input"
ईवेंट श्रोता को तब ही फायर करता है जब रेंज / स्लाइडर का मान बदलता है। कुछ ब्राउज़रों (जैसे फ़ायरफ़ॉक्स) के लिए यह होता है क्योंकि श्रोता प्रभावी रूप से उपरोक्त सूची से 1, 4 और 5 परिदृश्यों में चुप हो जाता है।
(आप वास्तव में एक श्रोता की आवश्यकता होती है या तो परिदृश्य 1, 4 और / या 5 आप को शामिल की कोशिश कर सकते में सक्रिय होने के लिए "mousedown"
/ "touchstart"
, "mousemove"
/ "touchmove"
और / या "mouseup"
/ "touchend"
घटनाओं। इस तरह के एक समाधान इस उत्तर के दायरे से बाहर है।)
मोबाइल ब्राउज़रों में कार्यक्षमता:
मैंने इस कोड को डेस्कटॉप ब्राउज़रों में परीक्षण किया है, लेकिन किसी भी मोबाइल ब्राउज़र में नहीं। हालांकि, इस पृष्ठ पर एक अन्य उत्तर में एमबीउरने ने दिखाया है कि मेरा समाधान यहां "... मुझे मिल सकने वाले प्रत्येक ब्राउज़र में काम करता है (जीत डेस्कटॉप: IE, क्रोम, ओपेरा, एफएफ; एंड्रॉइड क्रोम, ओपेरा और एफएफ, आईओएस सफारी) ” । (धन्यवाद एमबीउरन।)
उपयोग:
इस समाधान का उपयोग करने के लिए, 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) को निकाल दिया गया है। इस स्निपेट को विभिन्न ब्राउज़रों में चलाते समय, निम्न पर ध्यान दें, जब आप रेंज / स्लाइडर के साथ बातचीत करते हैं:
- IE11 में, पंक्तियों A और C में मान परिदृश्य 2 में परिवर्तन करते हैं और ऊपर 2 जबकि पंक्ति B कभी नहीं बदलता है।
- Chrome और Safari में, पंक्तियों B और C में मान परिदृश्य 2 और 3 में बदलते हैं जबकि पंक्ति A केवल परिदृश्य 5 के लिए परिवर्तित होती है।
- फ़ायरफ़ॉक्स में, पंक्ति A में मान केवल परिदृश्य 5 के लिए बदलता है, पंक्ति B सभी पाँच परिदृश्यों के लिए बदलता है, और पंक्ति C केवल परिदृश्य 2 और 3 के लिए बदलता है।
- उपरोक्त सभी ब्राउज़रों में, पंक्ति C (प्रस्तावित समाधान) में परिवर्तन समान हैं, अर्थात केवल परिदृश्य 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>
क्रेडिट:
जबकि यहां कार्यान्वयन काफी हद तक मेरा अपना है, यह एमबीउरने के जवाब से प्रेरित था । उस दूसरे उत्तर ने सुझाव दिया कि "इनपुट" और "परिवर्तन" घटनाओं को मर्ज किया जा सकता है और इसके परिणामस्वरूप कोड डेस्कटॉप और मोबाइल ब्राउज़र दोनों में काम करेगा। हालाँकि, उस उत्तर की कोड में छिपी हुई "अतिरिक्त" घटनाओं को निकाल दिया जाता है, जो कि अपने आप में समस्याग्रस्त है, और गोलीबारी की गई घटनाएँ ब्राउज़र, एक और समस्या के बीच भिन्न होती हैं। यहां मेरा कार्यान्वयन उन समस्याओं को हल करता है।
कीवर्ड:
जावास्क्रिप्ट इनपुट टाइप रेंज स्लाइडर ईवेंट्स इनपुट ब्राउज़र कॉम्पेटिबिलिटी क्रॉस-ब्राउज़र डेस्कटॉप मोबाइल नं-jQuery
onchange
आग नहीं करता है। यह समस्या का निवारण करने में था कि मुझे यह प्रश्न मिला।