gpt4 book ai didi

jquery - Jquery Ajax 请求响应错误

转载 作者:行者123 更新时间:2023-12-01 01:39:23 25 4
gpt4 key购买 nike

我有一个脚本,它将一些表单数据发布到 Quickbase,并且我在 Quickbase 的 XML 响应中收到浏览器将其解释为 JavaScript 错误的内容。现在,数据已正确记录在 Quickbase 中,但我似乎无法抑制解析错误。此外,我无法访问服务器端语言 - 只能访问客户端 JavaScript。

这是 Ajax 代码:

myObject.prototype.get = function (url, formdata, context, callback) {
var options = {
"url": url,
"type": "GET",
"data": formdata,
"context": context,
"complete": callback,
"dataType" : "jsonp",
"dataFilter" : function (data,type) {
alert(data);
}
};
jQuery.ajax(options);
};

生成的 URL 最终如下所示: https://www.quickbase.com/db/xxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&callback=jsonp1284044371978&_fid_11=www.domain.com&_fid_12=xxxxx&_fid_17=xxxxxx&_fid_6=xxxxx&_fid_10=xxxxxxxx&=No+Thanks

因为我要跨域发布,所以我使用 JSONP 数据类型,并且在收到以下 XML 响应之前,它似乎工作正常:

<?xml version="1.0" ?>
<qdbapi>
<action>API_AddRecord</action>
<errcode>0</errcode>
<errtext>No error</errtext>
<rid>740</rid>
<update_id>1284045768176</update_id>
</qdbapi>

Firebug 然后抛出此错误:

“未终止的正则表达式文字”

<errcode>0</errcode>\n

您会看到我已尝试使用 dataFilter 对响应采取行动设置,但我什至无法让它点火。脚本运行并且没有任何警报。

可能值得注意的是,我不关心 Quickbase 服务器的响应;我只是希望错误消失,因为我没有对响应执行任何操作。

编辑Vivin Paliath 在下面指出,我收到错误的原因是浏览器正在寻找要返回的 JavaScript,但由于 QuickBase 除了 XML 之外不会返回任何内容,我需要一种方法来销毁或更改响应* 结束编辑 *

谁能告诉我:

  1. 为什么 dataFilter 从不触发?
  2. 如何抑制此错误?

谢谢大家

----------

更新:我将 Vivin Paliath 的答案标记为已接受,因为它们是正确的:如果不访问代理或服务器端语言,就无法这样做。我决定朝不同的方向前进。这就是我所做的。

  1. 在页面上创建隐藏的 iframe

    <iframe id="myHiddenIframe" name"myHiddenIframe" src="#" height="1" width="1" style="display:hidden"></iframe>

  2. 提交 <form id="myForm"> 后,我收集并连载了答案:

    var myAnswers = $('#myForm').serialize();

  3. 构建我想要使用的 URL:

    var myUrl = 'https://www.quickbase.com/db/xxxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&'+myAnswers;

  4. 将 iframe 推送到我创建的 URL $('#myHiddenIframe').attr('src', myUrl);

----------

最佳答案

如果您使用的是 JSONP,那么响应应该是某种 Javascript。问题似乎是它试图在 XML 上运行 eval ,而 XML 不是有效的 Javascript(从我访问您提供的链接后可以看到的情况来看)。这就是您看到解析器错误的原因。 QuickBase 似乎没有生成有效的 Javascript。

如果您有权访问服务器端的某些内容,则可以创建一个代理,该代理将转到 QuickBase 并将 XML 返回到您的 AJAX 调用。这可能是您最好的选择(特别是如果 QuickBase 不支持 JSONP)。

JSONP 击败同源策略的方法是使用 SCRIPTSCRIPT 标记不符契约(Contract)源策略,因此您可以加载位于不同域的 Javascript 文件。但是,要使用 JSONP,主机站点必须支持 JSONP。这意味着,如果您在请求中指定回调,它必须返回使用您在请求中指定的回调的有效 Javascript。因此,如果 QuickBase 支持 JSONP,它可能会返回如下内容:

jsonp1284044371978({
qdbapi: {
action: "API AddRecord",
errcode: 32,
errtext: "No such database",
errdetail: "The application does not exist or was deleted. If you followed a link to get here, you may want to inform the author of that link that the application no longer exists.",
dbid: "xxxxxx"
}
});

此数据现在位于 SCRIPT 标记中,可以立即对其进行评估。由于您指定了回调函数,因此现在将使用 QuickBase 返回的数据来调用您的回调。

您面临的问题是 QuickBook 返回的数据是 XML 而不是 Javascript。因此您的 SCRIPT 标记如下所示:

<script type="text/javascript" src="https://www.quickbase.com/db/xxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&callback=jsonp1284044371978&_fid_11=www.domain.com&_fid_12=xxxxx&_fid_17=xxxxxx&_fid_6=xxxxx&_fid_10=xxxxxxxx&=No+Thanks">
</script>

本质上是:

<script type="text/javascript">
<qdbapi>
<action>API_AddRecord</action>
<errcode>32</errcode>
<errtext>No such database</errtext>
<errdetail>
The application does not exist or was deleted. If you followed a link to get here, you may want to inform the author of that link that the application no longer exists.
</errdetail>
<dbid>xxxxxx</dbid>
</qdbapi>
</script>

正如您所知,这不是有效的 Javascript。不幸的是,在这种情况下,如果不使用代理就无法解决这个问题(据我所知,您无法“拦截” SCRIPT 标记接收的数据)。无论数据如何返回,您都可以使用代理将其包装为替代形式,甚至将其作为直接 XML 返回(jQuery 支持)。如果您有代理,则您将调用您的代理,而代理又调用 QuickBase,而不是调用 QuickBase。然后,您的代理将 XML 返回到您的 AJAX 调用。您真正需要的唯一更改是将 jQuery AJAX 调用中的 dataType 设置为 xml 而不是 jsonp

编辑

根据 Jon 的评论,您也可以使用 IFRAME

关于jquery - Jquery Ajax 请求响应错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678085/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com