我有一个脚本将一些表单数据发布到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);
};
因为我是跨域发布的,所以我使用的是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之外的任何内容,我需要一种方法来销毁或改变响应 *结束编辑*
任何人都可以告诉我:
谢谢大家
更新:我将Vivin Paliath的答案标记为已接受,因为它们是正确的:如果不访问代理或服务器端语言,就无法这样做。我决定走另一个方向。这就是我所做的。
在页面上创建隐藏的iframe
<iframe id="myHiddenIframe" name"myHiddenIframe" src="#" height="1" width="1" style="display:hidden"></iframe>
提交<form id="myForm">
后,我收集并序列化了答案:
var myAnswers = $('#myForm').serialize();
构建我想要使用的网址:
var myUrl = 'https://www.quickbase.com/db/xxxxxxx?act=API_AddRecord&apptoken=xxxxxxxx&'+myAnswers;
将iframe推送到我创建的网址
$('#myHiddenIframe').attr('src', myUrl);
答案 0 :(得分:1)
如果你正在使用JSONP,那么响应应该是某种Javascript。问题似乎是它试图在XML上运行eval
这是无效的Javascript(从我访问你提供的链接后我可以看到)。这就是您看到解析器错误的原因。似乎QuickBase没有生成有效的Javascript。
如果您可以访问服务器端的某些内容,则可以创建一个转发到QuickBase的代理并将XML返回给您的AJAX调用。这可能是你最好的选择(特别是如果QuickBase不支持JSONP)。
JSONP违反同源政策的方式是使用SCRIPT
。 SCRIPT
标记不符合同源策略,因此您可以加载不同域上的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调用{/ 1}}而不是dataType
中设置xml
时,您真正需要的唯一更改。
修改强>
根据Jon的评论,您也可以使用jsonp
。
答案 1 :(得分:0)
这可能会有所帮助 - https://quickbase-script-engine.heroku.com/ - 它可以返回JSON