首页 > 代码库 > JavaScript是没有域的限制
JavaScript是没有域的限制
baidu的通行证处理都是在二级域名passport.baidu.com中处理的,但是baidu很多地方登录都好像是用ajax处理的,他是怎么做的呢?研究了一下,发现一个小技巧。镇江市测绘局
在http://zhidao.baidu.com/ 未登录用户回答问题时会用iframe调用http://zhidao.baidu.com/userlogin.html,userlogin.html 有下面的 javascript:
<SCRIPT LANGUAGE="JavaScript">document.domain="baidu.com";<!--function G(id){if(typeof(id)=="string"){return document.getElementById(id);}return id;}function showInfo(obj){ if(obj.checked == true){ G("memInfo").style.display="block"; }else{ G("memInfo").style.display="none"; }}function request(id,url){ oScript = document.getElementById(id); var head = 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); return oScript;}var loginTimer=null;var loginState=-1;var tryTime=0;function PSP_ik(isOk){ if(isOk==0){ G("errorInfo").style.display="none"; loginState=1; if(parent.loginSuccess){ parent.Pop.hide(); parent.loginSuccess(); } } else { loginFalse(); }}function loginFalse(){ loginState=0; var err=G("errorInfo"); err.innerHTML="用户名或密码错误,请重新登录"; err.style.display="block"; G("username").focus(); tryTime++; if(tryTime>1){ onLoginFailed(); }}function onLoginFailed(){ if(parent.onLoginFailed){ parent.Pop.hide(); parent.loginFailed(); }else{ document.login.u.value=http://www.mamicode.com/escape("http://zhidao.baidu.com/q"+parent.location.search); doucment.login.submit(); } }function loginTimeout(){ if(loginState==-1){ var err=G("errorInfo"); err.innerHTML="操作超时,请重新登录"; err.style.display="block"; G("username").focus(); }}function userLogin(){ var username=G(‘username‘).value; var password=G(‘password‘).value; var memPassport=G(‘memPassport‘).checked?"on":"off"; if(username.length<=0||password.length<=0){G("username").focus();return false;} var url = ‘https://passport.baidu.com/?logt&tpl=ik&t=0&keyname=ik&mem_pass=‘+memPassport+‘&username=‘+username + ‘&loginpass=‘ +escape(password)+ ‘&s=‘ + (new Date()).getTime(); loginState=-1; var login=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=http://www.mamicode.com/...;
当然baidu这段脚本中还有一些小的技巧也值得我们学习。
JavaScript是没有域的限制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。