1

サーバーを呼び出して JSON 文字列を返すスクリプトをセットアップしました。チャット サイトにログインしているユーザー数のカウントを返す呼び出しの目的。ただし、データを送り返すサーバーとデータを受け入れる私のJavaScriptの間のどこかで、データが変更されます。次のロジックを使用してこれを絞り込みました。

  1. Chrome と Firefox はどちらも完璧に動作します
  2. Internet Explorer にはありません。
  3. 各ステップにブレークポイントがある開発者ツールは、返されたデータがスクリプトの開始時点ですでに正しくないことを示しています。
  4. 論理的に、私は自分の php スクリプトに向かいました。IEから直接呼び出したところ、正しいデータがエコーされました。

期待されるデータ:

{"BestOfLife":0,"Faith":0,"BookLovers":0,"Leather":0,"Debate":0,"Sheets":0,"TheRoom":0,"TheOtherRoom":0,"GayDudes":0,"Religion":0,"Brains":0,"Flames":0,"Arrow":0,"Bow":0,"Main":3}

返されたデータ:

{"BestOfLife":0,"Faith":0,"BookLovers":0,"Leather":0,"Debate":0,"Sheets":0,"TheRoom":0,"TheOtherRoom":0,"GayDudes":0,"Religion":0,"Brains":0,"Flames":0,"Arrow":0,"Bow":0,"Main":2}

最後のキーが異なる番号を保持していることに注意してください。ほとんどのマシン (全国でテスト済み) では、これは常に 2 を返します。私の場合、時々、3が返されます。数値は (ユーザー数に基づいて) 頻繁に変更する必要があります。

これがJavaScriptです:

var userCount = createXmlHttpRequestObject();

function createXmlHttpRequestObject(){
var userCount;  

if(window.ActiveXObject){
    try{
        userCount = new ActiveXObject("Microsoft.XMLHTTP"); 
    }catch(e){
        userCount = false;
    }
}else{
    try{
        userCount = new XMLHttpRequest();
    }catch(e){
        userCount = false;
    }
}

if(!userCount){
    console.log("Can't Show User Count");
}else{
    return userCount;   
}
}

function process(){
if(userCount.readyState==0 || userCount.readyState==4){
    serverCall = "";

    userCount.open("GET", "/src/pfcusercount.php?serverCall=" + serverCall, true);

    userCount.onreadystatechange = handleServerResponse;

    userCount.send(null);

}else{
    setTimeout('process()', 1000);
}
}

function handleServerResponse(){
if(userCount.readyState==4){
    if(userCount.status==200){
            xmlResponse = userCount.responseXML;
            xmlDocumentElement = xmlResponse.documentElement;
            jsonString = xmlDocumentElement.firstChild.data;

            var roomArray = eval('(' + jsonString + ')');

            //set All the room counts

            if(roomArray['Main'] == 1){

                document.getElementById("userCount").innerHTML = '<span style="color:red">You are the only user online!</span>';

            }else{

                document.getElementById("userCount").innerHTML = '<span style="color:red">There are ' + roomArray['Main'] + ' users online!</span>';
            }

            document.getElementById("BestOfLifeC").innerHTML = '<span style="color:red">(' + roomArray['BestOfLife'] + ')</span> BestofLife'; 
            document.getElementById("FaithC").innerHTML = '<span style="color:red">(' + roomArray['Faith'] + ')</span> Faith';
            document.getElementById("BookLoversC").innerHTML = '<span style="color:red">(' + roomArray['BookLovers'] + ')</span> BookLovers';
            document.getElementById("LeatherC").innerHTML = '<span style="color:red">(' + roomArray['Leather'] + ')</span> Leather';
            document.getElementById("DebateC").innerHTML = '<span style="color:red">(' + roomArray['Debate'] + ')</span> Debate';
            document.getElementById("SheetsC").innerHTML = '<span style="color:red">(' + roomArray['Sheets'] + ')</span> Sheets';
            document.getElementById("TheRoomC").innerHTML = '<span style="color:red">(' + roomArray['TheRoom'] + ')</span> TheRoom';
            document.getElementById("TheOtherRoomC").innerHTML = '<span style="color:red">(' + roomArray['TheOtherRoom'] + ')</span> TheOtherRoom';
            document.getElementById("GayDudesC").innerHTML = '<span style="color:red">(' + roomArray['GayDudes'] + ')</span> GayDudes';
            document.getElementById("ReligionC").innerHTML = '<span style="color:red">(' + roomArray['Religion'] + ')</span> Religion';
            document.getElementById("BrainsC").innerHTML = '<span style="color:red">(' + roomArray['Brains'] + ')</span> Brains';
            document.getElementById("FlamesC").innerHTML = '<span style="color:red">(' + roomArray['Flames'] + ')</span> Flames';
            document.getElementById("ArrowC").innerHTML = '<span style="color:red">(' + roomArray['Arrow'] + ')</span> Arrow';
            document.getElementById("BowC").innerHTML = '<span style="color:red">(' + roomArray['Bow'] + ')</span> Bow';

            setTimeout('process()', 1000);

    }else{
        console.log("Unable to show user counts!");
    }
}
}

必要に応じてデータをエコーする PHP スクリプトへのリンクを次に示します。

http://www.lgbts-chat.com/src/pfcusercount.php

助けてください :) テスト目的で自由にユーザー アカウントを作成してください。今のところ、デバッグを簡単にするために、登録では電子メールの検証は行われません。必要に応じて偽物を入力してください。

4

1 に答える 1

2

わかりました、私は最終的にこれを理解しました。問題は、Internet Explorerの(かなり厄介な)ajaxをキャッシュする傾向にあることになりました。ブラウザを終了し、チャットサイトを再度開いて再度ログインすると、ユーザー数は常に合計数-1になります([新しいユーザー]はまだ考慮されていないため)。その時点から、返される文字列は常に同じでした。私の解決策は、私の呼び出しを変更することでした:

userCount.open("GET", "/src/pfcusercount.php?serverCall=" + serverCall, true);

将来必要になった場合に備えて、serverCallをプレースホルダーとしてのみ使用していたため、その上に次の行を追加しました。

serverCall = Math.random();

これにより、Internet Explorerは、各AJAXが完全に異なるエンティティであると考えるようになりました。物語の教訓:IEへの死。

于 2013-03-03T06:25:03.570 に答える