富國滬深
2023-04-14 15:03:32
我有一個(gè) Bootstrap 模式,需要在用戶離開頁面時(shí)觸發(fā)。在普通 JS 中,解決方案是監(jiān)聽 mouseleave 事件,檢查用戶之前是否手動(dòng)關(guān)閉了模態(tài)框,如果沒有,則顯示模態(tài)框。document.addEventListener("mouseleave", function (e) { if (e.clientY < 0) { if (localStorage.getItem('newsLetterSignUp') === null) { $('someModal').modal(); } } }, false);我正在嘗試使用 Apline.js 實(shí)現(xiàn)相同的行為。第一種方法是在模式本身上設(shè)置事件處理程序:(我有一個(gè)自定義模型 CSS 類 .newsletter-modal 而不是 Bootstrap 的 .modal 因?yàn)槲蚁胗?Alpine 處理可見性)<div x-data="newsletter()"> <div x-show="showModal" @mouseleave.document="revealModal" class="newsletter-modal show fade" id="mailingListModal" tabindex="-1" role="dialog" aria-labelledby="mailingListModal" aria-hidden="true" > <div class="modal-dialog modal-lg" role="document"> <div class="modal-content" @click.away="showModal = false"> [modal content] </div> </div> </div> <--- JS code to handle the modal actions ---> <script> window.newsletter = function() { return { showModal: true, revealModal(e) { alert('leave'); if (e.clientY < 0 && localStorage.getItem('newsLetterSignUp') === null) { this.showModal = true; } }, closeNewsletterModal() { this.showModal = false; localStorage.setItem('newsLetterSignUp', JSON.stringify(new Date())); } } } </script> 我的想法是將 .document 屬性添加到 @mouseleave 事件以將其綁定到文檔,但這沒有效果。另一種方法是在 上設(shè)置 @mouseleave 事件,分派事件并在模態(tài)上偵聽事件。但這也沒有導(dǎo)致事件在 mouseleave 上被觸發(fā)。
1 回答

慕沐林林
TA貢獻(xiàn)2016條經(jīng)驗(yàn) 獲得超9個(gè)贊
結(jié)果發(fā)現(xiàn)問題不在事件處理程序或 Alpine 中,而是在 Firefox 中。在 Firefox 中,當(dāng)用戶將鼠標(biāo)導(dǎo)航離開窗口時(shí)不會(huì)觸發(fā) mouseleave 事件。
因此 Firefox 的解決方案是添加一個(gè)額外的事件偵聽器來跟蹤鼠標(biāo)移動(dòng)。并在 e.clientY < 10 時(shí)觸發(fā)
// HTML
<div x-data="newsletter()" @mouseleave.window="revealModal" @mousemove.document="isUserLeaving"> ... </div>
// JS
isUserLeaving(e) {
? ?if (e.clientY < 10) {
? ? ? ?this.revealModal();
? ?}
}
添加回答
舉報(bào)
0/150
提交
取消