2013-05-28 115 views
4

我正在開發電子商務(PHP)網站,這是我的要求。當瀏覽器關閉時顯示彈出窗口

一旦客戶離開訂單頁面或關閉瀏覽器, 我想提供另一種產品彈出或提示框。 如果他們選擇「是」,它將重定向到另一個產品頁面 而不是關閉窗口。

我嘗試使用JavaScript window.open()正文「onunload」事件。 但瀏覽器仍然阻止它。

有沒有辦法做到這一點?

謝謝 書齋

+1

如果'e.preventDefault()'或'window.event.returnValue = false'沒有幫助,那麼自定義模式對話框就沒有辦法了...很多瀏覽器都會阻塞'window.open()'s彈出窗口,所以有一個更好的方法(IMO)用javascript + css創建人造彈出窗口,而不是使用'window.open()'。 – BlitZ

+3

使用js的提醒/確認功能 – Class

+1

使用'confirm()' - 根據規格必須阻止_must_。 –

回答

0

同一樣在我的門戶網站,當用戶關閉瀏覽器,我需要一些時間來推遲復位一些數據。我在下面使用的代碼,它適用於我。 當用戶關閉瀏覽,選項卡或嘗試重定向到另一個頁面時,將顯示一條消息供用戶選擇停留或離開。

var validNavigation = false; 

function wireUpEvents() { 

    var dont_confirm_leave = 0; //set dont_confirm_leave to 1 when you want the user to be able to leave withou confirmation 
    var leave_message = cmsLeaveMessage; 
    function goodbye(e) { 
    validNavigation = isUserLoggedIn == 0 ? true : validNavigation; 
    if (!validNavigation) { 
     if (dont_confirm_leave!==1) { 
     if(!e) e = window.event; 
     //e.cancelBubble is supported by IE - this will kill the bubbling process. 
     e.cancelBubble = true; 
     e.returnValue = leave_message; 
     //e.stopPropagation works in Firefox. 
     /* 
     if (e.stopPropagation) { 
      e.stopPropagation(); 
      e.preventDefault(); 
     } 
     */ 
     //return works for Chrome and Safari 
     $.ajax({ 
      url: linkResetTask, 
      type: 'POST', 
      dataType: "html", 
      success:function(){ 
       init("Employee"); 
      } 
     }); 
     validNavigation = false; 
     return leave_message; 
     } 
    }else 
    { 
     validNavigation = false; 
    } 
    } 

    $(window).bind('beforeunload', goodbye); 


    // Attach the event keypress to exclude the F5 refresh 

    $(document).bind('keydown keyup', function(e) { 
     if(e.which === 116) { 
      validNavigation = true; 

     } 
     if(e.which === 82 && e.ctrlKey) { 
      validNavigation = true; 

     } 
    }); 

} 

// Wire up the events as soon as the DOM tree is ready 
$(document).ready(function() { 
    wireUpEvents(); 
}); 
2

首先:這根本不是用戶友好的。就像@Dagon所說的那樣,沒有人希望被限制離開一個頁面,然後顯示出售的不同物品的垃圾郵件。說到這一點,我相信你有一個合法的理由,或者說是被告知要這樣做。所以這裏是我的答案---

有沒有辦法與onunload事件做到這一點。一旦該事件被解僱,就沒有機會重定向或取消卸載,因爲它實際上是卸載事件。

您最好的機會是在onbeforeunload事件中。這是實際暫停onunload事件的唯一事件,也可以取消執行中的onunload。 onbeforeunload事件有兩種不同的結果

  • 如果你在onbeforeunload事件返回的東西,然後會出現一個默認的對話框,用你的文字裏,當用戶嘗試導航離開。用戶可以點擊確定或取消。如果他們點擊確定,瀏覽器將繼續導航。如果用戶點擊取消,那麼onunload事件就會被取消,你猜對了。令人驚訝的是,這似乎是在沒有錨定的情況下取消onunload事件的唯一方法。
  • 如果您不返回任何內容,onbeforeunload事件中的代碼將在用戶不知情的情況下觸發。 (此代碼必須相對短,因爲onbeforeunload事件不允許太多的時間。

你可能想嘗試一個想法(我從來沒有嘗試這)是嘗試添加一個超鏈接到的return語句。onbeforeunload事件再次,不知道這是否會工作

下面是onbeforeunload的一個非常簡單的樣品和onunload的事件:

​​

我知道你想創建一個警報或彈出確認但也有一些問題,典型的程序員不能訪問source-c onbeforeunload和onunload事件,所以沒有人100%確定他們所做的一切。從我的測試中我知道的是,似乎不可能只有一次自定義彈出窗口並執行其他代碼。

如果用戶正在關閉網頁,捕獲onbeforeunload事件的唯一方法。這是沒有辦法的。如果用戶使用後退按鈕,onbeforeunload事件也會在那裏觸發。我知道你的最終目標是什麼,但我有一個建議,如果允許的話。嘗試在頁面上錨定鏈接或按鈕。如果有這個彈出窗口是絕對必要的,唯一確定的方法就是將彈出窗口固定到網頁上的鏈接/按鈕。但是,當然這隻有在他們試圖通過你的鏈接導航(這會更方便用戶),但是如果他們試圖使用外部鏈接(如最喜歡的鏈接或關閉瀏覽器)離開,那麼它會起作用不被執行。

祝你好運。 Onbeforeunload和onunload是棘手的。

相關問題