मैं प्रोग्राम को एंकर टैग से ऑनक्लिक फ़ंक्शन में 'यह' संदर्भ रखते हुए प्रोग्रामिकली (ऑनकिक) घटना को कैसे लागू कर सकता हूं?


83

निम्नलिखित काम नहीं करता है ... (कम से कम फ़ायरफ़ॉक्स document.getElementById('linkid').click()में नहीं : एक फ़ंक्शन नहीं है)

<script type="text/javascript">
    function doOnClick() {
        document.getElementById('linkid').click();
        //Should alert('/testlocation');
    }
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>

जवाबों:


110

आपको applyउस तत्व के संदर्भ में ईवेंट हैंडलर की आवश्यकता है :

var elem = document.getElementById("linkid");
if (typeof elem.onclick == "function") {
    elem.onclick.apply(elem);
}

अन्यथा thisसंदर्भ को संदर्भित करेगा उपरोक्त कोड में निष्पादित किया गया है।


3
मुझे लगता है कि आप केवल एक मूर्ख के रूप में मुझे नहीं देख रहे हैं (ब्रैकेट संकेतन / ओनलाइन का उल्लेख नहीं करने के लिए) ब्राउज़र असंगतता पर क्लिक करें)। सटीक!
रोपस्टाह

3
इस पर विचार करें: howtocreate.co.uk/tutorials/javascript/domevents - ऑनक्लिक फ़ंक्शन को कॉल करने से सभी ईवेंट हैंडलर पंजीकृत हो जाएंगे ? साथ ही, किसी घटना को गलत तरीके से लागू करने से उस घटना से जुड़ी डिफ़ॉल्ट कार्रवाई नहीं होगी (जैसे कि फॉर्म सबमिट करना)।
जहरथथ

Gumbo, जैसा कि यह कोड -different- परिणाम का उत्पादन करता है, यह अभी भी Microsoft.Ajax और Microsoft.AjaxMvc पुस्तकालयों के साथ काम नहीं करता है ....
Ropstah

1
apply()यहाँ क्यों उपयोग करें? आप बस कर सकते हैं elem.onclick();, और elemफ़ंक्शन में 'यह' संदर्भ होगा - सरल!
चल रहा

19

इसे हल करने का सबसे अच्छा तरीका वेनिला जेएस का उपयोग करना है, लेकिन यदि आप पहले से ही jQuery का उपयोग कर रहे हैं, तो बहुत आसान समाधान है:

<script type="text/javascript">
    function doOnClick() {
        $('#linkid').click();
    }
</script>
<a id="linkid" href="/testlocation" onclick="alert(this.href);">Testlink</a>

IE8-10, क्रोम, फ़ायरफ़ॉक्स में परीक्षण किया गया।


3
डाउनवोट क्यों? कृपया एक कारण टिप्पणी करें, इसलिए मैं अपने प्रश्न में सुधार कर सकता हूं यदि आप मानते हैं कि कुछ गलत है।
लुसचन

1
स्टैकओवरफ़्लो पर यह कहा गया है कि आपको ऐसे उत्तर नहीं देने चाहिए जो किसी बाहरी संसाधन (जैसे कि jQuery जैसी लाइब्रेरी) पर निर्भर करता हो, यदि ओपी ने स्पष्ट रूप से इस प्रश्न पर इसका उल्लेख नहीं किया है, तो मुझे लगता है कि यह
डाउनवोट

2013 में वापस, हर कोई jquery का उपयोग कर रहा था - लेकिन आजकल, मैं सहमत होगा :) - मैं भविष्य के संदर्भ के लिए उत्तर को हालांकि रखूंगा।
luschn

15

किसी ईवेंट को ट्रिगर करने के लिए आप मूल रूप से ईवेंट हैंडलर को उस तत्व के लिए कॉल करते हैं। अपने कोड से थोड़ा परिवर्तन।

var a = document.getElementById("element");
var evnt = a["onclick"];

if (typeof(evnt) == "function") {
    evnt.call(a);
}

1
+1। इसके अलावा, थोड़ा गुगली से पता चलता है कि foo.click () केवल IE है, निश्चित रूप से मैं गलत हो सकता है ...
karim79

1
आपको ब्रैकेट नोटेशन (["ऑनक्लिक"]) के बजाय डॉट नोटेशन (.onclick) का उपयोग करना चाहिए।
रूड ज़्वोलिंस्की

.onclick () या .click () दोनों अपेक्षित रूप से काम नहीं करते हैं। फ़ायरफ़ॉक्स में .click (या ['क्लिक करें]) "यह एक फ़न नहीं है"। लेकिन फोन करते समय .onclick () आप "इस" संदर्भ को खो देते हैं (मुझे ASP.NET MVC में इसकी आवश्यकता है क्योंकि निष्पादन कार्य में <a> टैग से जानकारी आवश्यक है)
रोपस्टा

5
$("#linkid").trigger("click");

2
एसओ में आपका स्वागत है। क्या आप इस बारे में विस्तार से बता सकते हैं कि यह क्यों काम करता है (वास्तव में यह क्या करता है, आदि) और क्या यह अन्य समाधानों से अलग है?
m00am

2
नीचे इस उत्तर को क्यों चिह्नित करें? यदि आप jquery का उपयोग करते हैं तो यह इस पृष्ठ पर सबसे अच्छा समाधान है ... एक लाइनर - कि हरा नहीं कर सकता!
पॉडटेक

1
उत्तर में jQuery की आवश्यकता नहीं होनी चाहिए
ग्रेग पेरहम

5

दी, ओपी ने कहा कि यह काम नहीं किया, लेकिन यह मेरे लिए किया था। मेरे स्रोत में नोटों के आधार पर, ऐसा लगता है कि यह ओपी के समय के बाद या उसके आसपास लागू किया गया था। शायद अब यह अधिक मानक है।

document.getElementsByName('MyElementsName')[0].click();

मेरे मामले में, मेरे बटन में एक आईडी नहीं थी। यदि आपके तत्व में एक आईडी है, तो अधिमानतः निम्नलिखित (अप्रयुक्त) का उपयोग करें।

document.getElementById('MyElementsId').click();

मैंने मूल रूप से इस विधि की कोशिश की और यह काम नहीं किया। Googling के बाद मैं वापस आया और महसूस किया कि मेरा तत्व नाम से था, और उसके पास कोई आईडी नहीं थी। दोहरा चेक आप सही विशेषता कह रहे हैं।

स्रोत: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/click


1

हैंडल विधि पर एक नजर डालें
https://developer.mozilla.org/en-US/docs/Web/API/EventListener

"रॉ" जावास्क्रिप्ट:

function MyObj() {
   this.abc = "ABC";
}
MyObj.prototype.handleEvent = function(e) {
   console.log("caught event: "+e.type);
   console.log(this.abc);
}

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj);

अब अपने तत्व पर क्लिक करें (आईडी "myElement" के साथ) और इसे कंसोल में निम्नलिखित प्रिंट करना चाहिए:

पकड़ा घटना:
एबीसी पर क्लिक करें

यह आपको इवेंट हैंडलर के रूप में एक ऑब्जेक्ट विधि की अनुमति देता है, और उस पद्धति में सभी ऑब्जेक्ट गुणों तक पहुंच है।

आप सीधे AddEventListener (जैसे:) को जोड़ने के लिए किसी ऑब्जेक्ट की एक विधि पारित नहीं कर सकते हैंelement.addEventListener('click',myObj.myMethod); और इस तरह myMethodसे कार्य करने की अपेक्षा करेंगे जैसे कि मुझे सामान्य रूप से ऑब्जेक्ट पर बुलाया गया था। मैं अनुमान लगा रहा हूं कि addEventListener को दिए गए किसी भी फ़ंक्शन को संदर्भित किए जाने के बजाय किसी तरह कॉपी किया गया है। उदाहरण के लिए, यदि आप addEventListener (एक चर के रूप में) में एक ईवेंट श्रोता फ़ंक्शन संदर्भ पास करते हैं, तो इस संदर्भ को अनसेट करें, ईवेंट श्रोता अभी भी निष्पादित किया जाता है जब ईवेंट पकड़े जाते हैं।

ईवेंट श्रोता और स्टिल के रूप में एक विधि को पारित करने के लिए एक और (कम सुरुचिपूर्ण) वर्कअराउंड thisऔर अभी भी इवेंट श्रोता के भीतर ऑब्जेक्ट प्रॉपर्टी की पहुंच कुछ इस तरह होगी:

// see above for definition of MyObj

var myObj = new MyObj();

document.querySelector("#myElement").addEventListener('click', myObj.handleEvent.bind(myObj));

1

पुराना धागा, लेकिन सवाल अभी भी प्रासंगिक है, इसलिए ...

(१) आपके प्रश्न में उदाहरण अब फ़ायरफ़ॉक्स में काम नहीं करता है । हालाँकि, ईवेंट हैंडलर (जो एक अलर्ट प्रदर्शित करता है) को कॉल करने के अलावा, यह ALSO लिंक पर क्लिक करता है, जिससे नेविगेशन (एक बार अलर्ट खारिज होने पर) हो जाता है।

(2) करने के लिए महज ईवेंट हैंडलर (नेविगेशन ट्रिगर किए बिना) कहते हैं केवल बदल देते हैं:

document.getElementById('linkid').click();

साथ में

document.getElementById('linkid').onclick();

0

यदि आप इस विशुद्ध रूप से onclick विशेषता में फ़ंक्शन को संदर्भित करने के लिए उपयोग कर रहे हैं, तो यह एक बहुत बुरा विचार है। इनलाइन घटनाओं सामान्य रूप से एक बुरा विचार है।

मैं निम्नलिखित सुझाव दूंगा:

function addEvent(elm, evType, fn, useCapture) {
    if (elm.addEventListener) {
        elm.addEventListener(evType, fn, useCapture);
        return true;
    }
    else if (elm.attachEvent) {
        var r = elm.attachEvent('on' + evType, fn);
        return r;
    }
    else {
        elm['on' + evType] = fn;
    }
}

handler = function(){
   showHref(el);
}

showHref = function(el) {
   alert(el.href);
}

var el = document.getElementById('linkid');

addEvent(el, 'click', handler);

यदि आप अन्य जावास्क्रिप्ट कोड से एक ही फ़ंक्शन को कॉल करना चाहते हैं, तो फ़ंक्शन को कॉल करने के लिए एक क्लिक का अनुकरण करना सबसे अच्छा तरीका नहीं है। विचार करें:

function doOnClick() {
   showHref(document.getElementById('linkid'));
}

यह 'इस' के संदर्भ को रखने के बारे में है। मैं एंकर (.NET MVC) में पूरी तरह से ऑनक्लिक भाग उत्पन्न नहीं कर सकता। मुझे पूरा एंकर टैग जेनरेट करना होगा। यह टैग पूरी तरह से ऑनक्लिक फ़ंक्शन द्वारा आवश्यक है (उदाहरण के लिए यह href विशेषता का उपयोग करता है)।
रोपस्टाह

-1

सामान्य तौर पर मैं इवेंट हैंडलर को 'मैन्युअल रूप से' कॉल करने की सलाह दूंगा।

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

बेहतर यह पता लगाना है कि आप वास्तव में क्या करना चाहते हैं, इसे फ़ंक्शन में रखें और मैन्युअल रूप से कॉल करें और इसे इवेंट श्रोता के रूप में पंजीकृत करें।


ओपी ने पूछा कि कैसे कुछ करना है, न कि कुछ करने का सबसे अच्छा तरीका है। यह CodeReview नहीं है। यदि आपने उसके प्रश्न का उत्तर दिया था और फिर अस्वीकरण रखा, तो वह अलग होगा।
टायलर मोंटेनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.