-2

私は、リセット ボタンを持つ非常に大きな html フォームに取り組んできました。リセット時に、データベース操作が実行されます。

私は、リセット時に呼び出される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 で呼び出されません。誰か提案のアイデアはありますか?

4

2 に答える 2

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 呼び出しを行うのか、ページに投稿リクエストを送信する必要があります。ページがリロードされ、元の場所にリダイレクトされます。Ajax は適切なソリューションではありません。

于 2012-11-02T00:22:06.817 に答える
0

@epascarelloの回答を拡張すると、おそらくコールバック関数を使用したいと思うでしょう。これは、投稿が完了するとコードを実行します。ここでそれについて読んでください

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

また、scrollTop は必要なく、false を返します。

コールバック関数がわからない場合は、こちらをお読みください。私が最初に JavaScript を使い始めたときのことを覚えていますが、それは非常に珍しい概念でした。

于 2012-11-02T00:25:12.330 に答える