2014-07-11 210 views
3

我試圖做出退出彈出窗口,我可以使用下面的代碼。 只要用戶的鼠標移出瀏覽器區域,就會彈出一個對話框。但每當彈出窗口出現時都很煩人。我想限制它只是一次。 有人可以幫助我嗎?只觸發jQuery mousemove事件一次

jQuery(document).ready(function() { 
    jQuery(document).mousemove(function(e) { 
     jQuery('#exitpopup').css('left', (window.innerWidth/2 - jQuery('#exitpopup').width()/2)); 
     jQuery('#exitpopup').css('top', (window.innerHeight/2 - jQuery('#exitpopup').height()/2)); 
     if(e.pageY <= 5) 
     { 
      // Show the exit popup 
      jQuery('#exitpopup_bg').fadeIn(); 
      jQuery('#exitpopup').fadeIn(); 
     } 
    }); 
}); 
+1

設置指示是否彈出以前還是沒有被證明的標誌。或在彈出窗口顯示後解除綁定事件處理程序。 –

回答

1

使用jQuery的one()功能:http://api.jquery.com/one/

jQuery(document).ready(function() { 
     jQuery(document).one('mousemove', function(e) { 
      jQuery('#exitpopup').css('left', (window.innerWidth/2 - jQuery('#exitpopup').width()/2)); 
      jQuery('#exitpopup').css('top', (window.innerHeight/2 - jQuery('#exitpopup').height()/2)); 
      if(e.pageY <= 5) 
      { 
       // Show the exit popup 
       jQuery('#exitpopup_bg').fadeIn(); 
       jQuery('#exitpopup').fadeIn(); 
      } 
     }); 
}); 
+0

感謝卡倫,這工作。儘管本的回答也做到了。 –

0

插入這樣的:

e.stopPropagation(); 

只是在mousemouve函數的第一個列表。

.... 
jQuery(document).mousemove(function(e) { 
    e.stopPropagation(); 
    jQuery('#exitpopup').css('left', (window.innerWidth/2 - jQuery('#exitpopup').width()/2)); 
    ... 
+0

除了窗口之外,文檔還在哪裏傳播? – adeneo

+0

這沒有幫助。 –

0
(function($) { 

    $(document).ready(function() { 
     var leftPage = false; 
     $(document).mousemove(function(e) { 

      if(e.pageY <= 5) 
      { 
       if (!leftPage) { 
        var exitPopup = $('#exitpopup'); 
        exitPopup.css('left', (window.innerWidth/2 - exitPopup.width()/2)); 
        exitPopup.css('top', (window.innerHeight/2 - exitPopup.height()/2)); 
        $('#exitpopup_bg').fadeIn(); 
        exitPopup.fadeIn(); 
       } 

       leftPage = true; 
      } else { 
       leftPage = false; 
      } 
     }); 
    }); 

})(jQuery); 

「如果用戶離開頁面,他們還沒有離開然後設置彈出窗口。接下來馬克,他們已經離開了頁面(leftPage =真)」

「不要試圖和重新設置彈出窗口直到他們回來在網頁」

夫婦額外的:

  • ,而不是調用jQuery所有我們把整個東西包裝在一個函數包裝中的時候,所以你可以使用$
  • 而不是做這個每次$('#exitpopup');我們緩存到一個變量exitPopup的,因此不會每次都(低效率)
+0

我的不好,它沒有幫助。另外我有更多的代碼來關閉彈出窗口。 jQuery('#exitpopup')。slideUp();' –

+0

不確定你是什麼樣的人之後,我認爲你想在正確的時間顯示彈出窗口,而不管你的彈出窗口代碼是什麼,如果你在這裏檢查並在右側窗口中移動光標,你可以看到控制檯日誌出現在正確的時間,只有一次http://jsfiddle.net/3sSvU/ –

+0

我上面提到的代碼只是關閉/隱藏出現的彈出窗口,就像關閉按鈕,點擊它會觸發隱藏出現的彈出窗口。我的觀點 關於控制檯日誌,請參考以下屏幕截圖:http://screencast.com/t/g8uzYvEKa –

0

有幾件事情在這裏做查找。首先,形式上的,你應該將你的CSS改變的if塊內,因爲你真的不需要這些運行每用戶移動他們的鼠標時,你顯示彈出之前右:

if(e.pageY <= 5) 
{ 
    // Alter CSS as appropriate 
    jQuery('#exitpopup').css('left', (window.innerWidth/2 - jQuery('#exitpopup').width()/2)); 
    jQuery('#exitpopup').css('top', (window.innerHeight/2 - jQuery('#exitpopup').height()/2)); 

    // Show the exit popup 
    jQuery('#exitpopup_bg').fadeIn(); 
    jQuery('#exitpopup').fadeIn(); 
} 

其次,您可能希望通過分離事件處理程序來避免再次顯示它。我建議您使用jQuery .on().off()語法,而不是簡寫.mousemove(),因爲它更易於閱讀和維護。我還建議你在你的事件中使用命名空間,這樣你就可以確保你不會分離可能在其他腳本中設置的事件。

jQuery(document).on('mousemove.yourNamespace', function (e) { 
    if(e.pageY <= 5) 
    { 
     // Alter CSS as appropriate 
     jQuery('#exitpopup').css('left', (window.innerWidth/2 - jQuery('#exitpopup').width()/2)); 
     jQuery('#exitpopup').css('top', (window.innerHeight/2 - jQuery('#exitpopup').height()/2)); 

     // Show the exit popup 
     jQuery('#exitpopup_bg').fadeIn(); 
     jQuery('#exitpopup').fadeIn(); 

     // now detach the event handler so it won't fire again 
     jQuery(document).off('mousemove.yourNamespace'); 
    } 
} 

最後,如果您包裝所有這些代碼在​​,你會不會寫出來,jQuery每一次,你仍然不會有全局命名空間與$擔心可能發生的衝突。

(function ($) { 
    $(document).on('mousemove.yourNamespace', function (e) { 
     if(e.pageY <= 5) 
     { 
      // Alter CSS as appropriate 
      $('#exitpopup').css('left', (window.innerWidth/2 - $('#exitpopup').width()/2)); 
      $('#exitpopup').css('top', (window.innerHeight/2 - $('#exitpopup').height()/2)); 

      // Show the exit popup 
      $('#exitpopup_bg').fadeIn(); 
      $('#exitpopup').fadeIn(); 

      // now detach the event handler so it won't fire again 
      $(document).off('mousemove.yourNamespace'); 
     } 
    } 
})(jQuery); 

jQuery的文檔爲.on().off(),並event.namespace供參考。

+0

Thanks for t他提醒本。我一定會考慮他們。我的代碼不適合我。 –

+0

你的意思是「它不起作用?」如果彈出窗口顯示不正確,則可能是您的if語句中的條件。當鼠標位於頁面頂部的前5個像素內時,「e.pageY <= 5」會告訴你。如果您想要檢測用戶何時離開頁面,則需要更復雜的條件。 – Ben

+0

對不起本,這是從我身邊,而複製你的代碼導致的問題。它現在有效! –