2012-11-02 98 views
-2

我一直在研究一個非常大的帶有重置按鈕的html表單。 重置時,會發生數據庫操作。代碼適用於除Firefox以外的所有瀏覽器

我有一個JavaScript的功能,例如,被稱爲復位:

function clearDatabaseOfAnySavedForm() { 
    window.name = 1;       
    $.post('assets/scripts/reset-form.php');  
    window.location.reload(); 
    $(document).load().scrollTop(0);    
    return false; 
} 

對該函數引用的PHP文件中的代碼是:

<?php 
    //Authcate 
    $authcate = xxxxx; 

    $username = "xxxxx"; 
    $password = "xxxxx"; 
    //$hostname = "xxxxx"; 
    $hostname = "xxxxx"; 
    $database = "xxxxx"; 
    $conn = mysql_connect($hostname, $username, $password); 
    mysql_select_db($database, $conn) or die("Unable to select database"); 

    if (!empty($authcate)) {   
     $table = "xxxxx"; 

     $sqlSelectQuery = "SELECT * FROM $table WHERE authcate = '$authcate'"; 
     $selectResults = mysql_query($sqlSelectQuery); 
     $selectNumResults = mysql_num_rows($selectResults); 
     if ($selectNumResults > 0) { 
      $sqlUpdateQuery = "DELETE FROM $table WHERE authcate = '$authcate'"; 
      $result = mysql_query($sqlUpdateQuery); 
     } 
    } 
    mysql_close($conn); 
} 

所有這一切工作正常,是所有瀏覽器,但由於某種原因,PHP文件不會在Firefox中調用。 有沒有人有任何建議的想法?

+2

您可以隨時使用經常更新的美觀的.browser功能,並在用戶使用Firefox時發佈大量消息「請使用Internet Explorer,本網站非常棒! ?? – adeneo

+0

@adeneo,它本身使網站不是很好... – MarioDS

+0

你使用螢火蟲嗎?你看到了什麼錯誤信息? – Landon

回答

0

擴展@ epascarello的答案,你可能想要使用回調函數,這將執行您的帖子完成後的代碼。閱讀關於它here

function clearDatabaseOfAnySavedForm(){ 
    $.post('assets/scripts/reset-form.php', function(){ 
    //this will execute when the post returns 
    window.location.reload(); 
    }) 
} 

而且你不需要scrollTop的並返回false;

如果你不知道什麼是回調函數,請閱讀here。我記得當我第一次使用javascript時,這是一個非常不尋常的概念。

+0

你救了我的一天芽!我實際上並沒有意識到,在請求發送之前我正在重新加載。 – user1792935

+0

積分@epascarello以及 – user1792935

+0

是的,信貸給他指出的問題,我+1他的答案,對不起,偷獵:) – Landon

7

你的代碼充滿了競爭條件和不可能的步驟。我很驚訝它會在其他瀏覽器中運行。

function clearDatabaseOfAnySavedForm() 
{ 
    window.name = 1;       
    $.post('assets/scripts/reset-form.php'); <-- call server with asynchronous call 
    window.location.reload(); <-- reload page, it will cancel out the server call 
    $(document).load().scrollTop(0); <-- um page is been reload, what does this do ? 
    return false; <-- page is reloaded, what are you cancelling? 
} 

確保服務器上的代碼運行的唯一方法是確保回調發生,而不是重新加載頁面。發佈請求是異步的。不保證瀏覽器會執行它。大多數瀏覽器在頁面退出時會採取任何打開的連接並殺死它們。這就是Firefox不執行它的原因。

在Firefox中你正在失去競爭條件。該呼叫在完成連接到服務器之前完成,請求被切斷,因此瀏覽器可以發送請求來刷新頁面。您需要等待請求與服務器建立連接。您需要等待readyState至少達到2。

但是爲什麼還要打一個Ajax調用,向頁面提交一個post請求。該頁面將重新加載並重定向到您來自的地方。 Ajax不是正確的解決方案。

+0

感謝您的評論@epascarello。 我基本上不在乎從服務器返回的內容,因爲我正在對數據庫執行刪除操作。我所關心的只是刪除操作發生,但這本身並沒有發生。 如果ajax不是正確的解決方案,您認爲我的問題的正確解決方案是什麼? 乾杯 – user1792935

+0

沒有足夠的時間發送請求,因爲您馬上重定向? – adeneo

+0

@ user1792935如果您關心從服務器返回的內容,則無關緊要,客戶端不會提供足夠時間外出的請求。 – epascarello

相關問題