2015-02-11 36 views
5

के साथ अगले इनपुट टेक्स्ट पर फ़ोकस बदलें मेरे पास मेरे नियंत्रक (var myObject) में ऑब्जेक्ट वेरिएबल है, जो आईएचएम में 3 इनपुट टेक्स्ट में विभाजित है।कोणीय

जब मैं केंद्रित अधिकतम लम्बाई तक पहुंच गया तो मैं स्वचालित रूप से अगले इनपुट पर फ़ोकस बदलना चाहता हूं।

var myObject = { 
    part1:"", 
    part2:"", 
    part3:"" 
} 



<form> 
    <input type="text" id="part1" ng-model="myObject.part1" maxlength="7"/> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
</form> 
+0

शायद, निम्नलिखित सहायक हो सकते हैं: http://stackoverflow.com/questions/18086865/angularjs-move-focus-to-next-control-on-enter –

उत्तर

10

आप इस के लिए एक निर्देश उपयोग करने की आवश्यकता होगी: इस प्रकार

app.directive("moveNextOnMaxlength", function() { 
    return { 
     restrict: "A", 
     link: function($scope, element) { 
      element.on("input", function(e) { 
       if(element.val().length == element.attr("maxlength")) { 
        var $nextElement = element.next(); 
        if($nextElement.length) { 
         $nextElement[0].focus(); 
        } 
       } 
      }); 
     } 
    } 
}); 

और विधि को अपडेट:

<form> 
    <input type="text" id="part1" ng-model="myObject.part1" maxlength="7" move-next-on-maxlength /> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12" move-next-on-maxlength /> 
    <input type="text" id="part2" ng-model="myObject.part2" maxlength="12"/> 
</form> 

Demo

आप को स्थानांतरित कर सकता है <form> eleme पर निर्देश इसके बजाय, लेकिन build-int jqLite की find() विधि आपको केवल टैग नाम से तत्व ढूंढने के लिए प्रतिबंधित करेगी। यदि आप पूर्ण jQuery का उपयोग कर रहे हैं, या इसके बजाय वेनिलाजेएस का उपयोग कर सकते हैं, तो मैं इस विधि का सुझाव दूंगा।

+0

धन्यवाद मेरे दोस्त !! –

+0

इसके लिए धन्यवाद लेकिन आप 'स्ट्रिंग' के साथ 'int' की तुलना नहीं कर सकते: होना चाहिए: यदि (element.val()। Length == element [0]। MaxLength) ... – grindking

+0

@grindking बेशक आप कर सकते हैं, यह जावास्क्रिप्ट है! :) '12 ==" 12 "'। जब तक आप * सख्त * समानता का उपयोग नहीं करते हैं, तब तक आप आमतौर पर ठीक होंगे। – CodingIntrigue

1

स्वीकृत उत्तर कार्य, लेकिन केवल तभी जब फ़ील्ड तत्काल भाई बहन हैं।

angular 
.module('move-next-directive', []) 
.directive('moveNextOnMaxlength', 
    function() { 
    return { 
     restrict: "A", 
     link: function(scope, elem, attrs) { 
     elem.on('input', function(e) { 
      var partsId = attrs.id.match(/focus(\d+)/); 
      var currentId = parseInt(partsId[1]); 

      var l = elem.val().length; 
      if (l == elem.attr("maxlength")) { 
      nextElement = document.querySelector('#focus' + (currentId + 1)); 
      nextElement.focus(); 
      } 
     }); 
     } 
    } 
    } 
); 

प्रत्येक इनपुट क्षेत्र के लिए एक गिने "फोकस" आईडी जोड़ें:: इस उत्तर के लिए

<div class="row"> 
    <div class="col-xs-4"> 
    <input type="text" id="focus1" maxlength="4" move-next-on-maxlength /> 
    </div> 
    <div class="col-xs-4"> 
    <input type="text" id="focus2" maxlength="4" move-next-on-maxlength /> 
    </div> 
    <div class="col-xs-4"> 
    <input type="text" id="focus3" maxlength="4" /> 
    </div> 
</div> 

क्रेडिट उदाहरण के लिए आप वहाँ खुद कॉलम में प्रत्येक 3 क्षेत्रों है, तो आप एक अलग समाधान की जरूरत है: https://stackoverflow.com/a/33007493/3319392

+0

मैंने इस संस्करण का उपयोग किया क्योंकि मेरे इनपुट अलग-अलग स्पैन में थे, धन्यवाद। मुझे 10 से अधिक तत्वों की अनुमति देने के लिए अपना रेगेक्स बदलना पड़ा, यह फोकस नामक एक अनंत संख्या की अनुमति देता है *: 'var partsId = attrs.id.match (/ फोकस (\ d +) /);' –

+0

धन्यवाद @eric .. मैंने फोकस फ़ील्ड की असीमित संख्या की अनुमति देने के लिए सुझाए गए कोड को संपादित किया है। – Jette