जांचें कि क्या घटना मानव द्वारा ट्रिगर की गई है


140

मेरे पास एक हैंडलर एक घटना से जुड़ा हुआ है और मैं इसे केवल तभी निष्पादित करना चाहूंगा जब यह एक मानव द्वारा ट्रिगर किया गया हो, और ट्रिगर () विधि द्वारा नहीं। मैं अंतर कैसे बताऊं?

उदाहरण के लिए,

$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

जवाबों:


212

आप देख सकते हैं e.originalEvent: यदि यह परिभाषित है कि क्लिक मानव है:

फिडल को देखें http://jsfiddle.net/Uf8Wv/

$('.checkbox').change(function(e){
  if (e.originalEvent !== undefined)
  {
    alert ('human');
  }
});

फिडेल में मेरा उदाहरण:

<input type='checkbox' id='try' >try
<button id='click'>Click</button>

$("#try").click(function(event) {
    if (event.originalEvent === undefined) {
        alert('not human')
    } else {
        alert(' human');
    }


});

$('#click').click(function(event) {
    $("#try").click();
});

1
@ निकोला क्या यह कहीं भी प्रलेखित है?
15इम विद

@ मुझे पता नहीं है, लेकिन मुझे लगता है कि यह मानक है। यहाँ देखें: api.jquery.com/category/events/event-object
निकोला पेलुचेती

@ निकोला मैं देख रहा हूं, यह एक jQuery की बात है। jQuery इस संपत्ति के अंदर मूल ईवेंट ऑब्जेक्ट संग्रहीत करता है। Btw, तुम्हारा मतलब क्या है तुम नहीं जानते? आपने बस प्रलेखन के लिए लिंक प्रदान किया:)
providedटाइम विडज़ जूल

1
लगता है आप भी उपयोग कर सकते हैंevent.isTrigger
एविलाइवा

1
@ अनुराग, मैं अभी उसी मुद्दे पर चल रहा था। ऐसा लगता है कि originalEventजब घटना चालू हो जाती है तो jQuery पॉप्युलेट करता है DOM.click(), लेकिन आप उपयोग कर सकते हैं $($("#try")[0]).click();, जो क्लंकी है, लेकिन काम करता है।
डैनियल गैरेट

19

ऊपर से अधिक सीधा होगा:

$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

यह सबसे अच्छा जवाब है। स्पष्टीकरण के लिए, देखें: stackoverflow.com/questions/10704168/…
jaredjacobs

3
हालांकि यह प्रलोभन है और शायद व्यवहार में आरामदायक है, ध्यान दें कि jQuery डेवलपर्स इस समय के रूप मेंisTrigger सार्वजनिक एपीआई में स्नातक नहीं करना चाहते हैं ।
जॉन

7

मुझे लगता है कि ऐसा करने का एकमात्र तरीका प्रलेखन केtrigger अनुसार कॉल पर एक अतिरिक्त पैरामीटर में पारित करना होगा ।

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

उदाहरण: http://jsfiddle.net/wG2KY/


1
आप घटना के मूल गुण को देख सकते हैं: यदि घटना एक क्लिक से नहीं आती है, तो यह अपरिभाषित है
निकोला पेलुचेती


1
किसी कारण के लिए event.originalEvent मेरे लिए काम नहीं कर रहा था (सिर्फ 1 को पीछे हटा रहा था) जब Zepto के 'क्लिक' हैंडलर का उपयोग कर रहा था। इसलिए मैंने ऊपर के समाधान की कोशिश की। एक जादू की तरह काम किया।
लैरीडिक्स

7

स्वीकृत जवाब मेरे काम नहीं आया। 6 साल हो गए हैं और तब से jQuery बहुत बदल गया है।

उदाहरण के लिए event.originalEventहमेशा truejQuery 1.9.x के साथ रिटर्न। मेरा मतलब है कि वस्तु हमेशा मौजूद है लेकिन सामग्री अलग है।

जो लोग jQuery के नए संस्करणों का उपयोग करते हैं, वे इसे आज़मा सकते हैं। Chrome, Edge, IE, Opera, FF पर काम करता है

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) {
    //Hey hooman it is you
}

3

वर्तमान में अधिकांश ब्राउज़र event.isTrusted का समर्थन करते हैं :

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

से डॉक्स :

IsTrusted केवल पढ़ने के लिए की संपत्ति Eventइंटरफेस है एक Boolean यह है कि सच जब घटना एक उपयोगकर्ता कार्रवाई करने से उत्पन्न हुआ है, और झूठी जब घटना बनाया गया था या एक स्क्रिप्ट द्वारा संशोधित या के माध्यम से भेजा EventTarget.dispatchEvent ()


0

आप माउस क्लिक बनाम ट्रिगर () कॉल का पता लगाने के लिए ऑनमेडाउन का उपयोग कर सकते हैं।


मैं निम्नलिखित परिदृश्य पर काम नहीं कर सकता: कभी-कभी टैब कुंजी का उपयोग करके पृष्ठ के तत्वों का चयन करना संभव है। उदाहरण के लिए, अगर मैंने इस तरह से एक चेकबॉक्स चुना है, तो मैं अंतरिक्ष कुंजी का उपयोग करके चेक / अनचेक कर सकता हूं। या नीचे तीर कुंजी का उपयोग करके एक ड्रॉडपैड भी खोलें।
डिएगो फेवरो

0

मैं एक संभावना के बारे में सोचूंगा जहां आप माउस की स्थिति की जांच करेंगे, जैसे:

  • क्लिक करें
  • माउस स्थिति प्राप्त करें
  • बटन के तार को ओवरलैप करता है
  • ...

मैं निम्नलिखित परिदृश्य पर काम नहीं कर सकता: कभी-कभी टैब कुंजी का उपयोग करके पृष्ठ के तत्वों का चयन करना संभव है। उदाहरण के लिए, अगर मैंने इस तरह से एक चेकबॉक्स चुना है, तो मैं अंतरिक्ष कुंजी का उपयोग करके चेक / अनचेक कर सकता हूं। या नीचे तीर कुंजी का उपयोग करके एक ड्रॉडपैड भी खोलें।
डिएगो फेवरो

0

आप अपने सभी कोड का नियंत्रण है, की $(input).focus()तुलना में कोई विदेशी कॉल setFocus()

वैश्विक चर का उपयोग करना मेरे लिए एक सही तरीका है।

var globalIsHuman = true;

$('input').on('focus', function (){
    if(globalIsHuman){
        console.log('hello human, come and give me a hug');
    }else{
        console.log('alien, get away, i hate you..');
    }
    globalIsHuman = true;
});

// alien set focus
function setFocus(){
    globalIsHuman = false;
    $('input').focus();
}
// human use mouse, finger, foot... whatever to touch the input

अगर कुछ एलियन अभी भी $(input).focus()दूसरे ग्रह से कॉल करना चाहते हैं। सौभाग्य या अन्य उत्तर की जाँच करें


यह केवल लोगों को कॉल करने से रोकता है setFocus()- यह लोगों को फ़ोकस इवेंट को ट्रिगर करने से नहीं रोकता है। बिल्कुल नहीं लिखना setFocus()भी लोगों को इसे कॉल करने से नहीं रोकेगा, इसलिए मुझे इसका फायदा नहीं दिखता। वास्तव में, लोग अभी भी कॉल कर सकते हैं $('input').focus()और इसे पास कर सकते हैं।
रोब

वाह, पहली बार मेरे पास कोई टिप्पणी है सही होने के बाद मैंने सवाल का जवाब दिया, मैं जवाब अपडेट
करूंगा

यदि आप किसी अन्य / 3rd पार्टी स्क्रिप्टिंग के साथ एक बंद वातावरण में काम कर रहे हैं तो यह एक आदर्श दुनिया में काम करेगा। हालाँकि, अधिकांश व्यावहारिक अनुप्रयोग क्लाइंट साइटों के लिए होते हैं, जिनमें सभी प्रकार के प्लगइन्स और स्क्रिप्ट उनके साथ जोड़े जाते हैं जो बहुत अच्छी तरह से उस फ़ोकस को कॉल कर सकते हैं। एक चीज़ जो आपके कोड (और किसी भी कोड को उस फ़ंक्शन को कॉल करने की आवश्यकता होती है) को इस तरह (function(){/*your code here*/})();से स्कॉप्ड फ़ंक्शन में लपेटने में मदद कर सकती है : यह सेटफ़ोकस फ़ंक्शन को कॉल करने से सुरक्षित रखेगा और बूलियन को बाहरी स्क्रिप्ट द्वारा परिवर्तित होने से बचाएगा।
Xandor
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.