इनमें से किसी भी समाधान ने मेरे लिए काम नहीं किया क्योंकि मेरा DOM जटिल है और मेरे पास डायनामिक अनंत स्क्रॉल पृष्ठ हैं, इसलिए मुझे अपना स्वयं का बनाना था।
पृष्ठभूमि: मैं एक निश्चित हेडर और एक तत्व का उपयोग कर रहा हूं जो उपयोगकर्ता द्वारा दूर तक स्क्रॉल करने के बाद उसके नीचे चिपक जाता है। इस तत्व में एक खोज इनपुट फ़ील्ड है। इसके अलावा, मेरे पास आगे और पीछे स्क्रॉल के दौरान गतिशील पृष्ठ जोड़े गए हैं।
समस्या: iOS में, कभी भी उपयोगकर्ता निर्धारित तत्व में इनपुट पर क्लिक करता है, ब्राउज़र पृष्ठ के शीर्ष पर सभी तरह से स्क्रॉल करेगा। इससे न केवल अवांछित व्यवहार हुआ, इसने पृष्ठ के शीर्ष पर मेरे डायनेमिक पेज ऐड को भी ट्रिगर किया।
अपेक्षित समाधान: जब उपयोगकर्ता चिपचिपा तत्व में इनपुट पर क्लिक करता है, तो iOS में कोई भी स्क्रॉल नहीं होता है।
उपाय:
/*Returns a function, that, as long as it continues to be invoked, will not
be triggered. The function will be called after it stops being called for
N milliseconds. If `immediate` is passed, trigger the function on the
leading edge, instead of the trailing.*/
function debounce(func, wait, immediate) {
var timeout;
return function () {
var context = this, args = arguments;
var later = function () {
timeout = null;
if (!immediate) func.apply(context, args);
};
var callNow = immediate && !timeout;
clearTimeout(timeout);
timeout = setTimeout(later, wait);
if (callNow) func.apply(context, args);
};
};
function is_iOS() {
var iDevices = [
'iPad Simulator',
'iPhone Simulator',
'iPod Simulator',
'iPad',
'iPhone',
'iPod'
];
while (iDevices.length) {
if (navigator.platform === iDevices.pop()) { return true; }
}
return false;
}
$(document).on("scrollstop", debounce(function () {
//console.log("Stopped scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'absolute');
$('#searchBarDiv').css('top', yScrollPos + 50 + 'px'); //50 for fixed header
}
else {
$('#searchBarDiv').css('position', 'inherit');
}
}
},250,true));
$(document).on("scrollstart", debounce(function () {
//console.log("Started scrolling!");
if (is_iOS()) {
var yScrollPos = $(document).scrollTop();
if (yScrollPos > 200) { //200 here to offset my fixed header (50px) and top banner (150px)
$('#searchBarDiv').css('position', 'fixed');
$('#searchBarDiv').css('width', '100%');
$('#searchBarDiv').css('top', '50px'); //50 for fixed header
}
}
},250,true));
आवश्यकताएँ: काम करने के लिए JQuery मोबाइल आवश्यक है।
चिपचिपा तत्व द्वारा बनाई गई किसी भी अंतराल को सुचारू करने के लिए वाद-विवाद शामिल है।
IOS10 में परीक्षण किया गया।