अपने लिए इसे हल करने की कोशिश करते हुए, मैंने देखा कि पृष्ठ के स्क्रॉलिंग को बनाए रखना संभव है और इनपुट के फ़ोकस को बनाए रखना है जबकि पकड़े गए इवेंट के मूल तत्व पर फिर से आग लगाने का प्रयास करके नंबर परिवर्तन को अक्षम करना, जिस <input type="number"/>
पर इसे पकड़ा गया था। , बस इस तरह से:
e.target.parentElement.dispatchEvent(e);
हालाँकि, यह ब्राउज़र कंसोल में त्रुटि का कारण बनता है, और संभवतः हर जगह काम करने की गारंटी नहीं है (मैं केवल फ़ायरफ़ॉक्स पर परीक्षण किया गया), क्योंकि यह जानबूझकर अमान्य कोड है।
एक अन्य समाधान जो कम से कम फ़ायरफ़ॉक्स और क्रोमियम पर अच्छी तरह से काम करता है, अस्थायी रूप से इस तरह से <input>
तत्व बनाने के लिए है readOnly
:
function handleScroll(e) {
if (e.target.tagName.toLowerCase() === 'input'
&& (e.target.type === 'number')
&& (e.target === document.activeElement)
&& !e.target.readOnly
) {
e.target.readOnly = true;
setTimeout(function(el){ el.readOnly = false; }, 0, e.target);
}
}
document.addEventListener('wheel', function(e){ handleScroll(e); });
एक साइड इफ़ेक्ट जो मैंने देखा है, वह यह है कि यदि आप फ़ील्ड के लिए अलग-अलग स्टाइल रखते readOnly
हैं, तो स्प्लिट-सेकंड के लिए फ़ील्ड फ़्लिकर कर सकता है , लेकिन कम से कम मेरे मामले के लिए, यह एक मुद्दा नहीं लगता है।
इसी तरह, (जैसा कि जेम्स के उत्तर में समझाया गया है) readOnly
संपत्ति को संशोधित करने के बजाय , आप blur()
क्षेत्र और फिर focus()
इसे वापस कर सकते हैं , लेकिन फिर, उपयोग में शैलियों के आधार पर, कुछ टिमटिमा सकता है।
वैकल्पिक रूप से, जैसा कि यहां अन्य टिप्पणियों में बताया गया है, आप केवल preventDefault()
इसके बजाय घटना पर कॉल कर सकते हैं । यह मानते हुए कि आप केवल wheel
उन संख्याओं की घटनाओं को संभालते हैं, जो फोकस में हैं और माउस कर्सर के तहत (जो कि तीन स्थितियों से ऊपर है), उपयोगकर्ता के अनुभव पर नकारात्मक प्रभाव किसी के भी करीब नहीं होगा।