2012-11-10 15 views
5

के साथ पेस्ट करके सक्रिय नहीं किया गया Google autocomplete API माउस के साथ टेक्स्ट इनपुट में सामग्री चिपकाकर सक्रिय नहीं प्रतीत होता है। कीबोर्ड को शामिल करते समय यह ठीक काम करता है, लेकिन माउस के साथ नहीं।Google के स्वत: पूर्ण को माउस

मैंने नोटिस किया था कि, हालांकि, आप टेक्स्ट सामग्री में अपनी सामग्री पेस्ट करने के बाद यह लगभग किसी भी कीप्रेस (परीक्षण दायां तीर कुंजी, अंत कुंजी, स्थान) से सक्रिय हो जाएगा।

आप इसे अपने autocomplete demo साइट पर यहां दोबारा कर सकते हैं।

क्या यह एक बग है? या डिजाइन के रूप में? यदि यह डिज़ाइन किया गया है, तो वर्कअराउंड कैसे लागू करें? मुझे यह अब तक एक कामकाज के रूप में मिला है, लेकिन कोई नकली कीप्रेस घटनाएं काम नहीं लगती हैं। ब्राउज़र मेनू पट्टी के साथ ही आईओएस चिपकाने की कार्यक्षमता से पेस्ट |

$('.txtLocation').bind("paste", function (e) 
{ 
    $('.txtLocation').focus(); 
    var e = jQuery.Event("keydown"); 
    e.keyCode = 39; //39=Arrow Right 
    $('.txtLocation').trigger(e); 
}); 

उत्तर

5

यह इस प्रभाव डालता है न केवल संदर्भ मेनू का पेस्ट, लेकिन यह भी संपादित की है कि लगता है। मैंने bug with Google खोला है। आप अपडेट को पकड़ने के लिए उस बग रिपोर्ट को "स्टार" करना चाह सकते हैं।

मुझे एक कामकाज मिला कि, एक हैक का थोड़ा सा, समस्या को ठीक करने लगता है। यदि आप चिपकाए गए मान को संग्रहीत करते हैं, तो किसी भिन्न फ़ील्ड पर फ़ोकस स्विच करें, ऑटोकॉम्प्लेट फ़ील्ड में मान सेट करें, और अंततः स्वतः पूर्ण फ़ील्ड चीज़ों पर ध्यान केंद्रित करें, अपेक्षाकृत कम या कम काम करें। साथ ही, आपको इसे setTimeout() कॉलबैक में करना है - देरी का समय बिल्कुल कोई फर्क नहीं पड़ता है, लेकिन यदि आप केवल इनलाइन करते हैं तो आपको अपेक्षित परिणाम नहीं दिखाई देंगे।

यहाँ क्या मैं ऊपर वर्णन कर रहा हूँ का एक कोड नमूना है:

$("#address_field").on("paste", googleMapsAutocompletePasteBugFix); 

googleMapsAutocompletePasteBugFix = function() { 
    return setTimeout(function() { 
     var field, val; 
     field = $("#address_field"); 
     val = field.val(); 
     $("#price").focus(); 
     field.val(val); 
     return field.focus(); 
    }, 1); 
}; 

पिछले focus() वैकल्पिक है, लेकिन यूआई से अगर आप सिर्फ अगली फ़ील्ड पर स्वचालित रूप से छोड़ दिया थोड़ा कम आश्चर्य की बात है।

+0

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

+0

मैं आपको बता दूंगा ... freakin 'आईई आदमी ... और निश्चित रूप से, यदि एक ब्राउज़र है जहां उपयोगकर्ताओं को राइट-क्लिक मेनू का उपयोग करने की अधिक संभावना है तो यह वह है! क्या आपने सेटटाइमआउट देरी को बढ़ाने की कोशिश की है यह देखने के लिए कि क्या आईई में चीजें बदलती हैं? –

+0

एचएम ... टाइमआउट देरी को बदलना आईई मुद्दे को ठीक नहीं करता है। थोड़ी देर खेला लेकिन कोई पासा नहीं - आईई के लिए "समाधान" सोचने के लिए शुरू करना एक डीआईवी को खोलना है जिसमें एक संदेश है जिसमें बग के आईई उपयोगकर्ताओं को सलाह दी जाती है और सुझाव दिया जाता है कि वे चिपकाने के लिए CTRL + V का उपयोग करते हैं। –

0

निम्नलिखित समाधान मेरे लिए काम करता है ("पता_2" के साथ समाप्त होने वाले क्षेत्र का अस्तित्व माना जाता है)। आईई 8, आईई 9, आईई 10, क्रोम, एफएफ और सफारी

if document.addEventListener 
     $(document).on("paste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix) 
     $(document).on("onpaste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix) 
    else 
     for element in $("input[name*=address_1]") 
     document.getElementById($(element).attr('id')).onpaste = @googleMapsAutocompletePasteBugFix 

    googleMapsAutocompletePasteBugFix: (e) -> 
    unless e 
     e = window.event 

    if e.srcElement 
     target = e.srcElement 
    else 
     target = e.target 

    field = $(target) 
    fieldId = field.attr('id') 
    focusSwitchFieldId = fieldId.replace(/(\d)$/, '2') 

    setTimeout(-> 
     if window.chrome || /Safari/.test(navigator.userAgent) 
     val = field.val() 
     $("##{focusSwitchFieldId}").focus() 
     field.val(val) 
     field.focus() 
     else 
     field = document.getElementById(fieldId) 
     val = field.value 
     document.getElementById(focusSwitchFieldId).focus() 
     setTimeout(-> 
      field.value = val 
      field.focus() 
      field.focus() 
     , 50) 
    , 10) 
संबंधित मुद्दे