【问题标题】:$.getJSON just not working for me$.getJSON 只是不适合我
【发布时间】:2011-09-15 22:55:08
【问题描述】:

我在很多地方读到过,将&callback=? 添加到 $.getJSON 中的 URL 将允许跨域 JSON 获取。 (例如参见:http://www.ibm.com/developerworks/library/wa-aj-jsonp1/) 但这对我不起作用。

这是我的表格:

    <form id="commentForm_pub4101" class="commentForm" action="/SubmitComment" method="POST">
    <h3>Your comment:</h3>

        <div class="commentFormTopData commentFormRow">
            <label for="Commenter">your name</label>

            <input class="commentFormCommenter" id="Commenter" name="Commenter" type="text" value="" />
            <label for="Email">e-mail</label>
            <input class="commentFormEmail" id="Email" name="Email" type="text" value="" />
        </div>

        <div class="commentFormBody commentFormRow">
            <label for="Body">comment</label>
            <textarea class="commentFormBody" cols="20" id="Body" name="Body" rows="2"></textarea>
        </div>
    </form>

这是我的 jQuery:

$('form[action$="SubmitComment"]').submit(function (event) {
    event.preventDefault();
    $.getJSON('http://localhost/Comments/index.asp?Title=TESTTitle&Commenter=TESTCommenter&Email=TESTemail&Body=TESTBody&PublicationId=TESTPublicationId&callback=?',
            function (data2) {
                alert(data2.Title);
            }
        );
});

目标 URL 是一个经典的 ASP 脚本(不要问为什么——它很复杂),使用 JSON_2.0.4.asp 库返回一个 JSON 结果。我认为这与问题无关,因为这是直接浏览器调用 URL 的返回结果:

{"Commenter":"TESTCommenter","Email":"TESTemail","Body":"TESTBody","PublicationId":"TESTPublicationId","Title":"TESTTitle"}

但如果你坚持,这里是代码(此时是测试):

<!--#include file="JSON_2.0.4.asp"-->
<%
Dim body: body = Request("")
Dim jsa: Set jsa = jsObject()
jsa("Commenter") = Request("Commenter")
jsa("Email") = Request("Email")
jsa("Body") = Request("Body")
jsa("PublicationId") = Request("PublicationId")
jsa("Title") = Request("Title")
jsa.Flush
%>      

...所以当我把所有这些测试代码放在一起时....不爱了。没有包含“TESTTitle”的警报窗口。

我做错了什么??

【问题讨论】:

    标签: jquery getjson


    【解决方案1】:

    要进行跨域 JSON,它使用 JSONP 格式。

    当 JSON 响应如下所示时:

    {"name":"value"}
    

    对应的 JSONP 响应如下所示:

    callBackName({"name":"value"})
    

    callBackName 是您在查询字符串中发送的回调。

    因此,您的 ASP 代码必须获取该参数,并将 JSON 包装在函数调用中。

    【讨论】:

    • {"name":value"} 你的意思是{"name": "value"} ;)
    【解决方案2】:

    JSONP 需要一个回调包装器。见http://en.wikipedia.org/wiki/JSONP

    例如example.com?foo.php?callback=bar

    返回

    bar({json});
    

    【讨论】:

    • jQuery 自动创建回调包装器
    • @Alnitak:是的,但是响应必须包含围绕 JSON 的函数调用。
    • 啊,是的 - 我明白你的意思 - 你的意思是 server 响应需要那个包装器。
    【解决方案3】:

    callback=? 将被替换为 callback=jQuery1238123883。您的 ASP 页面负责获取该回调值。然后当且仅当设置了回调时,将返回的 JSON 包装在具有该回调名称的函数中。

    【讨论】:

      【解决方案4】:

      在意识到这应该是 JSONP 调用之前,我已经看到了由 jQuery 转义 ? 引起的类似问题。

      解决方案是使用备用参数集:

      $.getJSON('http://localhost/Comments/index.asp?json.wrf=?', {
          Title: 'TESTTitle',
          Commenter: 'TESTCommenter',
          Email: 'TESTemail',
          Body: 'TESTBody',
          PublicationId: 'TESTPublicationId'
      });
      

      【讨论】:

      • 事实证明这也是是一个问题——太糟糕了,我不能接受 2 个答案。
      【解决方案5】:

      试试这个:

      $.getJSON('http://localhost/Comments/index.asp?Title=TESTTitle&Commenter=TESTCommenter&Email=TESTemail&Body=TESTBody&PublicationId=TESTPublicationId&callback=?',null,
              function (data2) {
                  alert(data2.Title);
              }
          );
      

      【讨论】:

      • 如果省略 data 参数,jQuery 会移动参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 2018-08-04
      • 2016-03-05
      • 2014-02-22
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多