2017-03-09 10 views
3

昨日はvue.jsでコーディングを開始しましたが、従来のJS方法(document.getElementById('myTextBox').focus())を使用せずにテキストボックスに「フォーカスする」方法はわかりません。Vue:ボタンをクリックしたときに.focus()を呼び出す方法

最初は、自分のテキストボックスは表示されません。私は「スタート」ボタンを持っています。ユーザーがそれをクリックすると、テキストボックスが表示され、話すようにfocusを設定します。私はすでにrefを使ってみましたが、役に立たなかった(下記のコードを参照)。

HTML:

<input id="typeBox" ref="typeBox" placeholder="Type here..." /> 

Javascriptを

export default { 
    name: 'game', 

    methods: { 
    startTimer() { 
     setTimeout(function() { /* .focus() won't work without this */ 

     /* ugly and not recommended */ 
     // document.getElementById('typeBox').focus() 

     /* Throws the error: Cannot read property 'typeBox' of undefined */ 
     this.$refs.typeBox.focus() 

     // ... any other options? 
      // ... 

     }, 1) 
    } 
    } /* END methods */ 

} /* END export default */ 

誰もがこれを行う方法を知っていますか?助けてください。

UPDATE:

inputautofocusは、ページがロードされた直後にフォーカスするトリックを行います追加。しかし、私のアプリでは、ページをリロードせずに入力フィールドに何度もフォーカスを合わせる必要があるので、.focus()に電話する方法が必要です。

+0

更新:上級開発者が、これを理解するのに役立ちました。私は以下のコードを答えとして掲示しています。他の誰かが同じ問題についてここに来る場合に備えてです。すべての助けをくれてありがとう、みんな。 – ITWitch

答えて

7

...

私はシニアプログラマの助けを借りてこれを最終的に考え出しました。私はまた、そのvueバージョンnextTick()を使って、途中でsetTimeoutを取り除くことができました。

正しいJSコード:

startTimer() { 
    this.$nextTick(() => { 

     // this won't work because `this.$refs.typeBox` returns an array 
     // this.$refs.typeBox.focus() 

     //this one works perfectly 
     this.$refs.typeBox[0].focus() 

    }) 
} /* END startTimer */ 

説明:

enter image description here

理由コードのためです:私はconsole.log(this.$refs.typeBox)を使用する場合、それはこの配列を返さ

仕事をするには、それがなければならなかったtypeBox.focus()の代わりにtypeBox[0].focus()

+1

私はこの非常に優れたソリューションを自分の仕事にも使用しなければならないことを確認できます。 $ nextTickを使用すると、これを実行してsetTimeoutを使うのを忘れる – munkee

+0

あなたの配列はv-forによって引き起こされますか? "v-forを使用して要素/コンポーネントで使用すると、登録された参照はDOMノードまたはコンポーネントインスタンスを含む配列になります。 – mix3d

3

setTimeout関数でthisの値は、それが時間の経過後に実行されるコールバック関数であるのでwindowオブジェクトに設定され、それが動的に関数が呼び出されている場所から設定されているthisキーワードの有効範囲を失いました。

矢印機能は、独自の値thisをバインドしません。

startTimer() { 
    setTimeout(() => { 
    this.$refs.typeBox.focus() 
    }, 1) 
} 

OR

startTimer() { 
    const self = this; 
    setTimeout(function() { 
    self.$refs.typeBox.focus() 
    }, 1) 
} 
+0

ありがとうございますが、それでも動作しません。エラーは '_this。$ refs.typeBox.focus is not function'に変更されました。私は 'focus()'から '()'を取り除こうとしましたが、エラーは出ませんでしたが、まだフォーカスしませんでした。 2番目のオプションは、私が上記の元のエラーもスローします。 – ITWitch

+0

今すぐ確認、私の答えを更新しました。 @ITWitch –

+0

ありがとうございますが、ドル記号を '$ refs'から取り除くことは、そのトリックも行いません。 – ITWitch

-1

この参照:誰かが同じ問題に遭遇しただけの場合には、ここで解決策を共有

$(function(){ 
 
    $("#my_text").hide(); 
 
}) 
 

 
function onClickTest(){ 
 
    $("#my_text").show(); 
 
    document.getElementById("my_text").focus(); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="my_text"/> 
 

 
    <button onclick="onClickTest()">click</button>

+0

この質問はjQueryでタグ付けされておらず、設定フォーカスはjQueryをまったく必要としません。 – str

+0

@str jqueryのフォーカスを使用しませんでした。要素を使用してテスト用のフィールドを表示/非表示にしました。 –

+0

ありがとうございます。上記のように、私は 'document.getElementById'を使用することはできません。最初に 'vue.js'を使う目的です。 – ITWitch

関連する問題