亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將焦點設置在輸入字段上?

如何將焦點設置在輸入字段上?

波斯汪 2019-06-11 20:53:02
如何將焦點設置在輸入字段上?在AngularJS中,聚焦于輸入場的“角度方式”是什么?更具體的要求:當模態,則將焦點設置為預定義的<input>在這個模態里面。每次<input>變得可見(例如,通過單擊某個按鈕),將焦點設置在上面。我試圖達到第一個要求帶著autofocus,但這只在第一次打開Modal時才起作用,而且只在某些瀏覽器中才起作用(例如,在Firefox中,它不起作用)。任何幫助都將不勝感激。
查看完整描述

3 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

  1. 打開一個Modal時,將焦點設置在此Modal內預定義的<Input>上。

定義一個指令,并讓它$監視一個屬性/觸發器,這樣它就知道什么時候可以聚焦元素:

Name: <input type="text" focus-me="shouldBeOpen">


app.directive('focusMe', ['$timeout', '$parse', function ($timeout, $parse) {
    return {
        //scope: true,   // optionally create a child scope
        link: function (scope, element, attrs) {
            var model = $parse(attrs.focusMe);
            scope.$watch(model, function (value) {
                console.log('value=', value);
                if (value === true) {
                    $timeout(function () {
                        element[0].focus();
                    });
                }
            });
            // to address @blesh's comment, set attribute value to 'false'
            // on blur event:
            element.bind('blur', function () {
                console.log('blur');
                scope.$apply(model.assign(scope, false));
            });
        }
    };}]);

柱塞

$timeout似乎是需要給模式時間來渲染。

“2”每當<Input>變為可見時(例如,通過單擊某個按鈕),請將焦點設置在它上。

創建一個本質上類似于上面的指令。觀察某些作用域屬性,當它變為真時(在ng-click處理程序中設置它),執行element[0].focus()..根據您的用例,您可能需要或不需要$timeout:

<button class="btn" ng-click="showForm=true; focusInput=true">show form and
 focus input</button><div ng-show="showForm">
  <input type="text" ng-model="myInput" focus-me="focusInput"> {{ myInput }}  <button class="btn" ng-click="showForm=false">
  hide form</button></div>


app.directive('focusMe', function($timeout) {
  return {
    link: function(scope, element, attrs) {
      scope.$watch(attrs.focusMe, function(value) {
        if(value === true) { 
          console.log('value=',value);
          //$timeout(function() {
            element[0].focus();
            scope[attrs.focusMe] = false;
          //});
        }
      });
    }
  };});

柱塞


更新7/2013:我見過一些人使用我最初的隔離作用域指令,然后在嵌入式輸入字段(即模態中的輸入字段)中遇到問題。沒有新作用域(或者可能是新的子作用域)的指令應該可以減輕一些痛苦。因此,上面我更新了答案,使之不使用隔離作用域。以下是原來的答案:

1.的原始答案,使用隔離作用域:

Name: <input type="text" focus-me="{{shouldBeOpen}}">


app.directive('focusMe', function($timeout) {
  return {
    scope: { trigger: '@focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === "true") { 
          $timeout(function() {
            element[0].focus(); 
          });
        }
      });
    }
  };});

柱塞.

使用隔離作用域的2.的原始答案:

<button class="btn" ng-click="showForm=true; focusInput=true">show form and
 focus input</button><div ng-show="showForm">
  <input type="text" focus-me="focusInput">
  <button class="btn" ng-click="showForm=false">hide form</button></div>


app.directive('focusMe', function($timeout) {
  return {
    scope: { trigger: '=focusMe' },
    link: function(scope, element) {
      scope.$watch('trigger', function(value) {
        if(value === true) { 
          //console.log('trigger',value);
          //$timeout(function() {
            element[0].focus();
            scope.trigger = false;
          //});
        }
      });
    }
  };});

柱塞.

因為我們需要在指令中重置觸發器/FocusInput屬性,所以‘=’用于雙向綁定。在第一個指令中,“@”就足夠了。還請注意,當使用‘@’時,我們將觸發器值與“true”進行比較,因為@總是產生字符串。


查看完整回答
反對 回復 2019-06-11
  • 3 回答
  • 0 關注
  • 741 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號