今天终于有点时间研究了一下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 脚本跨域调用全解析相关推荐

  1. [油猴脚本开发指南]脚本ajax的跨域请求

    转载自油猴中文网:bbs.tampermonkey.net.cn 李恒道QQ4548212 油猴中文网bbs.tampermonkey.net.cn TamperMonkey GreaseMonkey ...

  2. 关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案

    问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP.NET Web API编写的服务时,会发生无法访问的情况. 重现方式 使用模板创建一个最简单的ASP.NET Web ...

  3. AJAX 跨域调用和 Java 跨域 发送请求

    AJAX 跨域调用 前台代码: Html代码   <script type="text/javascript" src="jquery-1.7.2.min.js&q ...

  4. 以短链服务为例,探讨免AppKey、免认证、Ajax跨域调用新浪微博API

    新浪微博的API官方提供了很多种调用方式,支持编程的,归根结底就是两种: 1.基于Oauth协议,使用Open API.(http://open.weibo.com/wiki/%E6%8E%88%E6 ...

  5. 一、Django前后端交互之Ajax和跨域问题

    一.Ajax介绍 1.概述 AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术.AJAX(Asynchronous Javascript And XML)翻译成中文就是" ...

  6. Ajax之跨域访问与JSONP

    前言 同源策略的限制,使得ajax无法发出跨域请求.在许多情况下,我们需要让ajax支持跨域.以下是其中一种解决方案(JSONP).JSONP解决了跨域数据访问的问题. 在html中,具有src属性的 ...

  7. jquery跨域调用webService

    jquery跨域调用webService,以及解决跨域情况下只能返回XMl格式数据的问题 http://lu.9efish.com/blog/jquery-cross-domain-call-asp. ...

  8. vb跨域访问ajax,解决AJAX的跨域访问-两种有效示例

    这篇文章主要为大家详细介绍了解决AJAX的跨域访问-两种有效示例,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧!新的W3C策略实现了HTTP跨域访问,还 ...

  9. js php调用webservice,js跨域调用WebService的使用方法

    这次给大家带来js跨域调用WebService的使用方法,js跨域调用WebService的注意事项有哪些,下面就是实战案例,一起来看一下. 步骤1. 在web.config中的system.web节 ...

  10. 解决Ajax不能跨域的方法

    1.  Ajax不能跨域请求的原因 同源策略(Same Origin Policy),是一种约定,该约定阻止当前脚本获取或者操作另一个域下的内容.所有支持Javascript的浏览器都支持同源策略,也 ...

最新文章

  1. C/C++ 程序设计员应聘常见面试试题深入剖析
  2. 这么烂的游戏也能卖2000万吗?
  3. 性能计数器取网卡流量
  4. 高并发系统数据库设计
  5. 关于 IPv6 大规模部署,给我们带来了什么~
  6. 利用 VMware vRealize - 构建和优化云管理
  7. 学习笔记5-C语言-数组
  8. caffe报错:Check failed: width <= datum_width (28 vs. 17)
  9. HTML左侧下拉列表,HTML中的下拉列表 select
  10. 《深入理解 Spring Cloud 与微服务构建》第十三章 配置中心 Spring Cloud Config
  11. 越知道自己要什么,越知道自己是什么
  12. 下面介绍几种查看linux版本信息的方法和GCC版本
  13. 八类网线和七类网线的区别_Cat8 八类网线与超五类网线、六类网线、超六类网线及七类/超七类网线的区别...
  14. How——如何学习Win32汇编
  15. 我心中的微信小程序 韩俊强的博客
  16. 用例图之间的几种关系
  17. 光谱分辨率单位_遥感图像的空间分辨率,光谱分辨率,辐射分辨率,时间分辨率...
  18. Android开发自定义水印图片
  19. 解决本地图片上传正常,服务端上传图片报500
  20. qt移植到arm开发板

热门文章

  1. Ubuntu 12.10方便操作套件
  2. ActiveMQ 命令行启动 与 嵌入式启动、MessageListener 监听消息
  3. js 图片加载时 按比例设置图片宽高_JS自动等比例缩放图片,判断网页与图片加载完成。...
  4. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_24-页面查询服务端开发-接口开发规范...
  5. 小D课堂 - 新版本微服务springcloud+Docker教程_6-02 springcloud网关组件zuul
  6. 阶段1 语言基础+高级_1-3-Java语言高级_08-JDK8新特性_第4节 方法引用_7方法引用_数组的构造器引用...
  7. lc 51. N-Queens
  8. 采用传输矩阵法求解光子晶体带隙
  9. 两台电脑如何实现共享文件
  10. 07 js自定义函数