在Vue中,除了默認的@click事件之外,我們還可以通過v-on來實現更多的事件綁定。通過全局的事件監聽器,我們可以很方便地捕獲到頁面上的任何一個元素的點擊事件。下面是一個簡單的示例:
Vue.config.keyCodes.f1 = 112; document.addEventListener('keydown', function(event) { if (event.keyCode === 112) { alert('You pressed F1'); } });
上面的代碼為我們注冊了一個全局的按鍵事件,當用戶按下F1時,會彈出一個提示框。這里我們使用了Vue.config.keyCodes來注冊自定義的按鍵碼,然后通過document.addEventListener來監聽按鍵事件。同樣的道理,我們也可以注冊全局的點擊事件:
// 注冊全局點擊事件 Vue.directive('click-outside', { bind: function(el, binding, vnode) { el.clickOutsideEvent = function(event) { // 判斷點擊的元素是否為當前元素或子元素 if (!(el === event.target || el.contains(event.target))) { // 如果不是,則執行回調函數 vnode.context[binding.expression](event); } } document.addEventListener('click', el.clickOutsideEvent); }, unbind: function(el) { document.removeEventListener('click', el.clickOutsideEvent); } });
上面的代碼使用了Vue.directive來注冊一個全局指令,在指令的bind函數中我們注冊了一個點擊事件的回調函數,然后使用document.addEventListener來監聽全局的點擊事件。在回調函數中,我們判斷點擊的元素是否為當前元素或者它的子元素,如果不是,則執行傳入的回調函數。
使用時,我們只需要在任何一個元素上使用v-click-outside指令,并傳入一個回調函數即可:
點擊我之外的任何地方都會執行doSomething函數
上面的代碼中,在div元素上使用了v-click-outside指令,然后將doSomething函數作為指令的參數傳入。當用戶在div元素之外點擊任何一個元素時,就會執行doSomething函數。