बस button का उपयोग करें
(gomakethings.com)- वेब इंटरफ़ेस में
की जगहका उपयोग करना accessibility और functionality दोनों के लिहाज़ से सही विकल्प है - `` को screen reader interactive element के रूप में नहीं पहचानते, और यह keyboard focus या
Enter,Spacebarइनपुट पर भी प्रतिक्रिया नहीं देता [role="button"]या[tabindex="0"]attributes जोड़ने पर भी focus order की गड़बड़ी और keyboard event handling की समस्या बनी रहती है- इन समस्याओं को हल करने के लिए कई event listeners और conditional statements जोड़ना अनावश्यक जटिलता पैदा करता है
- `` accessibility, focus, और keyboard input handling की सुविधाएँ डिफ़ॉल्ट रूप से देता है, इसलिए यह सरल और standard समाधान है
गलत तरीका: `` से button बनाना
- React या HTMX उपयोगकर्ताओं के बीच `` के रूप में modal खोलने जैसी interactions लागू करने के उदाहरण बहुत मिलते हैं
- उदाहरण कोड:
Open Modal
- उदाहरण कोड:
- इस तरीके की समस्याएँ
- screen reader इस element को interactive element के रूप में नहीं पहचानते
- keyboard से focus ले जाना संभव नहीं होता
- केवल
clickevent चलता है,EnterयाSpacebarइनपुट पर प्रतिक्रिया नहीं होती
accessibility “ठीक” करने की कोशिशों की सीमाएँ
[role="button"]attribute जोड़ने से screen reader पहचान की समस्या तो हल हो जाती है, लेकिन focusability और keyboard input handling की समस्या फिर भी बनी रहती है[tabindex="0"]जोड़कर focus संभव बनाया जा सकता है, लेकिन focus order बिगड़ने या अप्रत्याशित रूप से focus move होने का जोखिम रहता है- keyboard input को संभालने के लिए
keydownevent को global (document) पर register करना पड़ता है, औरEnterया' '(space) key को detect करके focused element को ढूँढकर चलाना पड़ता हैdocument.addEventListener('keydown', (event) => { if (event.key !== 'Enter' && event.key !== ' ') return; const notRealBtn = document.activeElement.closest('[onclick]'); if (!notRealBtn) return; // 실행 코드 }); - नतीजे में, `` जो सुविधाएँ डिफ़ॉल्ट रूप से देता है, उन्हीं को जटिल तरीके से दोबारा लागू किया जाता है
`` द्वारा दी जाने वाली डिफ़ॉल्ट सुविधाएँ
- `` element अपने आप निम्नलिखित को support करता है
- implicit role (
[role="button"]) - automatic focusability
- focus की स्थिति में
EnterऔरSpacebarइनपुट परclickevent trigger होना
- implicit role (
- यही behavior
में लागू करने के लिए **कई attributes और scripts की ज़रूरत** पड़ती है, जबकिसे यह एक ही लाइन में हो जाता हैOpen Modal
निष्कर्ष: सादगी ही सबसे अच्छा विकल्प है
- `` accessibility standards को पूरा करते हुए code की मात्रा कम करने का सबसे सरल तरीका है
- अनावश्यक event handling या attributes जोड़े बिना standard HTML elements का उपयोग करना maintenance और efficiency दोनों के लिए बेहतर है
- “जितने आलसी developer होंगे, उन्हें उतना ही सही element इस्तेमाल करना चाहिए” — यह संदेश अनावश्यक जटिलता से बचने और built-in features का उपयोग करने वाली development आदतों के महत्व पर ज़ोर देता है
7 टिप्पणियां
बहुत अच्छा लेख है। इसके मुख्य संदेश को "HTML tag का अर्थपूर्ण तरीके से इस्तेमाल करें." के रूप में संक्षेपित किया जा सकता है। अगर
div(या किसी अन्य) tag से click event दिया जाता है, तो मुझे लगता है कि यह उस पुराने दौर से बिल्कुल अलग नहीं है जब layouttabletag से बनाया जाता था।बिलकुल,
aria-*attributes डालने से बात ज़्यादा साफ़ हो सकती है, लेकिन इतनी मेहनत करने से बेहतर है कि सीधे सही tag इस्तेमाल कर लो हाहाहायादें ताज़ा हो गईं हाहा
button का इस्तेमाल करें
background, border, outline, appearance, -webkit-appearance, cursor
ओवरराइड करनी पड़ने वाली default stylesheet बहुत ज़्यादा हैं, रोना आता है
इसीलिए CSS Reset होता है।
हमारे देश की सरकारी वेबसाइटों में `` का बहुत इस्तेमाल होता है...
Hacker News राय
मेरी शिकायतों में से एक यह है कि वेबसाइटें नेविगेशन को
onclickhandler से लागू करती हैं बस `` tag का इस्तेमाल करें, तो नया tab खोलना, accessibility devices के साथ integration, right-click menu आदि सब अपने-आप सही काम करते हैं अगर यह नेविगेशन है, तो JavaScript soup की जगह link का इस्तेमाल करना चाहिएonClickसे किया गया है जो elements असल में link हैं, उन्हें भी click handler से संभाला जा रहा है, जो मेरी समझ से बाहर हैज़्यादातर buttons में
type="button"साफ़-साफ़ लिखना चाहिए default valuesubmitहोती है, इसलिए form के अंदर होने पर वह अपने-आप submit हो जाता है शायद कुछ developers यह नहीं जानते, इसलिए `` का इस्तेमाल करते हैंके बराबर है औरअलग हैइस्तेमाल करने से `type="submit"` वाली समस्या से बचा जा सकता हैशुरू से खाली होता है, इसलिए ज़रूरत की functionality ही जोड़ी जाती है, और बाद में बदलना भी आसान होता है वहीं `` का default behavior समझने के लिए documentation देखनी पड़ती है आख़िरकार यह explicit control vs built-in features के बीच चुनाव का मामला हैअच्छा होता अगर लेख को “जिस काम के लिए HTML element बना है, उसी काम के लिए उसका इस्तेमाल करें” इस दिशा में और बढ़ाया जाता कई SPA developers को HTML elements का semantics ठीक से पता नहीं होता, इसलिए वे हर बार पहिया फिर से बना देते हैं
आजकल ऐसी पीढ़ी आ गई है जो clickable area ढूँढने के लिए स्क्रीन पर इधर-उधर दबाती फिरती है 10 साल पहले किसी ने link drag को text selection से ज़्यादा अहम बना दिया, और अब text select करना लगभग नामुमकिन हो गया है इसे ठीक करने के लिए शायद browser fork करना पड़े
Chrome की default stylesheet में
button {align-items: flex-start}होने की वजह से मैं flexbox sizing bug में काफ़ी देर तक उलझा रहा फिर भी मैं जहाँ तक संभव हो सही HTML elements का इस्तेमाल करने की कोशिश करता हूँ, लेकिन छोटे side projects में कभी-कभी `` ज़्यादा आसान लगता हैappearance: noneproperty button styling reset करने में काम आती है मैं.unbuttonifyclass बनाता हूँ ताकि वह button की तरह काम करे लेकिन दिखे अलग तरह सेजहाँ तक हो सके, elements का इस्तेमाल उनके मूल उद्देश्य के अनुसार करना चाहिए
button को लेकर मेरी दो शिकायतें हैं एक तो यह कि आपको वैसे भी styling फिर से करनी पड़ती है, दूसरी यह चेतावनी कि buttons को nest नहीं किया जा सकता व्यवहार में यह काफ़ी बार सामने आ जाता है
LLM अक्सर ऐसे गलत patterns generate करते हैं वे browser की built-in functionality को नज़रअंदाज़ करके चीज़ों को बेवजह जटिल बना देते हैं मैं अक्सर Claude से कहता हूँ कि ऐसे code को simplify करे TypeScript में भी error handling को अजीब बनाने की प्रवृत्ति होती है
मैं जहाँ तक संभव हो default रूप से button का इस्तेमाल करता हूँ लेकिन अगर चीज़ को असल में link की तरह काम करना है, तो `` tag इस्तेमाल करता हूँ
मैं सोच रहा था कि आखिर `` इस्तेमाल करने की राय आती ही क्यों है