0

我对 Ajax 有点陌生,我一直在尝试找出我做错了什么。我从数据库中提取结果并放入 xml。当我通过 xml 循环时,我正在尝试执行一个 php 文件,同时将 xml 结果中的 ID 号发送给它,然后从 php 文件中返回“echo”。我不确定我是完全关闭还是只是缺少一部分,但结果返回“未定义”。

这是我试图回显并显示出来的 php 文件。

echo rating_bar($id);

function rating_bar($id) {

    //other code, but $static_rater is what gets echoed

    $static_rater = "";
    $static_rater .= '<div id="ratingblock" class="ratingblock">';
    $static_rater .= '<div id="unit_long'.$id.'">';
    $static_rater .= '<ul id="unit_ul'.$id.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;">';
    $static_rater .= '<li class="current-rating" style="width:'.$rating_width.'px;"></li>';
    $static_rater .= '</ul>';
    $static_rater .= '<p class="static">Rating: <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.' cast)</p>';
    $static_rater .= '</div>';
    $static_rater .= '</div>';

    //return join("\n", $static_rater);
    echo $static_rater;exit;
}

这是我试图返回结果的 .js 代码。

downloadUrl("phpsqlajax_genxml.php", function(data) {
    var xml = data.responseXML; 
    var bounds = new google.maps.LatLngBounds();
    var markers = xml.documentElement.getElementsByTagName("marker"); 
    // alert("downloadUrl callback, length="+markers.length);

    for (var i = 0; i < markers.length; i++)  { 
        var id = markers[i].getAttribute("id");
        if (!id) id = "id "+i;
        var name = markers[i].getAttribute("name");
        if (!name) name = "name "+i;
        var address = markers[i].getAttribute("address"); 
        if (!address) address = "address";
        var citystate = markers[i].getAttribute("citystate");
        if (!citystate) citystate = "city, ST";
        var phone = markers[i].getAttribute("phone");
        if (!phone) phone = "phone number";
        var type = markers[i].getAttribute("type");
        var point = new google.maps.LatLng( 
          parseFloat(markers[i].getAttribute("lat")), 
          parseFloat(markers[i].getAttribute("lng"))); 
        bounds.extend(point);
        var html = "<b>" + name + "</b> <br/>" + address + "<br/>" + citystate + "<br/>" + phone;  //html inside InfoWindow 
        var url = "starrating/_drawrating.php?id=" + id + "";
        //var contentString = ajaxLoad(url, parseResults, true);
        //var contentString =   downloadUrl(url, "POST", "text=" + text, completed);
        var contentString = AJAX('starrating/_drawrating.php','id='+id,
            function(data) {
                var htm = $("#ratingblock").html(data);
                alert(htm);
           }
      );

        var description = "<br><br>description" + id + " <br><b>" + name + "</b> <br/>" + address + "<br/>" + citystate + "<br/>" + phone;  //html inside InfoWindow
        var icon = customIcons[type] || {}; 
        var marker = new google.maps.Marker({ 
            map: map, 
            position: point, 
            icon: icon.icon, 
            shadow: icon.shadow,
            animation: google.maps.Animation.DROP
        }); 
        bindInfoWindow(marker, map, infoBubble, html, description, contentString); 
    } 
}); 


function AJAX(url, data, callback)
{
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
    {
        callback(xmlhttp.responseText);
    }
}
xmlhttp.open("POST",url,true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send(data);

}

编辑:好的,所以我一直在玩这个并更新了我上面的代码。现在,当我使用 firebug 运行它时,我可以看到帖子并且响应是这样的:

<div id="ratingblock" class="ratingblock"><div id="unit_long10"><ul id="unit_ul10" class="unit-rating" style="width:150px;"><li class="current-rating" style="width:0px;"></li></ul><p class="static">Rating: <strong> 0.0</strong>/5 (0 votes cast)</p></div></div>

但警报只显示 [object Object],而 infowindow 显示 [object Object]。所以我知道它的调用和返回数据,我搜索并尝试了我能想到的一切,以使上述部分正确显示在信息窗口中。有什么想法吗?

编辑#2

我在下面尝试一种新方法。

var contentString = $.ajax({
                            type:"POST",
                            url: "starrating/_drawrating.php",
                            dataType: "html",
                            data:"id="+id,
                            success: function(data){
                                    var $response=$(data);
                                    $response.find('ratingblock').html();
                                    console.log($response);
                                }
                        });

控制台返回“Object[div#ratingblock.ratingblock]”,但结果仍然显示 [object Object]。任何想法我缺少什么?

4

3 回答 3

1

AJAX 中的 A 代表异步,意思是 JS 不会等待 PHP 数据回来。因此,您不能简单地将 AJAX 调用的结果分配给变量,您必须注册一个函数,该函数将在某些数据返回时被调用。这就是您当前为空的function(result) {}回调的用途。

这有点像要求某人取东西,同时继续进行,而不是呆在原地直到他们回来。回调函数,在这个有点狡猾的类比中,是当他们回来时你打算做什么的一个注释。

于 2013-04-09T21:01:47.680 回答
0

$static_rater是一个不能使用连接运算符的数组。

$static_rater[] = "\n".'<div class="ratingblock">';
$static_rater[] = '<div id="unit_long'.$id.'">';
$static_rater[] = '<ul id="unit_ul'.$id.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;">';
$static_rater[] = '<li class="current-rating" style="width:'.$rating_width.'px;">Currently '.$rating2.'/'.$units.'</li>';
$static_rater[] = '</ul>';
$static_rater[] = '<p class="static">'.$id.'. Rating: <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.' cast)</p>';
$static_rater[] = '</div>';
$static_rater[] = '</div>'."\n\n";
于 2013-04-09T20:37:43.637 回答
0

您在 url 中发送部分数据并在帖子正文中发送部分数据,将这两个部分都放在帖子正文中。IE

AJAX('starrating/_drawrating.php','id='+id,
于 2013-04-09T20:38:01.483 回答