6

我想做的是从在线 Web 服务中检索 JSON 数据,该服务在 MySQL 数据库中搜索并找到某个字符串,并使用 Javascript 在 HTML 页面上显示它。

我正在努力的实际上是显示结果数据。

我的 HTML 页面的相关区域如下所示:

<form onSubmit="results()">
    <fieldset>
        <label for="area">First digits of postal code:</label>
        <input name="area" type="text" maxlength="4" placeholder="AB12" required />
        <input type="submit" value="Search" name="search" />
    </fieldset>
</form>



<script type="text/javascript" src="jquery/jquery.min.js"></script>
<script type="text/javascript" src="cordova-2.3.0.js"></script>
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript">

function results(){
    $.ajax({
        url: 'http://www.foobar.com/cp/index.php?area=AB12',
        dataType: 'jsonp',
        jsonp: 'jsoncallback',
        timeout: 5000,
        success: function(data, status){
            $.each(data, function(i,item){
                var place = '<h1>'+item.location+'</h1>'
                + '<p>'+item.id+'</br>';

                output.append(place);
            });
        },
        error: function(){
            output.text('There was an error loading the data.');
        }
    });
};
</script>

<div id="place">
<h3>Places near your location</h3>
</div>

GET 数据的页面是http://www.foobar.com/cp/index.php,带有搜索变量“area”。测试样本是 ?area=AB12

4

2 回答 2

4

该服务似乎没有正确地将 JSON 对象包装在括号中,因此它不能用作 JSONP。

见:http ://www.entertainmentcocktail.com/cp/index.php?area=AB12&jsoncallback=TEST

它返回:

TEST[{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]

虽然它应该返回:

TEST([{"id":"5","name":"The Red Lion", ... ,"confirmed":"0"}]);

您将无法使用它,因为它不是有效的 JSONP

更新:

从评论中回答更多信息 - 如果您控制服务器端脚本,请尝试更改:

while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . json_encode($records);

到:

while($row = mysql_fetch_assoc($result)) { $records[] = $row; }
echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';

看看这是否有效。

更新 2:

回答另一条评论。你真的初始化了output变量吗?例如,开头是这样的:

var output = $('#place').append('<div/>');

你真的调用你的results函数吗?它必须被调用:

results();

或在某处注册为事件处理程序,使用 jQuery 方式:

$('form').submit(results);

但然后添加:

return false;

results函数的末尾,以防止页面被重新加载。

请参阅此演示: http: //jsbin.com/uziyek/1/edit - 它似乎有效。

另一个问题:

您的代码似乎还有另一个问题,area=AB12 参数被硬编码到您的 URL 中。相反,您应该做的是从表单中获取值并将其发送。

于 2013-01-23T13:25:08.173 回答
2

您错误地实现了 JSONP。您需要生成一个函数调用,即响应不应该foo(<json here>);foo<json here>

修复很简单:

echo $_GET['jsoncallback'] . '(' . json_encode($records) . ');';

另一个问题是您没有阻止表单提交,即当您提交表单时,页面会刷新。你必须防止这种情况。更好地将事件处理程序与 jQuery 绑定,并且不要使用内联事件处理程序:

<form id="myForm">

$(function() {
    $('#myForm').submit(function(event) {
        event.preventDefault(); // <-- prevent form submission
        // Ajax call here
    });
});

演示

于 2013-01-23T13:31:06.563 回答