【问题标题】:Retrieve JSON GET data with Javascript/JQuery使用 Javascript/JQuery 检索 JSON GET 数据
【发布时间】:2013-01-06 23:29:28
【问题描述】:

我要做的是从在线 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”。 Test sample is ?area=AB12.

【问题讨论】:

  • 您到底遇到了什么问题?你得到的结果是什么,你期望得到什么?
  • FWIW,API 似乎没有正确支持 JSONP。附加jsoncallback=foo 返回foo[{...,这显然是错误的。您应该通知他们或查看他们的 API 文档如何进行正确的 JSONP 调用。
  • 好吧,一旦按下“提交”,页面就会刷新到?area=AB12&amp;search=Search,其他没有任何变化。我希望页面显示所有行的数据,但页面根本没有可见的变化。
  • 我自己编写了 API 只是为了完成这个单一的、简单的功能,如果这就是我将要使用它的全部,那会是一个问题吗?
  • 那你实现不正确。您需要生成一个函数调用,即响应应该是foo(&lt;json here&gt;); 而不是foo&lt;json here&gt;。修复应该很简单,然后其他一切都应该正常工作。

标签: javascript jquery html json get


【解决方案1】:

该服务似乎没有正确地将 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 中。相反,您应该做的是从表单中获取值并将其发送。

【讨论】:

  • 如何做到这一点? Web 服务上的代码是:while($row = mysql_fetch_assoc($result)) { $records[] = $row; } echo $_GET['jsoncallback'] . json_encode($records); - 这里有什么可以更改的吗?
  • Okay this is complete 但没有任何变化 - 我的 HTML 页面上仍然没有显示任何内容。
【解决方案2】:

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

修复起来很简单:

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

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

<form id="myForm">

和

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

DEMO

【讨论】:

  • 是的,这就是我所做的,一个字符一个字符 (see here)。但是,我的客户端代码仍然没有显示任何内容。
  • 非常感谢您的帮助。我正在尝试让它工作,但在$('#search').submit(event){ 的行上是否存在语法错误?
  • @Ben:修复并添加了一个 DEMO:jsfiddle.net/fkling/AKEPX。如果你对 jQuery 不是很熟悉,我真的建议你先阅读教程:docs.jquery.com/Tutorials:Getting_Started_with_jQuery.
  • 再次感谢您的耐心。我已经更新了代码and pasted it here,但是页面仍然没有任何更新。
  • 可能是因为您没有定义output。看看我的演示,试着理解它。它有效,因此它包含您需要知道的所有内容。
猜你喜欢
  • 1970-01-01
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多