0

わかりやすいように、カレンダーを表示するホテル管理アプリケーション用の PHP スクリプトを用意しました (テーブルの列: 月の日付 / 行: 1 日あたりの料金)。

編集モードでこのスクリプトにアクセスすると、各 内に小さな要素が作成されます。

フィールドの値を変更すると、ajaxcall がバックグラウンド ジョブを実行し、更新された値をフィールドに返します (データベースで新しい値が更新されたことを確認するため)。

値をゆっくりと (フィールドごとに 1 秒以上) 変更すると、完全に機能します。しかし、速度を上げようとすると (値の編集、次のフィールドへの TAB、値の変更など)、ajaxcall はデータベースを更新しますが、フィールドの更新に失敗します。

なぜこれが起こっているのかについてのアイデアはありますか? そして、それを修正する方法は?すべてのブラウザで試しました。

HTML 部分:

<td>
    <input type='text' id='$counter' onChange='updateAvailability(this,$idroomclass,\"$date\",$counter)'
    value='$total' />
</td>  

Javascript:

function ajaxRequest() {
    try {
        var request = new XMLHttpRequest()
    } catch (e1) {
        try {
            request = new ActiveXObject("Msxml2.XMLHTTP")
        } catch (e2) {
            try {
                request = new ActiveXObject("Microsoft.XMLHTTP")
            } catch (e3) {
                request = false
            }
        }
    }
    return request
}

function updateAvailability(vagos, idroomclass, date, input_id) {
    if (vagos.value != "") {
        params = "vagos=" + vagos.value + "&idroomclass=" + idroomclass + "&date=" + date
        request = new ajaxRequest()
        request.open("POST", "ajaxcalls/updateAvailability.php", true)
        request.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
        request.setRequestHeader("Content-length", params.length)
        request.setRequestHeader("Connection", "close")
        request.onreadystatechange = function () {
            if (this.readyState == 4) {
                if (this.status == 200) {
                    document.getElementById(input_id).value = request.responseText;
                } else alert("Ajax error: " + this.statusText)
            }
        }
        request.send(params)
    }
}
4

1 に答える 1

0

アルゴリズム全体を再考する必要があると思います。

私が理解しているように、データの同時変更を許可する Web アプリケーションを作成しようとしています (この場合はカレンダー エントリ)。

これは、テキスト ドキュメントを同時に編集するために使用される一種のアルゴリズム (Google Docs など) によって解決できますが、おそらくここではやり過ぎです。

ローカル ロックを使用するアプローチを使用することをお勧めします。
ユーザーがその要素をクリックすると、AJAX 呼び出しでサーバーからその要素を変更するための「リース」が必要になります。サーバーは、クライアントに現在ロックされている (-> ユーザーは変更できない) ことを伝えるメッセージで応答するか、コンテンツの変更が許可されていることをクライアントに伝えます。彼らはそれを修正しようとします。
次に、クライアントで、(タイムアウトまで) 好きなように書くことができます。
その要素を再び離れると、クライアントはサーバーに、新しいコンテンツと、ロックが解除されたという情報を含むメッセージを送信します。

他のクライアントでもライブ アップデートが必要な場合は、現在のコンテンツをタイマーで送信できます。

于 2012-05-19T12:33:19.820 に答える