在CORS(Cross-Origin Resource Sharing,跨域资源共享)出现以前,要实现跨域Ajax通信是很难的.
可以利用DOM中能够执行跨域请求的功能,来实现跨域通信:

浏览器到服务器的单向通信:
此项技术称为图像Ping,利用的是img.src的跨域事件
img.src只能通过侦听load和error事件来确定浏览器数据是否到达服务器,而无法获取服务器的任何内容

// 图片Ping
var img = new Image();
img.onload = img.onerror = function() {alert("Done!");
};
img.src = "http://www.example.com/test?name=Nicholas";
// 由于是单向,因此最常用于跟踪用户点击页面或动态广告的曝光次数

使用回调函数的双向通信:
此项技术被称为JSONP(JSON with padding,参数式JSON).
JSONP利用了动态<script>的src属性
使用JSONP首先得确定一个回调函数(如:handleResponse)
然后在将回调函数用?callback = handleResponse的形式拼进请求url中

// JSONP
function handleResponse(response) {    // 回调函数alert("You`re at IP address " + response.ip + ", which is in " + resonse.city + ", " +response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handleResponse";    // 带回调函数的url路劲放入src属性中
document.body.insertBefore(script, document.body.firstChild);// 注1: response是请求freegeoip.net主机,端口80,json文件的数据返回的,使用的是http协议

服务器向页面推送数据的技术:
Comet:是一种服务器向页面推送数据的技术,它引入了2个概念:长轮询和流 的实现方式

// 长轮询:
// 页面发起一个到服务器的请求,然后服务器一直保持连接打开,直到有数据可以发送
// 发送完毕后,浏览器关闭连接,随即又发起一个新的连接并等待
// 此项技术可以通过XHR对象和setTimeout事件实现.// 流
// 使用HTTP流实现:在页面的整个生命周期内只使用一个HTTP连接
// 具体来说,就是浏览器向服务器发送一个请求,然后与服务器保持连接打开状态,周期性的向浏览器发送数据
// 在Firefox、Safari、Opera和Chrome中,通过侦听readystatechange事件及检测readyState的值是否为3(接收到部分数据)
// 就可以利用XHR对象实现HTTP流// 使用XHR 对象实现HTTP流
function createStreamingClient(url, progress, finished) {var xhr = new XMLHttpRequest,received = 0;xhr.open("get", url, true);xhr.onreadystatechange = function() {var result;if( xhr.readyState == 3) {// 只取得最新数据并调整计数器result = xhr.responseText.substring(received);received += result.length;// 调用progress回调函数progress(result);} else if ( xhr.readyState == 4) {finished(xhr.responseText)}xhr.send(null);return xhr;
}
// 调用
var client = createStreamingClient("streaming.php", function(data) {alert("Received: " + data);}, function(data){alert("Done!");
});

参考《JavaScript高级程序设计》(第3版)P586~P589

javascript --- 几个其他的跨域技术(图像Ping、JSONP、Comet)相关推荐

  1. JavaScript第二十二章 跨域资源共享

    什么叫跨域? 跨域是指一个域下的文档或脚本试图去请求另一个域下的资源,这里跨域是广义的. 广义的跨域: 资源跳转: A链接.重定向.表单提交 资源嵌入: . 什么是同源策略? 同源策略/SOP(Sam ...

  2. 一头扎进httpclient企业跨域技术从零基础到大神实战案例

    一头扎进httpclient企业跨域技术从零基础到大神实战案例 一头扎进httpclient企业跨域技术从零基础到大神实战案例 一头扎进httpclient企业跨域技术从零基础到大神实战案例 下载地址 ...

  3. JavaScript Ajax与Comet——“其他跨域技术”的注意要点

    图像Ping技术 根据一个网页可以从任何网页中加载图像而不用担心使用跨域的原理, 我们可以动态的创建图像, 使用他们的onload和onerror事件处理程序来确定是否收到响应. 动态的创建图像经常用 ...

  4. 【JavaScript】父子页面之间跨域通信的方法

    由于同源策略的限制,JavaScript跨域的问题,一直是一个比较棘手的问题,为了解决页面之间的跨域通信,大家煞费苦心,研究了各种跨域方案.之前也有小网同学分享过一篇"跨域,不再纠结&quo ...

  5. javascript --- XMLHttp2级、CORS(跨域资源共享)

    FormData: // 为序列化表单以及创建与表单格式相同的数据提供了便利 var data = new FromData(); data.append("name", &quo ...

  6. 跨域技术(JSONP与CROS)

    JSONP 我们发现,Web页面上调用js文件时不受是否跨域的影响,凡是拥有"src"这个属性的标签都拥有跨域的能力,比如<script>.<img>.&l ...

  7. Ajax跨域提交JSON和JSONP

    可以直接使用$.getJSON()方法实现跨域请求,参数中必须加上callback,如: var jsonpUrl = 'http://www.test.com/index.php?c=Api_Ord ...

  8. 跨域(三)——JSONP

    一.什么是JSONP? 百度百科:JSONP(JSON with Padding)是JSON的 一种"使用模式",可用于解决主流浏览器的跨域数据访问的问题.由于同源策略,一般来说位 ...

  9. ajax跨域,json,jsonp

    由于浏览器安全模型的同源策略,ajax存在跨域问题. 解决跨域问题: 1.服务器代理 a.com中: 页面  -->  $.post( 'http://a.com/proxy.php', ..) ...

最新文章

  1. 干货丨浅析分布式系统(经典长文,值得收藏)
  2. Java基础——组合关系
  3. 数字货币交易所源码_(数字货币交易所科普)开发数字货币交易所应该注意哪些问题...
  4. Java黑皮书课后题第9章:9.7(Account类)设计一个名为Account的类,它包含……。编写一个测试程序,创建一个账户ID为1122、余额为20000美元、年利率为4.5%的Account…
  5. 【Can not lock the registry cache file】同一台机器部署多个dubbo应用(配置文件相同)
  6. Coding Interview Guide -- 括号字符串的有效性和最长有效长度
  7. android 4.4 keyfactory.getinstance 报错_Android实际开发bug大总结
  8. linux man 手册翻译,close (linux man) 翻译
  9. 2015年蓝桥杯省赛A组c++第4题
  10. Uber如何使用Mesos的?答曰:和Cassandra一起用
  11. 更改boot.ini自动进入DSRM模式
  12. 【语音识别】基于matlab矢量量化(VQ)说话人识别【含Matlab源码 575期】
  13. Stanford Dogs Dataset(斯坦福狗数据集)
  14. 利用postman测试post请求
  15. Kaptcha 使用
  16. Echarts 用GeoJson数据绘制地图
  17. 输入平方尺转换为平方米 计算机,如何用电脑打出平方?平方米符号输入步骤教程...
  18. win10快速打开网络适配器选项
  19. 很抱歉,你不涨工资,正是因为你“太努力”!
  20. matlab画某个变量的全球分布

热门文章

  1. c语言数字储存于变量,用C语言写中文数字字符串转数值变量
  2. java jar 环境变量_java-jar jar包带环境变量(参数)启动
  3. ios不行安卓可以 微信签名_王者荣耀安卓、iOS互通来了!现在可以互看好友资料...
  4. c语言中bluetooth函数,C语言中的低功耗蓝牙-使用Bluez创建GATT服务器
  5. prometheus连续查询_Prometheus 不完全避坑指南
  6. 6.Half Lambert光照Diffuse Shader
  7. SharePoint 2013 - System Features
  8. java中的内部类详解
  9. 三元表达式 列表递推 生成器表达式
  10. DIV常用属性大全自己整理