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是没有域的限制相关推荐

  1. 歪打正着解决了一个AJAX跨域的问题

    这个十一,冰儿去逛了圈儿欧洲回来,回来就想逃离北京了.我听着很是心痛.这,时差还没倒回来,她就又出差了,在伸手不见五指的华北,她驱车高速路,如坠死境. 我发了张北京城仙境照,让厦门和深圳的笑喷了.我独 ...

  2. ajax 跨域请求数据,JQuery Ajax执行跨域请求数据的解决方案

    JQuery Ajax执行跨域请求数据的解决方案 今天前端因为需要ajax调用两个不同的项目,请求域不一样,所以涉及ajax跨域的问题 ,其实很简单,具体如下 原来的ajax请求如下: $.ajax( ...

  3. 数值优化 Ch.4 信赖域方法

    目录 信赖域方法 信赖域方法概述 基于柯西点的算法 柯西点 为什么要改良柯西法 狗腿法 二维子空间极小化 全局收敛性 柯西点收益 平稳点的收敛性 子问题的迭代解法 困难的情况 定理4.1的证明 基于近 ...

  4. matlab中信赖域法,第8讲信赖域方法.ppt

    第8讲信赖域方法 3.6 信赖域方法( Trust-Region Methods) * 基本思想 线性搜索与信赖域方法的联系 信赖域方法思想 信赖域半径的选择 信赖域算法 信赖域方法的收敛性 解信赖域 ...

  5. 最小二乘优化整理(信赖域方法)

    信赖域方法和线搜索类似都是迭代方法,与其不同的是,每次迭代时,在一个选定的可信赖区域内,选择当前迭代点的近似模型 mkmk ,然后计算最优步长:如果步长不合适,可以对区域进行缩放.该小结主要介绍: 信 ...

  6. JavaScript跨域方法

    一.什么是跨域 JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦.这里把涉及到跨域的一些问题简单地整理一下: ...

  7. ajax 跨域 headers JavaScript ajax 跨域请求 +设置headers 实践

    解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现. 此处手札 供后人参 ...

  8. ajax跨域请求 html5,HTML5中使用postMessage实现Ajax跨域请求的方法

    由于同源策略的限制,Javascript存在跨域通信的问题,典型的跨域问题有iframe与父级的通信等. 常规的几种解决方法: (1) document.domain+iframe: (2) 动态创建 ...

  9. 第114天:Ajax跨域请求解决方法(二)

    一.什么是跨域 我们先回顾一下域名地址的组成: http:// www . google : 8080 / script/jquery.js   http:// (协议号)       www  (子 ...

最新文章

  1. 【python学习】模块random
  2. 浅析如何从吸引蜘蛛爬取的角度进行网站内容优化建设
  3. 图像检索中相似度度量公式:各种距离
  4. mysql io线程异常_mysql主从同步IO线程NO
  5. 【深度学习】PyTorch 历史版本安装-祖传老代码运行刚需
  6. Linux多线程编程(不限Linux)
  7. 【设计模式 03】装饰模式——俄罗斯套娃?
  8. android自学之旅——layout资源文件
  9. CSS 文本装饰 text-decoration属性
  10. 笨办法学 Python · 续 引言
  11. python_图像去畸变/图像矫正
  12. 浅谈逆向——从案例谈OD的使用(OD的使用2)
  13. IDEA如何导入MySQL驱动
  14. MATLAB r2016a 配置 VLFeat 库教程(超详细,一看必会)
  15. cnPack快捷键和DelForEx快捷键冲突解决办法(cnPack快捷键设置)
  16. JavaScript基础入门
  17. Excel创建堆积柱形混合折线图
  18. 2.10 MapReduce文件合并
  19. 怎样用计算机弹虫儿飞,吉他初学者必看:虫儿飞指弹教程
  20. 小小丁出生——有图有真相

热门文章

  1. 二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
  2. 一些基本算法的递归实现
  3. golang常用命令
  4. 面试高频题: LRU缓存机制实现
  5. 简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。
  6. MF_RC522_射频识别参考程序注释(2018年4月27号)
  7. 物联网浪潮即将来袭,创业者们你需要知道这些
  8. 在ASP.NET MVC 模型中 选择最好的方法将多个model(数据模型)传递到视图
  9. 团队作业——随堂小测(同学录)
  10. 开始写博客,毕业一年的收获