0

ここでの長い調査の後、コールバックを介していくつかの AJAX データを処理しようとしました。私はイタリア人のユーザーなので、説明がわかりにくかったら申し訳ありません (実際、私の問題を英語で説明するのはかなり難しいです)。

コールバック経由でデータを渡そうとしています。非同期モードで作業する必要があるため、私の jQuery.ajax.async は false に設定されていません。ここで見つけたいくつかの投稿によると、関数にコールバックを渡そうとしています。しかし、アラート関数を介してこのデータを表示しようとすると、未定義であることがわかります。コードは次のとおりです。

function loadentities(id, username, password, system, host)
{
    var postData = "username=" + encodeURI(username) +
        "&password=" + encodeURI(password) +
        "&system=" + encodeURI(system) +
        "&host=" + encodeURI(host);

    jQuery.ajax({

        type: "POST",
        dataType: "json",
        data: postData,
        beforeSend: function(x) 
        {       
            if(x && x.overrideMimeType) 
            {   
                x.overrideMimeType("application/json;charset=UTF-8");
            }
        },
        url: 'operations.php?op=loadentities',
        error: function(x, textStatus, errorThrown)
        {
            alert("Request failed: " + textStatus + " " + errorThrown);
        },
        success: function(data) 
        {
            var html = "";
            for(var i=0; i < data.length; i++)
            {
                html += "<li><a onclick=\"showhide('" + data[i].entity + "');\">" + data[i].entity + "</a><ul id=\"" + data[i].entity + "\" class=\"list\"></ul></li>"; 
                loadlastfiveevents(username, password, system, host, data[i].entity, function(data)
                            {
                                 alert(data);
                                 entityData = new Array(); 
                                 for(var i = 0; i < data.length; i++)
                                 {
                                     var entityDataEntry = new Object();
                                     entityDataEntry.key = data[i].key;
                                     entityDataEntry.event = data[i].event;
                                     entityDataEntry.timestamp = data[i].timestamp;
                                     entityData.push(entityDataEntry);
                                 }
                                 alert(data[0].key);                                                      
                             });
                entitiesValues[entitiesIndex++] = data[i].entity;
            }

            jQuery(html).appendTo('#hlentity' + id);
        }
    }); //end jQuery.ajax
}

function loadlastfiveevents(username, password, system, host, entity, buildlastfiveevents)
{
    var postData = "username=" + encodeURI(username) +
        "&password=" + encodeURI(password) +
        "&system=" + encodeURI(system) +
        "&host=" + encodeURI(host) +
        "&entity=" + encodeURI(entity);

    jQuery.ajax({

        type: "POST",
        dataType: "json",
        data: postData,
        beforeSend: function(x) 
        {       
            if(x && x.overrideMimeType) 
            {   
                x.overrideMimeType("application/json;charset=UTF-8");
            }
        },
        url: 'operations.php?op=getlatestevents',
        error: function(x, textStatus, errorThrown)
        {
            alert("Request failed: " + textStatus + " " + errorThrown);
        },
        success: function(data) 
        {
            var color = "green";
            var html = "";
            for(var i = 0; i < data.length; i++)
            {
                if(data[i].event == "SUP") color = "green";
                else if(data[i].event == "IER") color = "yellow";
                else if(data[i].event == "SDW") color = "black";
                else color = "red";
                html += "<li><img src=\"images/" + color + ".jpg\" />" + data[i].key + " " + data[i].event + " " + data[i].timestamp + "</li>"; 
            }
            jQuery(html).appendTo('#' + entity);
            propagate(entity, data[0].event);
            buildlastfiveelements(data);
        }
    }); //end jQuery
}

この投稿が十分に明確であることを願っています。しばらくお待ちいただきありがとうございます。

編集: getlatestevents (loadlastfiveevents 内) によって返される JSON コードのサンプルを次に示します。

[
    {
        "key": "error",
        "event": "SUP",
        "timestamp": "2012-11-16 11:13:36"
    },
    {
        "key": "error",
        "event": "SDW",
        "timestamp": "2012-11-16 11:12:57"
    },
    {
        "key": "error",
        "event": "SUP",
        "timestamp": "2012-11-16 11:11:32"
    },
    {
        "key": "error",
        "event": "SDW",
        "timestamp": "2012-11-15 19:40:31"
    },
    {
        "key": "timeout",
        "event": "SER",
        "timestamp": "2012-11-15 19:30:54"
    }
]
4

2 に答える 2

2

これは機能しません。

データ型をjsonに設定しています。つまり、JSONの結果が返されることを期待していますが、それ以外は失敗します。

次にfor、返されたJSONオブジェクトの長さに基づいて反復するループを使用します。オブジェクトには長さがないため、forループは実行されません。

長さプロパティを持つ配列を期待していますが、データ型がJSONに設定されているために通過しないか、長さプロパティを持たないJSONオブジェクトとして通過するオブジェクトを期待していますfor(key in object)および$.each(object, function(key, value) {...})などでループする必要があります。

于 2012-11-18T19:10:41.803 に答える
0

HTTPリクエストが実際に何かを返していることを確認しますか?要求している完全なURLと、関数に指定しているさまざまなパラメーターを指定できます。

于 2012-11-18T18:46:15.903 に答える