2010-10-25 128 views
1

附加的javascript在Safari瀏覽器中不起作用。safari javascript問題

此腳本在導航離開當前頁面之前顯示一條確認消息。

令人驚訝的是,這是第一次在safari中工作(但不是在隨後的提交過程中)。

場景:

  • 用戶進行一些更改,然後按提交按鈕
  • 確認消息顯示給用戶
  • 用戶決定按下取消按鈕退後同一頁面
  • 但後記用戶上無法再次調用提交。
  • 提交按鈕不起作用。

P.S:此代碼完美適用於其他瀏覽器,即IE7/8,FireFox。

function checksave() { 
    if (formIsDirty(myForm)) { 
    return "The form has been changed..."; 
    } 
} 

function formIsDirty(form) { 
    for (var i = 0; i < form.elements.length; i++) { 
    var element = form.elements[i]; 
    var type = element.type; 
    if (type == "checkbox" || type == "radio") { 
    if (element.checked != element.defaultChecked) { 
    return true; 
    } 
    } 
    else if (type == "hidden" || type == "password" || type == "text" || 
    type == "textarea") { 
    if (element.value != element.defaultValue) { 
    return true; 
    } 
    } 
    else if (type == "select-one" || type == "select-multiple") { 
    for (var j = 0; j < element.options.length; j++) { 
    if (element.options[j].selected != 
    element.options[j].defaultSelected) { 
     return true; 
    } 
    } 
    } 
    } 
    return false; 
} 

<body OnBeforeUnload ="return checksave();"> 
<form id="myForm" > 
    <table border="1"> 
    <tr> <td>Enter Text:</td><td><input id="text1" type="text" value=""/> <br/> </td></tr> 
    <tr> <td><input id="button1" type="submit" value="Submit1"/> <br/> </td> <td><input id="button2" type="submit" value="Submit2"/> <br/> </td></tr> 
    </table> 
</form> 
</body> 
+0

在這裏回答? http://stackoverflow.com/questions/803887/can-i-pop-up-a-confirmation-dialog-when-the-user-is-closing-the-window-in-safari – Mantar 2010-10-25 12:08:04

回答

0

啊,這是在WebKit的一個bug,但一個似乎被固定在目前的Chrome版本我。

似乎當表單提交從beforeunload提示被取消時,頁面上的所有表單都成爲不可提交(submit事件仍然會觸發但提交無法導航),直到頁面上的任何表單域被更改。 (這與你自己的形式變化檢查無關,瀏覽器本身會阻止導航,直到它發現變化,或許某種形式多次提交預防技巧出錯了,或者什麼?)

通常你不會注意到,因爲通常你會在form.onsubmit上放置一個不同的處理器,這會使onbeforeunload短路(因爲一般情況下,如果用戶點擊提交表單,他們會知道他們已經改變了一些東西,並且想要以保存更改)。

(順便說一句,避免使用myForm爲全局變量與id="myForm引用的元素,這是一個IE瀏覽器黑客,其他一些瀏覽器現在已經實現,但只有在Quirks模式,你希望在怪癖模式。添加一個<!DOCTYPE>聲明和使用document.getElementById('myForm')。)

+0

Appriciate 非常適合你詳細的解釋。這清除了我的想法,但是想知道是否有可用的解決方法。這仍然是safari/windows 5.0.2(7533.18.5)的一個問題。我們的客戶要求實現這個功能,因爲我們的應用程序支持需要由用戶填寫的lenthy輸入表單。我們喜歡有一些通用的JavaScript解決方案,所以不想處理每個控件事件(即onclick) – Kannan 2010-10-25 15:05:21

+0

您只需要處理每個表單的提交('onsubmit';'onclick'通常是處理提交的不好的地方) ,如果你需要確認提示,使用'confirm()'寫一個標誌來消除'onbeforeunload'。我希望你仍然希望這樣做,因爲當你實際上正在保存的時候,你通常不需要關於離開頁面而不保存的信息。 – bobince 2010-10-25 15:28:30