百度的一个Ajax跨域方法 JavaScript是没有域的限制
baidu的通行证处理都是在二级域名passport.baidu.com中处理的,但是baidu很多地方登录都好像是用ajax处理的,他是怎么做的呢?研究了一下,发现一个小技巧。
在http://zhidao.baidu.com/ 未登录用户回答问题时会用iframe调用http://zhidao.baidu.com/userlogin.html,userlogin.html 有下面的 javascript:
<SCRIPTLANGUAGE="JavaScript">document.domain="baidu.com";<!-- functionG(id){if(typeof(id)=="string"){returndocument.getElementById(id);}returnid;}functionshowInfo(obj){if(obj.checked== true){G("memInfo").style.display="block";}else{G("memInfo").style.display="none";} }functionrequest(id,url){oScript=document.getElementById(id);varhead=document.getElementsByTagName("head").item(0);if(oScript) {head.removeChild(oScript);}oScript=document.createElement("script");oScript.setAttribute("src", url);oScript.setAttribute("id",id);oScript.setAttribute("type","text/javascript");oScript.setAttribute("language","javascript");head.appendChild(oScript);returnoScript; }varloginTimer=null;varloginState=-1;vartryTime=0;functionPSP_ik(isOk){if(isOk==0){G("errorInfo").style.display="none";loginState=1;if(parent.loginSuccess){parent.Pop.hide();parent.loginSuccess();}}else{loginFalse();} }functionloginFalse(){loginState=0;varerr=G("errorInfo");err.innerHTML="用户名或密码错误,请重新登录";err.style.display="block";G("username").focus();tryTime++;if(tryTime>1){onLoginFailed();} }functiononLoginFailed(){if(parent.onLoginFailed){parent.Pop.hide();parent.loginFailed();}else{document.login.u.value=escape("http://zhidao.baidu.com/q"+parent.location.search);doucment.login.submit();}}functionloginTimeout(){if(loginState==-1){varerr=G("errorInfo");err.innerHTML="操作超时,请重新登录";err.style.display="block";G("username").focus();} }functionuserLogin(){varusername=G('username').value;varpassword=G('password').value;varmemPassport=G('memPassport').checked?"on":"off";if(username.length<=0||password.length<=0){G("username").focus();return false;}varurl= 'https://passport.baidu.com/?logt&tpl=ik&t=0&keyname=ik&mem_pass='+memPassport+'&username='+username+ '&loginpass=' +escape(password)+ '&s=' +(newDate()).getTime();loginState=-1;varlogin=request("loginScript",url);loginTimer=setTimeout(loginTimeout,5000); } window.onload=function(){document.loginForm.username.focus(); document.getElementById("username").focus(); }//--> </SCRIPT>
我们可以看到request方法处理异步请求使用动态往head中添加script而不是用xmlhttp发送get请求。妙就妙在这。我们知道调用javascript是没有域的限制的。当加载完成时一样会执行。
当然请求参数只能通过拼url的方式了。url通过服务器处理后直接输出loginFalse()或者PSP_ik();非常优雅的解决了跨域的问题。
这让我们想到了用iframe当ajax上传文件一样异曲同工。如果不需要服务器反馈,google的点击计数用new img().src=...;
当然baidu这段脚本中还有一些小的技巧也值得我们学习。
相关文章:
AJAX 跨域请求 - JSONP获取JSON数据
jsonp是什么以及jsonp的使用
转载于:https://www.cnblogs.com/kt520/p/3658318.html
百度的一个Ajax跨域方法 JavaScript是没有域的限制相关推荐
- 歪打正着解决了一个AJAX跨域的问题
这个十一,冰儿去逛了圈儿欧洲回来,回来就想逃离北京了.我听着很是心痛.这,时差还没倒回来,她就又出差了,在伸手不见五指的华北,她驱车高速路,如坠死境. 我发了张北京城仙境照,让厦门和深圳的笑喷了.我独 ...
- ajax 跨域请求数据,JQuery Ajax执行跨域请求数据的解决方案
JQuery Ajax执行跨域请求数据的解决方案 今天前端因为需要ajax调用两个不同的项目,请求域不一样,所以涉及ajax跨域的问题 ,其实很简单,具体如下 原来的ajax请求如下: $.ajax( ...
- 数值优化 Ch.4 信赖域方法
目录 信赖域方法 信赖域方法概述 基于柯西点的算法 柯西点 为什么要改良柯西法 狗腿法 二维子空间极小化 全局收敛性 柯西点收益 平稳点的收敛性 子问题的迭代解法 困难的情况 定理4.1的证明 基于近 ...
- matlab中信赖域法,第8讲信赖域方法.ppt
第8讲信赖域方法 3.6 信赖域方法( Trust-Region Methods) * 基本思想 线性搜索与信赖域方法的联系 信赖域方法思想 信赖域半径的选择 信赖域算法 信赖域方法的收敛性 解信赖域 ...
- 最小二乘优化整理(信赖域方法)
信赖域方法和线搜索类似都是迭代方法,与其不同的是,每次迭代时,在一个选定的可信赖区域内,选择当前迭代点的近似模型 mkmk ,然后计算最优步长:如果步长不合适,可以对区域进行缩放.该小结主要介绍: 信 ...
- JavaScript跨域方法
一.什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: ...
- ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践
解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...
- ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法
由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) document.domain+iframe: (2) 动态创建 ...
- 第114天:Ajax跨域请求解决方法(二)
一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js http:// (协议号) www (子 ...
最新文章
- 【python学习】模块random
- 浅析如何从吸引蜘蛛爬取的角度进行网站内容优化建设
- 图像检索中相似度度量公式:各种距离
- mysql io线程异常_mysql主从同步IO线程NO
- 【深度学习】PyTorch 历史版本安装-祖传老代码运行刚需
- Linux多线程编程(不限Linux)
- 【设计模式 03】装饰模式——俄罗斯套娃?
- android自学之旅——layout资源文件
- CSS 文本装饰 text-decoration属性
- 笨办法学 Python · 续 引言
- python_图像去畸变/图像矫正
- 浅谈逆向——从案例谈OD的使用(OD的使用2)
- IDEA如何导入MySQL驱动
- MATLAB r2016a 配置 VLFeat 库教程(超详细,一看必会)
- cnPack快捷键和DelForEx快捷键冲突解决办法(cnPack快捷键设置)
- JavaScript基础入门
- Excel创建堆积柱形混合折线图
- 2.10 MapReduce文件合并
- 怎样用计算机弹虫儿飞,吉他初学者必看:虫儿飞指弹教程
- 小小丁出生——有图有真相