21

まず、これはページを設定する理想的な方法ではありませんが、スクリプトを 1 つのファイルとして配布する必要があります。

それ以外の場合はjavascriptを使用したxhtmlドキュメントの上部にphpスクリプトがあり、特定の条件下ではXHRを使用してクエリ文字列をページ自体に送信します。上部の php がアクティブになり、渡されたコンテンツをセッションとして保存してから、自身を強制終了します (exit())。XHR は非同期であり、コンテンツを返すかどうかはチェックされません。

no element foundただし、Firefox 3 では、XHR リクエストが送信されるたびにエラー コンソールがエラーをスローします。また、 などの exit を使用するとexit('Done')、Firefox は (Done) の構文エラーを表示されている DOM に挿入するかのようにスローします。これは Opera では発生しないようです。

既に生成された xhtml ページからセッションを保存するより良い方法はありますか? もちろん、XHR で別のページに移動することもできますが、すべてを 1 つのスクリプトにまとめたいと思います。Firefox は自分自身への XHR リクエストを DOM の更新として扱いますか? なぜこのエラーが送信されるのかわかりません。


更新私が言ったように、Firefox は XHR リクエストが行われたときにのみエラーをスローします。ページは有効な XHTML であり、XHR 要求がページ自体に対して行われない限り、エラーなしで完全に機能します。

本当に何も返さないので、なぜエラーを送信しているのか疑問に思っていました。

オブジェクトから ajax リクエストを行う JavaScript スニペットを次に示します。コールバック関数なしで XHR オブジェクトを作成し、情報を投稿します。同じページを参照していない場合は正常に動作します。

 var saveState = { saveContent: function(updateActiveMenu) {
    var sendState = new ajaxObject(gV.url);
    if (!updateActiveMenu) {
        var storageContainer = document.getElementById("StorageContainer").innerHTML;
        var menu = document.getElementById("Nav").innerHTML;
        sendState.update("Containerstring="+urlencode(storageContainer)+"&Nav="+urlencode(menu)+"&Active="+gV.activeMenuItem, 'POST', true);    } }, }

そしてphpはこれを行います

if (isset($_REQUEST['Containerstring']) && isset($_REQUEST['Nav']) && isset($_REQUEST['Active'])) {
  $_SESSION['Containerarray'] = (saveContainer(regulateEscapes(urldecode($_REQUEST['Containerstring']))));
  $_SESSION['Navarray'] = (saveNav(regulateEscapes(urldecode($_REQUEST['Nav']))));
  $_SESSION['Active'] = $_REQUEST['Active'];
  exit('Done'); 
}

innerHTML を使用すべきではないことも認識していますが、それは別の話です


エラーはこれです

Error: no element found
Source File: http://localhost/ajax.php?1244648094055 
Line: 1

私が使用しているphpページでは、エラーは決して呼び出されないクエリ文字列を参照していることに注意してください。

4

2 に答える 2

25

Firefoxは、XMLとして解析できるものを取得することを期待しており、空の応答を取得するとXML解析エラーをスローします。

PHPが「exit()」を呼び出す前に、

header('Content-Type: text/plain');

Firefoxは応答をXMLとして解析しようとしないため、エラーは発生しません。

于 2009-06-10T15:07:08.990 に答える
-2

何もしなくてもFirefoxはそれを読み取ろうとするので、phpに有効なHTTP応答を返すようにする必要があります。したがって、少なくとも有効なヘッダーを返します

header("HTTP/1.0 200");
exit();
于 2009-06-10T15:08:07.990 に答える