Laravel Dusk 测试无法使用 jQuery 在文本字段中触发 Vue 13 keyCode

Laravel Dusk Test can't trigger Vue 13 keyCode in a text field using jQuery

为此苦苦挣扎了几天。

我需要创建一个使用 Vuejs 框架的 laravel dusk 测试。有一种方法会在用户按下 ENTER 键时触发。我刚刚发现 jQuery 可以通过使用 .trigger() 方法以编程方式触发回车键:

$('.text-input').trigger($.Event("keypress", {keyCode: 13}))

它工作正常,但它不会触发与 .text-input 绑定的 vue 方法。知道为什么它不起作用吗?还有其他方法可以满足要求吗?

非常感谢你们的帮助。

我猜 $.Event 是 jQuery 原生事件的事件包装器,它似乎触发实际事件,在某些情况下我们需要原生事件。

var e = document.createEvent('HTMLEvents');
e.keyCode = 13;
e.initEvent('keypress', false, true);
$('.text-input').get(0).dispatchEvent(e);

<!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>

你能试试这个吗,让我们知道是否有效。

首先感谢@HardikSatasiya 提供答案。是的,它非常有用,所以我想 return 帮个忙,以便将来的开发人员在遇到此问题时将其作为参考。如果这个评论来得太晚了,我们深表歉意。我差点忘了这个。

上面的示例运行良好,但是,我遇到了另一个问题。场景是,在 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>