2017-12-07 24 views
0

これを使用して数日間苦労しています。Laravel Dusk Testは、jQueryを使用してテキストフィールドでVue 13のkeyCodeをトリガーできません

私は、Vuejsフレームワークを使用したlaravel duskテストを作成する必要があります。ユーザーがEnterキーを押すとトリガーするメソッドがあります。私はjQueryの.trigger()方法使用してプログラムでキーを入力トリガできることが判明:。

$( 'テキスト入力を')トリガー($イベント( "キープレス"、{のkeyCode:13}。))

正常に動作しますが、.text-inputとバインドされたvueメソッドはトリガーされません。なぜそれがうまくいかず、要件を満たすための他の方法もありますか?

本当にありがとうございます。

+0

まず、あなたは間違った方法で.trigger()メソッドを使用しています。もう1つの理由は、.trigger()メソッドのためにjQuery全体を使用する必要はありません。代わりにnative .dispatch()メソッドを使用してください。 – WaldemarIce

答えて

0

$ .EventはjQueryネイティブイベントのイベントラッパーで、実際のイベントをトリガーしているようですが、場合によってはネイティブイベントが必要になると思われます。

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <meta charset="utf-8"> 
 
    <meta name="viewport" content="width=device-width"> 
 
    <title>JS Bin</title> 
 
    <script src="https://code.jquery.com/jquery-3.1.0.js"></script> 
 
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 
</head> 
 
<body> 
 
    <div id="app"> 
 
    {{ message }} 
 
    <input type='text' @keypress="test" id='ok' value='2 sec wait for it' /> 
 
    </div> 
 
    <script> 
 
    
 
new Vue({ 
 
    el: '#app', 
 
    data: { message : 'testing man' }, 
 
    methods: { 
 
    test(e) { 
 
     console.log('wait for it enter triggered : ' + e.keyCode) 
 
    } 
 
    } 
 
}); 
 

 
setTimeout(() => { 
 
    // modern browsers, IE9+ 
 
    var e = document.createEvent('HTMLEvents'); 
 
    e.keyCode = 13; 
 
    e.initEvent('keypress', false, true); 
 
    $('#ok').get(0).dispatchEvent(e); 
 
    
 
},2000) 
 
    </script> 
 
</body> 
 
</html>

var e = document.createEvent('HTMLEvents'); 
e.keyCode = 13; 
e.initEvent('keypress', false, true); 
$('.text-input').get(0).dispatchEvent(e); 
あなたはこれを試してみて、私たちが動作するかどうかを知らせることができます。

0

まず、答えを提供してくれた@HardikSatasiyaに感謝します。はい、それは非常に便利ですので、将来の開発者がこの問題に遭遇した場合に参照として使用するように、私は賛成を返すことにします。このコメントがあまりにも遅い場合は、お詫び申し上げます。私はこれをほとんど忘れてしまった。

上記のサンプルは非常にうまく動作していますが、別の問題が発生しました。シナリオでは、laravel duskテストでフィールドにテキストを入力し、Vue.jsのENTERキーイベントをトリガーします。 JQueryとVue.jsのコラボレーションです。私の最終的なコードは以下である:

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<meta charset="utf-8"> 
 
<script src="https://code.jquery.com/jquery-3.1.0.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 
</head> 
 
<body> 
 
    <div id="app"> 
 
     <div> 
 
      <label>Label</label> 
 
      <input type='text' @keyup.13="myMethod" v-model='my_vue_element'/> 
 
     </div> 
 
    </div> 
 
    <script> 
 
     new Vue({ 
 
      el: '#app', 
 
      data: {my_vue_element: ''}, 
 
      methods: { 
 
       myMethod() { 
 
        alert(this.my_vue_element) 
 
       } 
 
      } 
 
     }) 
 

 
     $(() => { 
 
      // init enter event 
 
      var enter_key = document.createEvent("HTMLEvents") 
 
      enter_key.keyCode = 13 
 
      enter_key.initEvent("keyup", false, true) 
 

 
      // select element in jquery format 
 
      let jquery_element = $('label:contains("Label")').parent().find('input') 
 

 
      // this is not native in jquery I guess 
 
      let javascript_element = jquery_element.get(0) 
 

 
      // put a value in text field 
 
      jquery_element.val('Kanpai!') 
 

 
      // the issue here is that, you need to dispatch an event at the specified eventTarget, the input. 
 
      // usefull content in this link https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/dispatchEvent 
 
      javascript_element.dispatchEvent(new Event("input")) 
 

 
      setTimeout(() => { 
 
       // trigger ENTER event 
 
       javascript_element.dispatchEvent(enter_key) 
 
      }, 1000) 
 
     }) 
 
    </script> 
 
</body> 
 
</html>

関連する問題