2017-12-07 3 views
0

며칠 동안 고생하고 있습니다.Laravel Dusk Test는 jQuery를 사용하여 텍스트 필드에서 Vue 13 keyCode를 트리거 할 수 없습니다.

Vuejs 프레임 워크를 사용하는 laravel dusk 테스트를 만들어야합니다. 사용자가 Enter 키를 누를 때 트리거되는 메소드가 있습니다. ('. 텍스트 입력') : 난 그냥 jQuery를 트리거 .trigger() 방법을 사용하여 키를 프로그래밍 방식으로 입력 할 수 있음을 발견했다.

$를 트리거 (. $ 이벤트 ("키를 누를 때", {keyCode가 : 13}))

잘 작동하지만 .text-input으로 바인드 된 vue 메소드가 실행되지 않습니다. 왜 그것이 효과가 없으며 요구 사항을 충족시키는 다른 접근법이 있습니까?

여러분의 도움을 진심으로 감사드립니다.

+0

첫째, 당신은 잘못된 방법으로 .trigger() 메소드를 사용하고 있습니다. 그리고 두 번째로 .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 test에서 필드에 텍스트를 입력하고 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>

관련 문제