2013-02-28 61 views
6

我想構建一個JS外部腳本(標籤),它可以停止代碼(通常不是我的),而不需要使用彈出窗口。 我試過類似的東西:我可以停止沒有彈出窗口的JS location.href嗎?

$(window).bind('beforeunload', function() { 
window.stop(); 
event.stopImmediatePropagation(); 
event.preventDefault(); 
location.href = '#'; 
}); 

但似乎沒有任何幫助。 再次,我需要它沒有使用:返回「你確定嗎?」 也許有不同的回調?

感謝, 丹

+1

不可能。能夠在沒有用戶輸入的情況下停止導航將會破壞瀏覽工作的方式。 – jbabey 2013-02-28 20:45:41

+0

我有同樣的感覺。在Firefox的例子中,出於安全原因,他們故意阻止覆蓋window.location.href。參見[bugzilla中的這個錯誤](https://bugzilla.mozilla.org/show_bug.cgi?id=736694)。 – kamituel 2013-02-28 20:47:28

+0

其實這是可能的。否則,網站會詢問您是否想要「離開並丟失更改」。 beforeunload事件存在,即使您關閉窗口而不衝浪,它也會捕獲。調用返回false的jQuery中的 – Alfabravo 2013-02-28 20:53:42

回答

-1

你嘗試使用 「返回false」? 你也應該把事件發送給你的函數。 這裏有一個例子,你可以從一個按鈕,防止點擊和超鏈接

<input type="button" value="click me" /> 
<a href="www.google.com"> google </a> 

$(document).ready(function(){ 
    $('input[type="button"]').click(function(e){ 
      e.preventDefault(); 
    }); 
    $('a').click(function(e){ 
     e.preventDefault(); 

    }); 
}); 

這裏是鏈接http://jsfiddle.net/juTtG/143/

+1

就像調用e.preventDefault()和e.stopPropagation()..正如JQuery John Resig的創建者所解釋的:http://www.mail-archive.com/[email protected] .com/msg71371.html和http://jquery.10927.n7.nabble.com/Any-benefit-to-using-event-preventDefault-over-quot-return-false-quot-to-cancel-out-an -href-click-td102980.html – 2013-02-28 20:39:01

+0

在這種情況下返回false(沒有「offcourse」),在彈出窗口中打印「return flase」,這很奇怪,但這是發生的事情,所以它對我不好。我沒有一個輸入按鈕或一個href,我有一個Flash(不是我的),它調用一個JS方法來執行location.href ='url'。但是,感謝方向 – 2013-02-28 21:59:44

+0

ops抱歉,返回false是一個遺漏 – Nir 2013-03-01 22:08:14

1

使用onbeforeunload確認導航離開是剛剛返回的字符串的正確方法你想要顯示的消息。 MDN has this to say

函數應該指定一個字符串值事件對象的returnValue屬性,並返回相同的字符串

所以你onbeforeunload功能你要的也只是行爲(如同結合它使用jQuery,特別是因爲onbeforeunload不支持多個事件偵聽器像其他事件一樣)

window.onbeforeunload = function() { 
    return "Are you sure?"; 
}; 

但諷刺的是,Firefox不支持這種出於安全目的。

請注意,在Firefox 4及更高版本中,返回的字符串不會顯示給用戶。見bug 588292

編輯:我讀了更多的錯誤報告。他們網站做出這一決定的主要原因是:「1.刪除站點提供的文本,因爲這是一個安全問題(瀏覽器對話框中的不可信文本)」。我想知道他們對alert感覺如何?

除了返回字符串以外,大多數現代瀏覽器(Chome,IE 9+或更早的版本,以及我知道的Opera)都會忽略您嘗試在onbeforeunload函數中執行的任何操作。這是爲了防止劫持用戶瀏覽器,打開彈出窗口,通過指向另一個用戶(可能是惡意域名)覆蓋導航嘗試等。

編輯2:我顯然是不正確的。只有一些東西在onbeforeunload中不允許,它們只是碰巧主要是您在示例代碼中嘗試過的東西類型,與事件傳播和頁面導航無關。從該FF錯誤報告的deep in the comments,用戶oyasumi發佈一個鏈接到這個jsFiddle與工作周圍顯示自定義文本到FF 4+用戶:http://jsfiddle.net/ecmanaut/hQ3AQ/因此,顯然呼籲alert()仍然是允許的,即使在onbeforeunload,這正是歡樂地做着什麼是「錯誤」「修復」的原始原因:在瀏覽器/應用程序/操作系統/官方對話框中顯示自定義文本。

相關問題