एक <a> में जावास्क्रिप्ट कोड डालने के विभिन्न तरीकों में क्या अंतर है?


87

मैंने एक <a>टैग में जावास्क्रिप्ट कोड डालने के निम्नलिखित तरीके देखे हैं :

function DoSomething() { ... return false; }
  1. <a href="javascript:;" onClick="return DoSomething();">link</a>
  2. <a href="javascript:DoSomething();">link</a>
  3. <a href="javascript:void(0);" onClick="return DoSomething();">link</a>
  4. <a href="#" onClick="return DoSomething();">link</a>

मैं केवल जावास्क्रिप्ट कोड के बजाय एक वैध URL डालने की कोशिश करने के विचार को समझता हूं, यदि उपयोगकर्ता के पास जावास्क्रिप्ट सक्षम नहीं है। लेकिन इस चर्चा के उद्देश्य के लिए, मुझे यह मानने की आवश्यकता है कि जावास्क्रिप्ट सक्षम है (वे इसके बिना लॉगिन नहीं कर सकते हैं)।

मैं व्यक्तिगत रूप से विकल्प 2 को पसंद करता हूं क्योंकि यह आपको यह देखने की अनुमति देता है कि डिबगिंग के दौरान विशेष रूप से उपयोगी क्या होने वाला है, जहां फ़ंक्शन को पास किया जा रहा है। मैंने इसका काफी उपयोग किया है और ब्राउज़र की समस्या नहीं पाई है।

मैंने पढ़ा है कि लोग 4 की सलाह देते हैं, क्योंकि यह उपयोगकर्ता को अनुसरण करने के लिए एक वास्तविक लिंक देता है, लेकिन वास्तव में, # "वास्तविक" नहीं है। यह बिल्कुल नहीं कहाँ जाएगा।

क्या कोई ऐसा है जो समर्थन नहीं करता है या वास्तव में बुरा है, जब आप जानते हैं कि उपयोगकर्ता ने जावास्क्रिप्ट सक्षम किया है?

संबंधित प्रश्न: जावास्क्रिप्ट लिंक के लिए Href: "#" या "जावास्क्रिप्ट: शून्य (0)"?


छोटा वाक्यविन्यास मुद्दा: चॉइस # 2 होना चाहिए - <a href="javascript:DoSomething();"> लिंक "बिना" वापसी "के
DRosenfeld

कृपया स्वीकृत उत्तर को @eyelidlessness उत्तर में बदलें। मुझे लगता है कि यह सबसे अच्छा तरीका है, क्योंकि यह शब्दार्थ की परवाह करता है।
मीकल पेरोलाकोस्की

जवाबों:


69

मुझे मैट क्रूस का जावास्क्रिप्ट बेस्ट प्रैक्टिस आर्टिकल बहुत पसंद है । इसमें, वह कहता है कि hrefजावास्क्रिप्ट कोड को निष्पादित करने के लिए अनुभाग का उपयोग करना एक बुरा विचार है। यद्यपि आपने कहा है कि आपके उपयोगकर्ताओं के पास जावास्क्रिप्ट सक्षम होना चाहिए, तो कोई कारण नहीं है कि आपके पास एक साधारण HTML पृष्ठ नहीं हो सकता है कि आपके सभी जावास्क्रिप्ट लिंक hrefइस घटना में उनके अनुभाग के लिए इंगित कर सकते हैं कि कोई व्यक्ति लॉग इन करने के बाद जावास्क्रिप्ट को बंद करने के लिए होता है। मैं आपको इस गिरावट तंत्र की अनुमति देने के लिए अत्यधिक प्रोत्साहित करूंगा। ऐसा कुछ "सर्वोत्तम प्रथाओं" का पालन करेगा और अपने लक्ष्य को पूरा करेगा:

<a href="javascript_required.html" onclick="doSomething(); return false;">go</a>

4
स्थिति बार में उपयोगकर्ता को href मान दिखाया जाएगा? (नीचे की तरफ पट्टी) मैं उदाहरण के लिए थोड़ा और उपयोगकर्ता के अनुकूल लिंक का उपयोग करने पर विचार करूंगा। "js.html? doSomething" पेज अभी भी स्थिर html हो सकता है। इस तरह उपयोगकर्ता को स्पष्ट रूप से लिंक के बीच अंतर दिखाई देगा।
जीन

7
आप शीर्षक विशेषता के साथ इस मान को ओवरराइड कर सकते हैं, जैसे <a href="javascript_required.html" title="Does Some" onclick="doSomething(); return false">"> जाएं </a>
Conspicuous Compiler

Javascript_required.html पेज पर अनुरोधों को दर्ज करने और त्रुटि का कारण बनने वाले फ़ंक्शन को लॉग करने के लिए सबसे अच्छा अभ्यास होना चाहिए।
टिमो हुओवेंन

2
क्या आपने एसईओ के परिणामों के बारे में सोचा है?
डैनियलब्लज़केज़

मैट क्रूस का javascripttoolbox.com ऑफलाइन और बिक्री के लिए प्रतीत होता है।
शोदेव

10

जब आप उपयोग कर सकते हैं तो आप ऐसा क्यों करेंगे addEventListener / attachEvent? अगर कोई hrefअसमान नहीं है , तो एक का उपयोग न करें <a>, एक का उपयोग करें <button>और तदनुसार शैली।


9
लिंक के बजाय बटन का उपयोग करना कई मामलों में संभव विकल्प नहीं है।
निकफ

2
क्योंकि यह बदसूरत लगता है। आप लिंक के बगल में एक आइकन जोड़ सकते हैं। वे सभी ब्राउज़रों में समान प्रारूपित करना कठिन है। और आम तौर पर, लोग बटन के बजाय लिंक पर जा रहे हैं - प्रवाह के अधिकांश स्टैक को देखें।
डैरिल हेन

2
यह बदसूरत लग रहा है? यह जैसा चाहे वैसा दिखता है। वास्तव में, मुझे लगता है कि बटन में लिंक की तुलना में वास्तव में अधिक स्टाइल लचीलापन होता है, जिसमें वे इनलाइन होते हैं, लेकिन ठीक से ब्राउज़रों में पैडिंग कर सकते हैं। सीएसएस के संबंध में एक लिंक के साथ कुछ भी किया जा सकता है।
पलकविहीनता

2
स्पैन कीबोर्ड-केंद्रित नहीं हो सकता है।
bobince

3
और बटन (हांफना) शब्दार्थ रूप से सही है। स्पान शब्दार्थ से व्यर्थ है। एक बटन बिल्कुल वही है जो लेखक का उपयोग करने का इरादा है, शब्दार्थ रूप से।
पलकविहीनता

5

आप दूसरी विधि भूल गए:

5: <a href="#" id="myLink">Link</a>

जावास्क्रिप्ट कोड के साथ:

document.getElementById('myLink').onclick = function() {
    // Do stuff.
};

मैं इस पर टिप्पणी नहीं कर सकता कि किस विकल्प का सबसे अच्छा समर्थन है या जो शब्दार्थ में सबसे अच्छा है, लेकिन मैं सिर्फ इतना कहूंगा कि मैं इस शैली को पसंद करता हूं क्योंकि यह आपकी सामग्री को आपके जावास्क्रिप्ट कोड से अलग करता है। यह सभी जावास्क्रिप्ट कोड को एक साथ रखता है, जिसे बनाए रखना बहुत आसान है (विशेषकर यदि आप इसे कई लिंक पर लागू कर रहे हैं), और आप इसे एक बाहरी फाइल में भी रख सकते हैं, जिसे क्लाइंट ब्राउज़र द्वारा फाइल और कैश्ड को कम करने के लिए पैक किया जा सकता है।


7
यदि आपके पास JS के साथ 20 या 30 अलग-अलग लिंक हैं तो यह काफी थकाऊ हो सकता है और बहुत सारे JS के साथ समाप्त हो सकता है।
डैरिल हेन

यह जावास्क्रिप्ट को बदलने के लिए HTML के माध्यम से वैडिंग की तुलना में अधिक थकाऊ नहीं है। ... या आप jQuery जैसी किसी चीज़ का उपयोग कर सकते हैं जो एक साथ कई तत्वों पर घटनाओं को आसानी से बदल सकती है ... $ ('# मेनू a')। क्लिक करें (फ़ंक्शन () {..})
nickf

1
@JKirchartz मैं यह नहीं देखता कि यदि उत्तर के पीछे कारण हैं तो यह कैसे प्रचार कर रहा है। यदि आप प्रश्न पढ़ते हैं, तो यह वास्तव में "इन 4 में से कौन सा सबसे अच्छा है", और मैंने अभी बताया कि एक और विकल्प है जिसे उन्होंने नहीं माना था।
निकफ

एबीसी और डी के बीच चयन करते समय, ट्रोलो की परवाह न करें, कोई ई नहीं चुनता है
JKirchartz

3
@JKirchartz हाँ, मुझे नहीं लगता कि आपको वास्तव में तब स्टैक ओवरफ़्लो का उद्देश्य मिलता है। अगर कोई पूछे कि "कोबोल या फोरट्रान में वेब ऐप बनाना बेहतर है?" उस व्यक्ति को यह बताना स्वीकार्य है कि उन्होंने सभी संभावनाओं पर विचार नहीं किया है। यह सवाल स्पष्ट रूप से नहीं पूछा गया है कि " केवल इन चार चीजों में से कौन सबसे अच्छा है"।
18:12

3
<a href="#" onClick="DoSomething(); return false;">link</a>

मैं यह करूँगा, या:

<a href="#" id = "Link">link</a>
(document.getElementById("Link")).onclick = function() {
    DoSomething();
    return false;
};

दशा पर निर्भर करता है। बड़े ऐप्स के लिए, दूसरा सबसे अच्छा है क्योंकि तब यह आपके ईवेंट कोड को समेकित करता है।


यदि आपके पास JS के साथ 20 या 30 अलग-अलग लिंक हैं तो यह काफी थकाऊ हो सकता है और बहुत सारे JS के साथ समाप्त हो सकता है।
डैरिल हेन

और बग जो आपके कोड में रेंगते हैं वे डीबग करने के लिए बहुत मुश्किल हो सकते हैं। ये बग बहुत आसानी से दिखाई देते हैं, जैसा कि आपके पहले उदाहरण से पता चलता है। :)
निकल

1

विधि # 2 में FF3 और IE7 में एक सिंटैक्स त्रुटि है। मैं विधियों # 1 और # 3 को पसंद करता हूं, क्योंकि # 4 URI को '#' के साथ गंदा करता है, हालांकि कम टाइपिंग का कारण बनता है ... जाहिर है, जैसा कि अन्य प्रतिक्रियाओं से पता चला है, सबसे अच्छा समाधान ईवेंट हैंडलिंग से अलग HTML है।


विधि # 2 का क्या? जब आप उन्हें देखते हैं तो प्रश्न उसी क्रम में नहीं रहते हैं।
डायोडस - जेम्स मैकफर्लेन

यदि आप यह सुनिश्चित करते हैं तो विधि # 4 URI को गड़बड़ नहीं करेगाreturn false । उस कारण से विधि # 4 संभवतः सबसे अच्छी है (सूचीबद्ध लोगों में से)।
Mrr Mrlygsson

2
@ डायोडस, मेरा मानना ​​है कि पियर प्रश्न के भीतर गिने हुए सूची का उल्लेख कर रहा था , जो वास्तव में वहाँ है क्योंकि प्रश्न पहले स्थान पर पोस्ट किया गया था।
पलकविहीनता

1

एक अंतर जो मैंने इस बीच देखा है:

<a class="actor" href="javascript:act1()">Click me</a>

और इस:

<a class="actor" onclick="act1();">Click me</a>

यदि ऐसा है तो किसी भी स्थिति में:

<script>$('.actor').click(act2);</script>

फिर पहले उदाहरण के लिए, act2पहले act1और दूसरे उदाहरण में चलेगा , यह दूसरा तरीका होगा।


1

केवल आधुनिक ब्राउज़र

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(doc){
    var hasClass = function(el,className) {
        return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1;
    }
    doc.addEventListener('click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault();
          doSomething.call(e.target, e);
      }
    });
})(document);

function doSomething(event){
  console.log(this); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me">Button 1</button>
<input class="click-me" type="button" value="Button 2">

</body>
</html>

क्रॉस ब्राउज़र

<!DOCTYPE html>
<html>
<head>
<script type="text/javascript">
(function(doc){
    var cb_addEventListener = function(obj, evt, fnc) {
        // W3C model
        if (obj.addEventListener) {
            obj.addEventListener(evt, fnc, false);
            return true;
        } 
        // Microsoft model
        else if (obj.attachEvent) {
            return obj.attachEvent('on' + evt, fnc);
        }
        // Browser don't support W3C or MSFT model, go on with traditional
        else {
            evt = 'on'+evt;
            if(typeof obj[evt] === 'function'){
                // Object already has a function on traditional
                // Let's wrap it with our own function inside another function
                fnc = (function(f1,f2){
                    return function(){
                        f1.apply(this,arguments);
                        f2.apply(this,arguments);
                    }
                })(obj[evt], fnc);
            }
            obj[evt] = fnc;
            return true;
        }
        return false;
    };
    var hasClass = function(el,className) {
        return (' ' + el.className + ' ').indexOf(' ' + className + ' ') > -1;
    }

    cb_addEventListener(doc, 'click', function(e){
      if(hasClass(e.target, 'click-me')){
          e.preventDefault ? e.preventDefault() : e.returnValue = false;
          doSomething.call(e.target, e);
      }
    });
})(document);

function doSomething(event){
  console.log(this); // this will be the clicked element
}
</script>
<!--... other head stuff ...-->
</head>
<body>

<!--buttons can be used outside of forms https://stackoverflow.com/a/14461672/175071 -->
<button class="click-me">Button 1</button>
<input class="click-me" type="button" value="Button 2">

</body>
</html>

दस्तावेज़ तैयार होने से पहले आप इसे चला सकते हैं, बटन पर क्लिक करने से काम चल जाएगा क्योंकि हम दस्तावेज़ में घटना को संलग्न करते हैं।

सूत्रों का कहना है:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.