3

私はJavaScriptを初めて使用し、数人の開発者と一緒に趣味のプロジェクトに取り組んでいます。データベースにリクエストを送信するために使用される単純なページがあります。

私はJQueryを学ぼうと決心し、このリクエストページにいくつかのAJAX機能を実装し始めました。FireFox、IE、Safariでは問題なく動作しますが、奇妙な理由でChromeでは動作しません。

私はそれを数時間デバッグしてきましたが、なぜそれが機能しないのか分かりません。HTMLフォームの関連部分は次のとおりです(JavaScriptのためにポストアクションが削除されました):

        <form method="POST">
            <input type="text" name="amount" value="0" size="7" />
            <input type="submit" value="Fulfill!" /><br />
            <input type="hidden" name="index" value="69" />
            <input type="hidden" name="item" value="Iron Ore" />
        </form>

そして、これが投稿先のPHPフォームです。

<?php
require_once("../classes/Database.php");
$database = new Database();

$amount = $database->sanitizeString($_POST['amount']);
$index = $database->sanitizeString($_POST['index']);
$username = $database->sanitizeString($_POST['username']);
$item =  $database->sanitizeString($_POST['item']);
$database->connect();
$database->setRequest($amount, $index, $username, $item);
$database->setKarma($username, $amount, $item);
?>

そして最も重要なのは、HTMLファイルに含まれている初心者のJavaScriptコードです。

<script language="JavaScript">
    var amount = 0;
    var index = 0;
    var item = 0;
    var username = "";
    var data = "";
    $(document).ready(function(){
        $("form input[type=submit]").click(function(){
            amount = $(this).siblings("input[name=amount]").val();
            index = $(this).siblings("input[name=index]").val();
            item = $(this).siblings("input[name=item]").val();
            username = "<?=$_SESSION['username']; ?>";
            //var stuff = $.post("pages/ajaxfulfill.php", {amount:amount,index:index,item:item, username:username}, function(data){alert(data)}, "html");
            var stuff = $.ajax(
                                    {
                                        url: "pages/ajaxfulfill.php",
                                        type: "POST", data:"amount=" + amount + "&index=" + index + "&item=" + item + "&username=" + username,
                                        success: function(data)
                                        {
                                            alert("Success")
                                        },
                                        error: function (XMLHttpRequest, textStatus, errorThrown)
                                        {
                                            alert("error" + XMLHttpRequest.status);
                                            alert("error" + XMLHttpRequest.responseText);
                                        }
                                    }
                               )
            $(this).parents("td").text("Submitted");

        });

    });

</script>

最初は、コメントアウトされた$ .post関数を使用していました。これは、上記のブラウザーで機能します。デバッグプロセス中に$.ajax関数に切り替えようとしましたが、FF、IE、Safariは常に「成功」​​アラートを返しますが、Chromeはステータス0のエラーと空白の応答を返します。

JavaScriptの初心者なので、なぜこれが失敗するのか完全に迷っています。誰かが私を正しい方向に向けることができれば、あなたは私の深い敬意と願いを持っているでしょう。ありがとう。

4

4 に答える 4

4

送信ボタンのデフォルトのアクションを妨げているようには見えません。したがって、クリック関数が起動した後も、フォームは送信され、おそらくXMLHttpRequestがキャンセルされます。

(ここでクロスブラウザーに違いをもたらす可能性があるのは、関数の最後に関数を呼び出してページからフォームを削除することですtext()。それでフォームの送信を停止する必要がありますか?わからない...一部のブラウザーはそうかもしれませんが、そのように言う仕様はありません。)

event.preventDefault();ハンドラーに渡された引数を使用してfunction(event) { ... }、フォームを送信するためのボタンのクリックを停止します。

ただし、フォーム送信コードを入力ボタンにバインドしないでください。スクリプトは(ブラウザやフォームの他の属性によっては)Enterキーを押すなどの別の種類の送信で起動しない場合があります。常に、それ自体のsubmitイベントを使用して検証とAJAX-form-replacementをバインドしformます。event.preventDefault();引き続き適用されます。

actionaの属性を省略すること<form>は無効です。ブラウザは通常、送信する既存のページのURLを選択します。フォームのないフォームフィールドを送信する場合(および無線入力は必要ない場合)は、<form>要素を省略してください。しかし、実際にはプログレッシブエンハンスメントを使用する必要があります。最初にプレーンHTMLから適切なを使用してフォームを機能させmethod="POST" action="ajaxfulfill.php"次にその上に簡単なAJAX関数を作成します。

username = "<?=$_SESSION['username']; ?>";

スクリプトインジェクション。その代わり:

username= <?= json_encode($_SESSION['username'], JSON_HEX_TAG); ?>

と:

data:"amount=" + amount + "&index=" + index + "&item=" + item + "&username=" + username,

encodeURIComponent(...)URLエンコードされたフォーム送信の各値を使用する必要があります。そうしないと、特殊文字によって分割されます。jQueryにそれをさせたほうがいいです:

data: {amount: amount, index: index, item: item, username: username},

またはさらに簡単に、すべての手動読み取りを削除し、すべてを実行field.val()する既存のシリアル化機能を使用します。

data: $(this).serialize(),

(これで処理していると仮定しますthis...送信ボタンの場合は、言う必要があります。)formonsubmit$(this.form)

ユーザーが変更した可能性のある、ユーザーが送信したPOSTデータからユーザー名を取得しますか?ユーザー名が意図的にセキュリティフリーでない限り、それが来たセッションからそれを取得することはより良い考えのように思われます。

于 2009-12-08T03:34:11.080 に答える
2

最初に行う必要があるのは、問題を切り分けることです。Chrome v4.0.249.27 (少なくとも OS X では) には、おそらく役立つと思われる開発者ツールが付属しています。そのボタンをクリックしたときに Chrome が何をしているかを確認します。また、開発者ツールの [スクリプト] タブにある [監視する式] のリストに ".ajax" を追加することもできます。

開発者ツールは、 View » Developer » Developer Toolsから見つけることができます。

于 2009-12-08T02:16:08.803 に答える
1

これを自分で診断するには、いくつかのことができます。

  1. Chrome で Shift + Ctrl + J を押して Javascript コンソールを起動し、デバッグを有効にします。ブレークポイントを固定し、関数をステップ実行する
  2. Javascript エラー/警告コンソールを監視します (他のブラウザでも)
于 2009-12-08T02:20:05.690 に答える