2011-07-14 25 views
105

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

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

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

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

मुझे यह प्रश्न जानने के लिए कुछ समय लगा कि यह प्रश्न कैसे Google को है। – minexew

+0

@minexew प्रोग्रामिंग का उपयोग करने का सबसे कठिन हिस्सा चर नामकरण और Google समस्याओं को कैसे प्रबंधित करना है!: पी –

उत्तर

163

आप देख सकते हैं 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

@ निकोला क्या यह कहीं भी दस्तावेज है? –

+0

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

+0

@ निकोलो मैं देखता हूं, यह एक jQuery चीज है। jQuery इस संपत्ति के अंदर मूल घटना वस्तु स्टोर करता है। बीटीडब्ल्यू, आप क्या मतलब है आप नहीं जानते? आपने अभी प्रलेखन के लिए लिंक प्रदान किया है: ' –

5

मुझे लगता है कि यह करने के लिए एक ही रास्ता documentation अनुसार trigger फोन पर एक अतिरिक्त पैरामीटर में पारित करने के लिए किया जाएगा।

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

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

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

+1

आप ईवेंट ऑब्जेक्ट की मूल मूल संपत्ति देख सकते हैं: यदि ईवेंट किसी क्लिक से नहीं आया है, तो यह –

+0

अपरिभाषित है [ट्रिगर के साथ डेटा पास करना] (http://api.jquery.com/trigger/) निश्चित रूप से प्रतिनिधि कार्यक्रमों के लिए जाने का तरीका है। [कम से कम क्लिक ईवेंट पैरामीटर नहीं लेता है] (http://jsfiddle.net/notacouch/Uf8Wv/69/)। लेकिन [यदि आप एक कस्टम घटना करते हैं तो पैरामीटर पास करना कोई मुद्दा नहीं होना चाहिए] (http://jsfiddle.net/notacouch/Uf8Wv/68/)। – notacouch

+1

कुछ कारणों से event.originalEvent Zepto के 'क्लिक' हैंडलर का उपयोग करते समय मेरे लिए काम नहीं कर रहा था (केवल 1 को सुरक्षित रखता था)। तो मैंने उपरोक्त समाधान की कोशिश की। एक जादू की तरह काम किया। – Larrydx

1

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

  • क्लिक करें
  • जाओ माउस स्थिति
  • की coords ओवरलैप बटन
  • ...
+0

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

13

अधिक सीधे आगे उपर्युक्त से अधिक होगा:

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

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

यह सबसे अच्छा जवाब है। स्पष्टीकरण के लिए, देखें: http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

हालांकि यह प्रलोभन और शायद अभ्यास में आरामदायक है, ध्यान दें कि jQuery डेवलपर्स ' सार्वजनिक एपीआई के लिए isTrigger' [इस समय के रूप में] (https://github.com/jquery/api.jquery.com/issues/319)। – Jon

1

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

+0

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

1

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

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

जो लोग jQuery के नए संस्करणों का उपयोग करते हैं, वे इसे आजमा सकते हैं। क्रोम, एज, आईई, ओपेरा, एफएफ

पर काम करता है
if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) { 
    //Hey hooman it is you 
} 
-1

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

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

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() कॉल करने के लिए चाहते हैं। शुभकामनाएँ या अन्य उत्तरों की जांच करें

+0

यह केवल लोगों को 'सेटफोकस()' कहने से रोकता है - यह लोगों को फोकस ईवेंट ट्रिगर करने से नहीं रोकता है। 'सेटफोकस()' लिखना नहीं, लोगों को इसे कॉल करने से भी रोका जाएगा, इसलिए मुझे लाभ दिखाई नहीं देता है। वास्तव में, लोग अभी भी '$ ('इनपुट') कॉल कर सकते हैं। फोकस()' और इसे पास कर दिया है। – Rob

+0

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

संबंधित मुद्दे