javascript ajax 脚本跨域调用全解析
今天终于有点时间研究了一下javsscript ajax 脚本跨域调用的问题,先在网上随便搜了一下找到一些解决的办法,但是都比较复杂。由是转到jquery.chm用户手册当中找到一些代码片段关于ajax跨域调用的问题。代码片段如下:
crossDomain mapV1.5
默认: 同域请求为false
跨域请求为true如果你想强制跨域请求(如JSONP形式)同一域,设置crossDomain为true。这使得例如,服务器端重定向到另一个域。
这里强调如是ajax的跨域调用,dataType一定要是jsonp的格式。(什么是jsonp这里不做解释,可以google一下。)
令外还有一些代码片段:如下所示:
dataType String
预期服务器返回的数据类型。如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如XML MIME类型就被识别为XML。在1.4中,JSON就会生成一个JavaScript对象,而script则会执行这个脚本。随后服务器端返回的数据会根据这个值解析后,传递给回调函数。可用值:
"xml": 返回 XML 文档,可用 jQuery 处理。
"html": 返回纯文本 HTML 信息;包含的script标签会在插入dom时执行。
"script": 返回纯文本 JavaScript 代码。不会自动缓存结果。除非设置了"cache"参数。'''注意:'''在远程请求时(不在同一个域下),所有POST请求都将转为GET请求。(因为将使用DOM的script标签来加载)
"json": 返回 JSON 数据 。
"jsonp": JSONP 格式。使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数。
"text": 返回纯文本字符串
jsonp String
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,比如{jsonp:'onJsonPLoad'}会导致将"onJsonPLoad=?"传给服务器。
jsonpCallback String
为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也可以在想让浏览器缓存GET请求的时候,指定这个回调函数名。
以上几个重要代码片段,重点是红色字的部分,要求跨域调用ajax要指定一个callback handler函数。
看了这么多大家也一定是看腻了,直接将上述的代码组合。此段代码在域:test.com中,现在要调用http://jks.com/JsTest.aspx进行ajax验证。代码如下:
<html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><script src="js/jquery-1.4.1.js" type="text/javascript"></script><script type="text/javascript">function invokeRemoteMethod() {$.ajax({url: 'http://jks.com/JsTest.aspx?type=invoke&method=add&time=' + Math.random(),type: 'get',dataType: 'jsonp',jsonp: "callback",data: '',success: function (data) {alert(data.msg);},error: function (message) {alert(message);}});}</script> </head> <body><form id="form1" runat="server"><div><input type="button" id="but_invoke" value="调用" onclick="invokeRemoteMethod();" /></form> </body> </html>
jks.com/JsTest.aspx后台代码如下:
namespace WebApplication1 {public partial class JsTest : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){var time = Request["time"];var callback = Request["callback"];string responseData = callback + "({msg:'成功'})";Response.Write(responseData);Response.Flush();Response.End();}} }
大家看明白了吗?返回结果是通过"callback"进行返回的。什么原理呢?由于翻开jquery的源码:
ajax: function (origSettings) { ..... // If we're requesting a remote document// and trying to load JSON or Script with a GETif ( s.dataType === "script" && type === "GET" && remote ) {var head = document.getElementsByTagName("head")[0] || document.documentElement;var script = document.createElement("script");script.src = s.url;if ( s.scriptCharset ) {script.charset = s.scriptCharset;}// Handle Script loadingif ( !jsonp ) {var done = false;// Attach handlers for all browsersscript.onload = script.onreadystatechange = function() {if ( !done && (!this.readyState ||this.readyState === "loaded" || this.readyState === "complete") ) {done = true;success();complete();// Handle memory leak in IEscript.onload = script.onreadystatechange = null;if ( head && script.parentNode ) {head.removeChild( script );}}};}// Use insertBefore instead of appendChild to circumvent an IE6 bug.// This arises when a base node is used (#2709 and #4378). head.insertBefore( script, head.firstChild );// We handle everything using the script element injectionreturn undefined;} ..... });
最最关键的代码:
if ( s.dataType === "script" && type === "GET" && remote ) {
var head = document.getElementsByTagName("head")[0] || document.documentElement;
var script = document.createElement("script");
script.src = s.url;
..................
head.insertBefore( script, head.firstChild );
......
}
由于可将这段代码 function invokeRemoteMethod() {
$.ajax({
url: 'http://jks.com/JsTest.aspx?type=invoke&method=add&time=' + Math.random(),
type: 'get',
dataType: 'jsonp',
jsonp: "callback",
data: '',
success: function (data) {
alert(data.msg);
},
error: function (message) {
alert(message);
}
});
}
简单理解成:
function invokeRemoteMethod() {
var head = document.getElementsByTagName("head")[0] || document.documentElement;
var script = document.createElement("script");
script.src = 'http://jks.com/JsTest.aspx?type=invoke&method=add&time=563&callback=callbackMegthod';
head.insertBefore(script, head.firstChild);
}
以上的代码相关于在head头上加了一个脚本的引用:
<script src="http://jks.com/JsTest.aspx? type=invoke&method=add&time=563&callback=callbackMegthod" type="text/javascript"></script>
当然还要指定一个callback的方法:
function callbackMegthod(data) {
alert('callbackMegthod');
alert(data.msg);
}
还可以最白痴的理解成:
<html xmlns="http://www.w.org/1999/xhtml"> <head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title></title><script src="js/jquery-1.4.1.js" type="text/javascript"></script><script type="text/javascript">function callbackMegthod(data) {alert(data.msg);}</script> </head> <body><form id="form1" runat="server"><div><input type="button" id="but_invoke" value="调用" onclick="invokeRemoteMethod();" /><script src="http://jks.com/JsTest.aspx?type=invoke&method=add&time=563&callback=callbackMegthod" type="text/javascript"></script></form> </body> </html>
就哪大家分享到这里,希望大家要遇到类似问题时候能有所帮助。哈哈~~
转载于:https://www.cnblogs.com/jkswjw/p/3173758.html
javascript ajax 脚本跨域调用全解析相关推荐
- [油猴脚本开发指南]脚本ajax的跨域请求
转载自油猴中文网:bbs.tampermonkey.net.cn 李恒道QQ4548212 油猴中文网bbs.tampermonkey.net.cn TamperMonkey GreaseMonkey ...
- 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...
- AJAX 跨域调用和 Java 跨域 发送请求
AJAX 跨域调用 前台代码: Html代码 <script type="text/javascript" src="jquery-1.7.2.min.js&q ...
- 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API
新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...
- 一、Django前后端交互之Ajax和跨域问题
一.Ajax介绍 1.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.AJAX(Asynchronous Javascript And XML)翻译成中文就是" ...
- Ajax之跨域访问与JSONP
前言 同源策略的限制,使得ajax无法发出跨域请求.在许多情况下,我们需要让ajax支持跨域.以下是其中一种解决方案(JSONP).JSONP解决了跨域数据访问的问题. 在html中,具有src属性的 ...
- jquery跨域调用webService
jquery跨域调用webService,以及解决跨域情况下只能返回XMl格式数据的问题 http://lu.9efish.com/blog/jquery-cross-domain-call-asp. ...
- vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例
这篇文章主要为大家详细介绍了解决AJAX的跨域访问-两种有效示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!新的W3C策略实现了HTTP跨域访问,还 ...
- js php调用webservice,js跨域调用WebService的使用方法
这次给大家带来js跨域调用WebService的使用方法,js跨域调用WebService的注意事项有哪些,下面就是实战案例,一起来看一下. 步骤1. 在web.config中的system.web节 ...
- 解决Ajax不能跨域的方法
1. Ajax不能跨域请求的原因 同源策略(Same Origin Policy),是一种约定,该约定阻止当前脚本获取或者操作另一个域下的内容.所有支持Javascript的浏览器都支持同源策略,也 ...
最新文章
- C/C++ 程序设计员应聘常见面试试题深入剖析
- 这么烂的游戏也能卖2000万吗?
- 性能计数器取网卡流量
- 高并发系统数据库设计
- 关于 IPv6 大规模部署,给我们带来了什么~
- 利用 VMware vRealize - 构建和优化云管理
- 学习笔记5-C语言-数组
- caffe报错:Check failed: width <= datum_width (28 vs. 17)
- HTML左侧下拉列表,HTML中的下拉列表 select
- 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
- 越知道自己要什么,越知道自己是什么
- 下面介绍几种查看linux版本信息的方法和GCC版本
- 八类网线和七类网线的区别_Cat8 八类网线与超五类网线、六类网线、超六类网线及七类/超七类网线的区别...
- How——如何学习Win32汇编
- 我心中的微信小程序 韩俊强的博客
- 用例图之间的几种关系
- 光谱分辨率单位_遥感图像的空间分辨率,光谱分辨率,辐射分辨率,时间分辨率...
- Android开发自定义水印图片
- 解决本地图片上传正常,服务端上传图片报500
- qt移植到arm开发板
热门文章
- Ubuntu 12.10方便操作套件
- ActiveMQ 命令行启动 与 嵌入式启动、MessageListener 监听消息
- js 图片加载时 按比例设置图片宽高_JS自动等比例缩放图片,判断网页与图片加载完成。...
- 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_24-页面查询服务端开发-接口开发规范...
- 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
- 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_7方法引用_数组的构造器引用...
- lc 51. N-Queens
- 采用传输矩阵法求解光子晶体带隙
- 两台电脑如何实现共享文件
- 07 js自定义函数