Javascript 在使用jQuery';是s$.ajax()还是$.getScript()方法?

Javascript 在使用jQuery';是s$.ajax()还是$.getScript()方法?,javascript,jquery,redirect,httpwebrequest,jsonp,Javascript,Jquery,Redirect,Httpwebrequest,Jsonp,在我公司的在线应用程序中,我们建立了一个基于JSONP的API,该API返回我正在开发的bookmarklet使用的一些数据。下面是我设置的一个快速测试页面,它使用jQuery的$.ajax()方法点击API URL: 如果您使用Firebug的“Net”选项卡(或类似选项卡)查看请求,您会发现URL请求成功,但由于我们的应用程序将任何未经授权的用户重定向到登录页面,因此登录页面也会被浏览器请求,并且似乎被解释为JavaScript。这不可避免地会导致异常,因为登录页面是HTML,而不是Jav

在我公司的在线应用程序中,我们建立了一个基于JSONP的API,该API返回我正在开发的bookmarklet使用的一些数据。下面是我设置的一个快速测试页面,它使用jQuery的
$.ajax()
方法点击API URL:

如果您使用Firebug的“Net”选项卡(或类似选项卡)查看请求,您会发现URL请求成功,但由于我们的应用程序将任何未经授权的用户重定向到登录页面,因此登录页面也会被浏览器请求,并且似乎被解释为JavaScript。这不可避免地会导致异常,因为登录页面是HTML,而不是JavaScript

基本上,我正在寻找任何类型的钩子来确定请求何时导致重定向——某种方式来确定URL是否解析为JSONP响应(它将执行我在bookmarklet脚本中预定义的方法),或者它是否导致重定向。我尝试将
$.ajax()
方法包装在
try{}catch(e){}
块中,但这不会捕获异常,我假设是因为请求成功,而不是将登录页面解析为JavaScript。是否有任何地方可以使用
try{}catch(e){}
块或
$.ajax()
的任何属性,使我能够深入了解异常或以其他方式确定我已被重定向

实际上我怀疑这是可能的,因为
$.getScript()
(或
$.ajax()
)的等效设置只是动态加载脚本,并且无法检查响应头,因为它是跨域的,不是真正的ajax:

我的替代方法是在一段时间内关闭
$.ajax()
,直到我得到或没有得到JSONP回调,在后一种情况下,假设用户没有登录,并提示他们这样做。不过,我不喜欢这种方法,因为它会导致向应用服务器发出大量不必要的请求,同时还会堆积JavaScript异常


谢谢你的建议

在jQuery中使用AJAX方法时,应该在请求中设置“X-request-By:XMLHttpRequest”的头


我最初的想法是,您可以检查并查看是否在服务器端设置了该头,如果是,则不发出重定向,而是发送一些带有重定向URL的JSON,并让客户端JS在响应中查找该重定向的存在,服务器仅在不是AJAXy调用时发出重定向。

在jQuery中使用AJAX方法时,应该在请求中设置“X-request-By:XMLHttpRequest”的头


我最初的想法是,您可以检查并查看是否在服务器端设置了该头,如果是,则不发出重定向,而是发送一些带有重定向URL的JSON,并让客户端JS在响应中查找该重定向的存在,服务器仅在不是AJAXy调用时才发出重定向。

根据,如果您不将数据类型指定为脚本,就像您现在所做的那样,它将尝试根据MIME类型确定响应是什么。然后还可以向$.ajax方法添加一个名为dataFilter的选项;它是一个包含两个参数的函数,dataFilter(data,type)和type是由jQuery确定的数据类型,您可以查看该类型并相应地进行处理。

根据,如果您不将dataType指定为脚本,它将尝试根据MIME类型找出响应。然后还可以向$.ajax方法添加一个名为dataFilter的选项;这是一个包含两个参数的函数,dataFilter(data,type)和type是由jQuery确定的数据类型,您可以查看类型并相应地进行处理。

请参阅谢谢,但这个问题似乎无关。jQuery的$.getScript()方法(或与“dataType:'script'”一起使用的$.ajax()方法)显然只是在DOM中添加了一个元素来动态加载JavaScript文件。它实际上不是XMLHttpRequest的一种形式——它不可能是,因为它支持跨域请求。jQuery的$.getScript()方法(或与“dataType:'script'”一起使用的$.ajax()方法)显然只是在DOM中添加了一个元素来动态加载JavaScript文件。它实际上不是XMLHttpRequest的一种形式——它不可能是,因为它支持跨域请求。但是,您可能对服务器端检查有所了解。如果API URL接收到来自未登录用户的请求,而不是将其重定向到登录页面,那么它可能只返回一个JSONP响应,指示未经授权的用户。然后我的bookmarklet可以将这些信息传递给用户。我必须和我们的铁路工人核实一下,看看这是否可行。再次感谢!是的,像Thank、Brian-$.getScript()或$.ajax()长格式的等价物实际上不是ajax请求(请参阅我上面的评论)。但是,您可能对服务器端检查有所了解。如果API URL接收到来自未登录用户的请求,而不是将其重定向到登录页面,那么它可能只返回一个JSONP响应,指示未经授权的用户。然后我的bookmarklet可以将这些信息传递给用户。我必须和我们的铁路工人核实一下,看看这是否可行。再次感谢!谢谢,亚当-但是,我认为这在我的情况下不起作用-请注意我上面的评论。谢谢,亚当-但是,我认为这在我的情况下不起作用-请注意我上面的评论。