2013-04-23 4 views
12

मैं चूहादानी जावास्क्रिप्ट पुस्तकालय का उपयोग कर रहा है और एक विशिष्ट तत्व पर इनपुट पर कब्जा करने के लिए इच्छुक हूँ।एक विशिष्ट तत्व पर mousetrap का उपयोग कर?

परिदृश्य मैं उपयोगकर्ता नाम और पासवर्ड के लिए एक पाठ बॉक्स जो KnockoutJS फिर जब एक बटन दबाया जाता है एक ajax अनुरोध उपयोगकर्ता के लिए लॉग इन करने के लिए किया जाता है के लिए बांधता है। अब के रूप में वहाँ कोई रूप नहीं है और इसके नहीं एक असली बटन अपने एक लंगर कि jQuery के यूआई एक बटन अगर वहाँ तत्व के बजाय दस्तावेज़ स्तर पर बाध्य करने के लिए चूहादानी पाने के लिए कुछ आसान तरीका था मैं सोच रहा था में बदल जाता है।

इसलिए उदाहरण के लिए एक सामान्य चूहादानी बाध्यकारी होगा:

Mousetrap.bind('enter', function(event) { CallSomeAjaxMethod(); }); 

अब जब कि किसी भी पृष्ठ पर कुंजी दबाएँ दर्ज के लिए (एक पाठ बॉक्स तत्व के बाहर) की जाँच करेगी और कर उस पर आधारित कुछ। अब समस्या इस मामले में है कि जब भी यह एक विशिष्ट तत्व के दायरे में किया जाता है तो मैं केवल इस घटना को कैप्चर करने में सक्षम होना चाहता हूं।

Mousetrap.bind('enter', function(event) { CallSomeAjaxMethod(); }).on(element); 

वहाँ यह करने के लिए कोई तरीका है:

var element = document.getElementById("some-element"); 
Mousetrap.bind('enter', element, function(event) { CallSomeAjaxMethod(); }); 

या शायद अधिक की तरह धाराप्रवाह:

इसलिए उदाहरण के लिए मैं कुछ likethis करना चाहते किया जाएगा? एक ही तरीका है मैं यह करने के (चूहादानी के साथ) देख सकते हैं वर्तमान में इस दस्तावेज़ गुंजाइश बाध्यकारी है और बस तत्व घटना पर उठाया गया था, तो यह संभव है प्राप्त करने की कोशिश है।

मुझे पता है तुम तथापि के रूप में मैं पहले से ही चूहादानी भरी हुई मैं उसे यहां पुन: उपयोग करने के लिए यदि संभव हो तो करना चाहते हैं jQuery या वेनिला js साथ बात की इस तरह कर सकते हैं।

उत्तर

10

मैं इस पर अनुवर्ती करना चाहता था। संस्करण 1.5.0 (आज जारी) के रूप में, यह अब mousetrap में मूल रूप से संभव है।

तुम सब करने की है ऊपर अपने विशिष्ट उदाहरण के लिए

var element = document.getElementById("some-element"); 
Mousetrap(element).bind('enter', function(event) { CallSomeAjaxMethod(); }); 

तुम भी कई चीजों को बाध्य करने के चूहादान का एक नया उदाहरण बना सकते हैं।

var mousetrap = new Mousetrap(element); 
mousetrap.bind('space', _handleSpace); 
mousetrap.bind('enter', _handleEnter); 

सबसे अच्छा यह पिछड़ा संगत होना चाहिए ताकि आपका सभी मौजूदा कोड अभी भी काम करेगा।

+2

इस नए अपडेट को बनाया है, प्रश्न को अपडेट करने के लिए धन्यवाद। – Grofit

+0

अगर मैंने माउसट्रैप (तत्व) कहा है। बाइंड ('alt + h' , फ़ंक्शन (ईवेंट) {कुछ();}); क्या मुझे माउसट्रैप (तत्व) .unbind ("alt + h") की उम्मीद करनी चाहिए; अनबंद करने के लिए? फिलहाल मैं और अधिक बाइंडिंग प्राप्त कर रहा हूं (मैं ऑरेलिया के साथ माउसट्रैप का उपयोग कर रहा हूं और ऑरेलिया बाइंड/अनबिंड इवेंट्स का उपयोग करके बाध्यकारी/अनबाइंडिंग कुंजियां जिन्हें दृश्य को प्रदर्शित/हटाया जाता है, निकाल दिया जाता है।) – Phil

+0

@ क्रिएग कोणीय 2 में इसे कैसे प्राप्त करें? –

7

अधिकार के रूप में अब अपने प्रश्न का संक्षिप्त उत्तर वहाँ चूहादानी में मूल रूप ऐसा करने के लिए कोई रास्ता नहीं है। ऐसा कहा जा रहा है कि आप कुछ तरीकों से संपर्क कर सकते हैं।

  1. मैं KnockoutJS से परिचित नहीं हूँ, लेकिन ब्राउज़रों enter कुंजी ट्रिगर एक रूप यह बताने के लिए बनाया जाता है प्रस्तुत इसलिए सबसे सुरुचिपूर्ण समाधान शायद एक रूप है जो मामले में तुम नहीं के अपने आदानों हिस्सा बनाने के लिए किया जाएगा सबमिट जमा ट्रिगर करने के लिए सभी को mousetrap की जरूरत है। आप फॉर्म पर e.preventDefault() पर कॉल कर सकते हैं यह सुनिश्चित करने के लिए सबमिट करें कि यह वास्तव में सर्वर पर वापस पोस्ट नहीं करता है।

  2. यदि आप टेक्स्ट इनपुट में mousetrap श्रेणी जोड़ते हैं तो यह कीबोर्ड शॉर्टकट प्राप्त करने की अनुमति देगा। फिर आप अपने कॉलबैक में e.target देख सकते हैं यह देखने के लिए कि क्या वह उस टेक्स्टरेरा से आया है। इस तरह यह कुछ दिखेगा:

    एचटीएमएल

    <input type="text" name="email" class="mousetrap"> 
    

    js

    var input = $('input[name=email]'); 
    Mousetrap.bind('enter', function(e) { 
        if (e.target === input[0]) { 
         console.log('triggered from input'); 
        } 
    }); 
    
  3. आप इस लक्ष्य को हासिल करने के लिए Mousetrap.stopCallback समारोह के ऊपर लिख सकता है। यह सबसे सुंदर समाधान नहीं है, लेकिन काम करना चाहिए।

    एचटीएमएल

    <input type="text" name="email"> 
    

    js

    var input = $('input[name=email]'); 
    var _oldStopCallback = Mousetrap.stopCallback; 
    Mousetrap.stopCallback = function(e, element, combo) { 
        if (combo === 'enter') { 
         return element !== input[0]; 
        } 
        return _oldStopCallback(e, element, combo); 
    } 
    
    Mousetrap.bind('enter', function(e) { 
        console.log('triggered from input'); 
    }); 
    

मैं अलग अलग तरीकों से मैं चूहादानी में अलग-अलग दायरों/संदर्भों का समर्थन कर सकते में देख रहा हूँ इसलिए उम्मीद है कि वहाँ एक आसान तरीका हो जाएगा भविष्य में।

+0

हाँ मैंने सोचा कि यह मामला हो सकता है, क्योंकि मैंने स्रोत कोड के माध्यम से त्वरित रूप से देखा और देखा कि यह वैश्विक स्तर पर इनपुट को बाध्य करता है, जिसके लिए अनुरोध किए जा रहे समर्थन के लिए एक मौलिक परिवर्तन की आवश्यकता होगी, जब तक कि आपने कुछ नहीं किया आपके ग्लोबल प्लगइन की तरह हाइब्रिड दृष्टिकोण करता है जहां आप बाध्यकारी प्रकार वाले तत्वों का एक शब्दकोश रखते हैं और यदि उनमें से कोई भी वैश्विक घटना के साथ मेल खाता है तो आप इसे बंद कर सकते हैं ... वैसे भी मेरा अधिकांश सिस्टम मूसट्रैप का उपयोग करता है जिस तरह से इसका मतलब है शॉर्टकट्स और इसके ब्रिलियंट के लिए इस्तेमाल किया जाता है! मैं बस एक विशिष्ट कीकोड == 13 स्टाइल तर्क लिखना नहीं चाहता था :( – Grofit

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