2011-11-02 9 views
18

यह सवाल पूछा गया है/जवाब (अधिकतर) सक्रिय होने से पहले, लेकिन मैं बुदबुदाती से घटना को रोकने के लिए तीन चीजों की कोशिश की है लेकिन कुछ भी काम किया है:इनपुट कीप्रेस घटना में दो बार

return false; 
e.stopPropagation(); 
e.preventDefault(); 

(वापसी झूठी लेना चाहिए अन्य दो की देखभाल, सही)

यहाँ एचटीएमएल है:?

<div class="tags-holder"> 
    <input type="text" class="addField" id="addField_<%= visit.id %>" placeholder="add a new tag"> 
</div> 

और जे एस (अद्यतन साफ):

$('.addField').show().keyup(function(event){ 
    event.preventDefault(); 

     if(event.keyCode == 13 || event.keyCode==9) { 
    ProfilePage.createTag(this, 'nada', 'addField') 
     $(this).hide().val(''); 

     return false;  
    } 

});

मैं वहाँ में अनावश्यक stoppers छोड़ दिया, लेकिन वास्तव में वापसी झूठी बस उत्साह से भरा हुआ नहीं मार देना चाहिए? (क्रोम का उपयोग कर)।

सुराग? कीकोड = 13 "Enter"

+0

आप 'field (फ़ील्ड) क्यों कर रहे हैं। FunctionCall()' 'field.functionCall()' के बजाय? –

+1

मैंने आपके कोड के [jsfiddle] (http://jsfiddle.net/thomas_peklak/dNKZ7/3/) बनाया है और कोई समस्या नहीं दिख रही है - आप जिस व्यवहार को रोकने की कोशिश कर रहे हैं वह क्या है? – topek

+0

धन्यवाद। यह काम करता है; हो सकता है कि यह डोम दिए गए ईवेंट बबुलिंग के साथ कुछ है (मैंने पूरे पृष्ठ को पोस्ट नहीं किया है)। समस्या यह है कि यह createTag() फ़ंक्शन को दो बार निकाल देता है, जो समस्याग्रस्त है :) – bear

उत्तर

10

वाह। आपकी मदद बहुत अच्छी थी और मुझे इसके बारे में सोचने में मदद मिली।

लेकिन समाधान एक सिपाही बाहर की तरह एक सा महसूस करता है; प्रभावी, लेकिन स्थिति पहले स्थान पर कभी नहीं होनी चाहिए।

यहाँ है, मैं यहाँ से टिप्पणी में पाया जो: http://yuji.wordpress.com/2010/02/22/jquery-click-event-fires-twice/

$('.plus').unbind('click').bind('click',function(e){  
console.log('clicked') 
    var id=$(this).attr('plus_id'); 
    var field=$('<input type="text">').attr({'placeholder':'add a new tag','id': 'addField_' + id, 'visit_id':id}); 
    field.focus(); 
    field.show().keydown(function(event){ 
     event.stopImmediatePropagation(); 
     if(event.keyCode == 13 || event.keyCode==9) { 
      console.log(event) 
      ProfilePage.createTag(field, 'nada', 'addField') 
      field.hide().val(''); 
      return false;  
     } 
    }).click(function(e){ 
     return false; 
    }) 
    ; 
$(this).append(field); 
return false;  
    }); 
+0

ओह तो यह काम कर रहा है अजीब। अब तुम्हारे लिए? अगर ऐसा है, तो यह बहुत अच्छा है! लेकिन आपके द्वारा पोस्ट किए गए लेख के आधार पर, ऐसा लगता है कि इस मुद्दे पर $ (दस्तावेज़) से अधिक (दस्तावेज़) .ready() फ़ंक्शन था। इसके साथ क्या चल रहा है? –

+0

संयोग से, मैं और अधिक पढ़ रहा था यह और ऐसा प्रतीत होता है कि यह कुंजीपटल ईवेंट हैंडलर सेट करने के साथ एक विशिष्ट समस्या है। यह * स्पष्ट रूप से * _keypress_ हैंडलर का उपयोग करने की अनुशंसा की जाती है .. http://stackoverflow.com/questions/2387316/jquery-textbox-keyup-firing-twice –

+0

मैं कि बाहर @mmmshuddup जांच करेंगे लेकिन मुझे लगता है इस मुद्दे को परियोजना के लिए बहुत विशिष्ट है, यह पृष्ठ पर सब कुछ अतिरिक्त घटनाओं फायरिंग कर रहा है पता चला है – bear

0

field.functionCall() 

को

$(field).functionCall() 

के सभी उदाहरणों को बदलने के बाद से क्षेत्र पहले से ही एक jQuery वस्तु है की कोशिश करो है।

ठीक है अब हम स्थापित कर लिया है कि इस त्रुटि नहीं था। मैंने फ़ायरफ़ॉक्स 7 और क्रोम 15 में परीक्षण किया और देखा कि अगर कथन में कोड ब्लॉक केवल दबाए जाने पर ही निकाल दिया जाता है। यह सुनिश्चित करने के लिए जांचें कि createTag() फ़ंक्शन के अंदर कुछ दो बार नहीं कर रहा है।

+0

बुरी आदत ... jquery इसे अनदेखा करता है लेकिन मैंने बदलाव किया है लेकिन इसमें कोई सुधार नहीं है। – bear

+0

डांगिट। हाँ स्वीकार किया कि एक अंधेरे में एक शॉट था वैसे भी। हम्म मुझे एक पल के लिए इस पर सोचने दो। –

+0

@ user508708 मैंने createTag() के लिए एक नकली फ़ंक्शन बनाया है जो उसी जेएसफ़िल्ड में बनाया गया है जो टोपेक बनाया गया है। अलर्ट केवल एक बार निकाल दिया जाता है .. इस बिंदु पर यह पता लगाने के लिए बहुत मुश्किल है कि डोम में क्या है और प्रोफाइल पेज ऑब्जेक्ट का संदर्भ क्या है .. –

0

क्या आपको लगता है कि घटना को पकड़ने जब यह बुलबुले है। मुझे केवल इस परीक्षण पृष्ठ के साथ एक फायरिंग मिलती है।

<!DOCTYPE html> 
<html> 
    <head> 
    <title>Scratch</title> 
    <script type="text/javascript" src="https://www.google.com/jsapi"></script> 
    <script type="text/javascript"> 
     google.setOnLoadCallback(function(){ 
     $('input[type="text"]').keyup(function(){ 
      console.debug('keyup'); 
     }); 
     }); 
     google.load('jquery', '1.6.4'); 
    </script> 
    </head> 
    <body> 

    <div class="something"> 
     <input type="text" /> 
    </div> 
    </body> 
</html> 

शायद यह आपका चयनकर्ता है। क्या यह किसी और के अंदर घोंसला है .addTag? जब मैं jQuery चयनकर्ता को बदलता हूं और उसी वर्ग को div और इनपुट भी बनाता हूं, तो मुझे दो ईवेंट फायरिंग मिलना शुरू होता है। इस तरह:

$('.thing').show().keyup(...); 

... और ...

<div class="thing"> 
    <input class="thing" type="text" /> 
</div> 
1

आशा इससे आपकी समस्या का समाधान होगा। event.preventDefault() का उपयोग करने के बजाय नीचे दिखाए गए इन दोनों का उपयोग करें। माइक्रोसॉफ्ट ब्राउज़र के मामले में event.cancelBubble = true का उपयोग करें; डब्ल्यू 3 सी मॉडल ब्राउज़र के मामले में ईवेंट का उपयोग करें।stopPropagation();

और कीप घटना के बजाए कृपया कुंजीपटल ईवेंट का उपयोग करें, क्योंकि कुंजीपटल के दौरान इनपुट इनपुट फ़ील्ड में भेजा जाएगा, इसलिए जो भी इनपुट आप दिखाना नहीं चाहते हैं, वह फ़ील्ड पर दिखाई देगा। तो एंटर बटन इवेंट ट्रिगर किया जाएगा।

बदले में झूठी उपयोग event.returnValue = false।

6

यह बाँध पहले तो घटना अनबाइंडिंग प्रयास करें, कोड नीचे देखें:

$('.addField').show().unbind('keyup').keyup(function(event){ 
event.preventDefault(); 

    if(event.keyCode == 13 || event.keyCode==9) { 
ProfilePage.createTag(this, 'nada', 'addField') 
    $(this).hide().val(''); 

    return false;  
} 

एक व्याख्या here है, मैं अपने नए ब्लॉग पर इस बारे में एक पोस्ट लिखी थी।

0

यह एक समस्या है जो हमेशा मुझे पागल बनाती है लेकिन मुझे लगता है कि यह समाधान बस झूठी वापसी करता है, अगर आप सच लौटते हैं तो यह स्वयं को यादृच्छिक रूप से दोहराता है, इसलिए मुझे लगता है कि इसमें एक श्रोता होना चाहिए जो वास्तविक प्रतिक्रियाओं के लिए सुनता है।

संक्षिप्त उत्तर वापसी झूठी जोड़ें;

$("#register-form #first_name").keyup(function(event) { 
console.log('hello world'); 
return false; 

});

मूल प्रश्न में यदि आप निकटता से कोड देखते हैं तो ऐसा लगता है कि वापसी झूठी एक पंक्ति बहुत जल्दी लिखी गई थी।

7

मुझे एक ही समस्या थी और मैंने उपरोक्त विधि का उपयोग किया और यह मेरे लिए काम करता है।

$(document).unbind('keypress').bind('keypress', function (e) { 
    // some logic here 
}); 
संबंधित मुद्दे