热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

转:web前端面试题合集(Javascript相关)(js异步加载详解)

1.HTTP协议的状态消息都有哪些?1**:请求收到,继续处理2**:操作成功收到,分析、接受3**:完成此请求必须进一步处理4**:请求包含一个错误语法或不能完成5**:服务器执行一个完全有效请求失败   2.AJAX跨域的解决办法? 1、document.domain+iframe的设置 对于主域相同而子域不同的例子,可以通过设置doc

1. HTTP协议的状态消息都有哪些?

1**:请求收到,继续处理
2**:操作成功收到,分析、接受
3**:完成此请求必须进一步处理
4**:请求包含一个错误语法或不能完成
5**:服务器执行一个完全有效请求失败

 

 


 

2. AJAX跨域的解决办法?

 

1、document.domain+iframe的设置

 

  对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。 具体的做法是可以在http://www.a.com/a.html和http://script.a.com/b.html两个文件中分别加上 document.domain = a.com;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以交互 了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把script.a.com的domian设为alibaba.com那显然是 会报错地!代码如下:

 

  www.a.com上的a.html

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
document.domain ='a.com';
var ifr = document.createElement('iframe');
ifr.src 
='http://script.a.com/b.html';
ifr.style.display 
='none';
document.body.appendChild(ifr);
ifr.onload 
=function(){
var doc = ifr.contentDocument || ifr.contentWindow.document;
// 在这里操纵b.html
alert(doc.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
};

script.a.com上的b.html

document.domain 
='a.com';
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  这种方式适用于{www.kuqin.com, kuqin.com, script.kuqin.com, css.kuqin.com}中的任何页面相互通信。

 

  备注:某一页面的domain默认等于window.location.hostname。主域名是不带www的域名,例如a.com,主域名前面带前缀的通常都为二级域名或多级域名,例如www.a.com其实是二级域名。 domain只能设置为主域名,不可以在b.a.com中将domain设置为c.a.com。

 

  问题:
1、安全性,当一个站点(b.a.com)被攻击后,另一个站点(c.a.com)会引起安全漏洞。
2、如果一个页面中引入多个iframe,要想能够操作所有iframe,必须都得设置相同domain。

 

  2、动态创建script

 

  虽然浏览器默认禁止了跨域访问,但并不禁止在页面中引用其他域的JS文件,并可以***执行引入的JS文件中的function(包括操作COOKIE、Dom等等)。根据这一点,可以方便地通过创建script节点的方法来实现完全跨域的通信。具体的做法可以参考YUI的Get Utility

 

  这里判断script节点加载完毕还是蛮有意思的:ie只能通过script的readystatechange属性,其它浏览器是script的load事件。以下是部分判断script加载完毕的方法。

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
js.onload = js.onreadystatechange =function() {
if (!this.readyState ||this.readyState ==='loaded'||this.readyState==='complete') {
// callback在此处执行
js.onload = js.onreadystatechange =null;
}
};
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  3、利用iframe和location.hash

 

  这个办法比较绕,但是可以解决完全跨域情 况下的脚步置换问题。原理是利用location.hash来进行传值。在url: http://a.com#helloword中的#helloworld就是location.hash,改变hash并不会导致页面刷新,所以可以利 用hash值来进行数据传递,当然数据容量是有限的。假设域名a.com下的文件cs1.html要和cnblogs.com域名下的cs2.html传 递信息,cs1.html首先创建自动创建一个隐藏的iframe,iframe的src指向cnblogs.com域名下的cs2.html页面,这时 的hash值可以做参数传递用。

 

  cs2.html响应请求后再将通过修改cs1.html的hash值来传递数据(由于两个页面不在同一个域下IE、Chrome不允许修改parent.location.hash的值,所以要借助于a.com域名下的一个代理iframe;Firefox可以修改)。同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一点有变化则获取获取hash值。代码如下:

 

  先是a.com下的文件cs1.html文件:

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
function startRequest(){
var ifr = document.createElement('iframe');
ifr.style.display 
='none';
ifr.src 
='http://www.cnblogs.com/lab/cscript/cs2.html#paramdo';
document.body.appendChild(ifr);
}

function checkHash() {
try {
var data = location.hash ? location.hash.substring(1) : '';
if (console.log) {
console.log(
'Now the data is '+data);
}
catch(e) {};
}
setInterval(checkHash, 
2000);

cnblogs.com域名下的cs2.html:

//模拟一个简单的参数处理操作
switch(location.hash){
case'#paramdo':
callBack();
break;
case'#paramset':
//do something……
break;
}

function callBack(){
try {
parent.location.hash 
='somedata';
catch (e) {
// ie、chrome的安全机制无法修改parent.location.hash,
// 所以要利用一个中间的cnblogs域下的代理iframe
var ifrproxy = document.createElement('iframe');
ifrproxy.style.display 
='none';
ifrproxy.src 
='http://a.com/test/cscript/cs3.html#somedata'// 注意该文件在"a.com"域下
document.body.appendChild(ifrproxy);
}
}
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  a.com下的域名cs3.html

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
//因为parent.parent和自身属于同一个域,所以可以改变其location.hash的值
parent.parent.location.hash = self.location.hash.substring(1);
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  当然这样做也存在很多缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等……

 

  4、window.name实现的跨域数据传输

 

  文章较长列在此处不便于阅读,详细请看 window.name实现的跨域数据传输。

 

  5、使用HTML5 postMessage

 

  HTML5中最酷的新功能之一就是 跨文档消息传输Cross Document Messaging。下一代浏览器都将支持这个功能:Chrome 2.0+、Internet Explorer 8.0+, Firefox 3.0+, Opera 9.6+, 和 Safari 4.0+ 。 Facebook已经使用了这个功能,用postMessage支持基于web的实时消息传递。

 

otherWindow.postMessage(message, targetOrigin);

 

otherWindow: 对接收信息页面的window的引用。可以是页面中iframe的contentWindow属性;window.open的返回值;通过name或下标从window.frames取到的值。
message: 所要发送的数据,string类型。
targetOrigin: 用于限制otherWindow,*表示不作限制

 

  a.com/index.html中的代码:

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
 iframe id="ifr" src="b.com/index.html" /iframe
 script type="text/Javascript"
window.onload 
=function() {
var ifr = document.getElementById('ifr');
var targetOrigin ='http://b.com'// 若写成'http://b.com/c/proxy.html'效果一样
// 若写成'http://c.com'就不会执行postMessage了
ifr.contentWindow.postMessage('I was there!', targetOrigin);
};
/script
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  b.com/index.html中的代码:

 

转:web前端面试题合集 (Javascript相关)(js异步加载详解)
script type="text/Javascript"
window.addEventListener(
'message'function(event){
// 通过origin属性判断消息来源地址
if (event.origin =='http://a.com') {
alert(event.data); 
// 弹出"I was there!"
alert(event.source); // 对a.com、index.html中window对象的引用
// 但由于同源策略,这里event.source不可以访问window对象
}
}, 
false);
/script
转:web前端面试题合集 (Javascript相关)(js异步加载详解)

 

  6、利用flash

 

  这是从YUI3的IO组件中看到的办法,具体可见http://developer.yahoo.com/yui/3/io/。
  可以看在Adobe Developer Connection看到更多的跨域代理文件规范:ross-Domain Policy File Specifications、HTTP Headers Blacklist。

 

 

 

 


 

3. 同步和异步的区别?

 

一、同步加载与异步加载的形式

 

1. 同步加载

 

我们平时最常使用的就是这种同步加载形式:

 

<script src="http://yourdomain.com/script.js"></script> 

 

同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。
 js 之所以要同步执行,是因为 js 中可能有输出 document 内容、修改dom、重定向等行为,所以默认同步执行才是安全的。
以前的一般建议是把 


 w3c:async: 只要有async都是异步,如果想同步,不要async。

其实defer和async是不同的:参考:http://ued.ctrip.com/blog/?p=3121

2.使用xmlhttprequest加载:

xhr.open("get","load.js",true);  
xhr.onreadystatechange=function(){  
    if(readyState==4){  
        if(status>=200&&status<300||status==304){  
           var script = document.createElement("script");  
            script.type = "text/Javascript";  
            script.src = xhr.responseText;  
            document.body.appendChild(script);  
        }  
    }  
}  
xhr.send(null);

 


(3) 创建script,插入到DOM中,加载完毕后callBack,见代码:

 

function loadScript(url,callback)
{
      var script = document.createElement("script");
    script.type = "text/Javascript";
    if(script.readyState)//IE
    {
        script.onreadystatechange=function(){
            if(script.readyState=='loaded' || script.readyState=='complete')
            {
                console.log('complete');
 script.Onreadystatechange=null;      callback(); } } }
else { script.onload=function(){//Others: Firefox, Safari, Chrome, and Opera

            console.log('onload');
            callback();
        }
    }
    
    script.src=url;
    document.body.appendChild(script);
    
}

window.onload=function(){
    loadScript('http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js',function(){alert("loaded");});

};

mdn关于readyState说明:

当document文档正在加载时,返回"loading",当文档结束渲染但在加载内嵌资源时,返回"interactive",当文档加载完成时,返回"complete".

readystatechange事件会在document对象上的readyState属性的属性值发生变化时触发.
语法

var string = document.readyState;
例子

// 可以用来模拟DOMContentLoaded事件
document.Onreadystatechange= function () {
if (document.readyState == "complete") {
initApplication();
}
}。

 

更多:

http://www.infoq.com/cn/news/2011/09/js-promise

 


推荐阅读
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 如何撰写PHP电商项目的实战经验? ... [详细]
  • 本文详细解析了JSONP(JSON with Padding)的跨域机制及其工作原理。JSONP是一种通过动态创建``标签来实现跨域请求的技术,其核心在于利用了浏览器对``标签的宽松同源策略。文章不仅介绍了JSONP的产生背景,还深入探讨了其具体实现过程,包括如何构造请求、服务器端如何响应以及客户端如何处理返回的数据。此外,还分析了JSONP的优势和局限性,帮助读者全面理解这一技术在现代Web开发中的应用。 ... [详细]
  • 整合百度UEditor编辑器于ASP后端的实现步骤与技巧
    随着微软停止对XP系统的支持,公司已全面升级至Windows 7。早期网站创建时使用的编辑器仅兼容IE6浏览器,而如今系统更新后,原有的编辑器已无法满足新环境的需求。本文详细介绍了如何将百度UEditor编辑器整合到ASP后端,包括实现步骤和实用技巧,确保网站在新系统下仍能高效运行并提供良好的用户体验。 ... [详细]
  • Cookie是一种小型数据文件,由Web服务器生成并存储在用户的浏览器中。当用户再次访问同一服务器时,这些数据可以被重新读取,为用户提供个性化的体验。Cookie在软件测试中具有重要作用,能够帮助测试人员验证会话管理、用户偏好设置等功能的正确性和安全性。通过深入解析Cookie的工作原理及其在不同场景下的应用,本文旨在为软件测试人员提供全面的技术指导。 ... [详细]
  • Spring 中获取 Request 的多种方式及其线程安全性的深入解析
    本文深入探讨了在Spring MVC框架下获取HTTP请求对象的多种方法,详细分析了每种方法的实现原理及其线程安全性,为开发者提供了全面的技术参考。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • POJ 2482 星空中的星星:利用线段树与扫描线算法解决
    在《POJ 2482 星空中的星星》问题中,通过运用线段树和扫描线算法,可以高效地解决星星在窗口内的计数问题。该方法不仅能够快速处理大规模数据,还能确保时间复杂度的最优性,适用于各种复杂的星空模拟场景。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 2016-2017学年《网络安全实战》第三次作业
    2016-2017学年《网络安全实战》第三次作业总结了教材中关于网络信息收集技术的内容。本章主要探讨了网络踩点、网络扫描和网络查点三个关键步骤。其中,网络踩点旨在通过公开渠道收集目标信息,为后续的安全测试奠定基础,而不涉及实际的入侵行为。 ... [详细]
  • 发布时间:2010-07-27 影响版本:Internet Explorer 6 和 7 测试环境:Windows XP SP3 漏洞描述:Internet Explorer 是 Windows 操作系统中默认集成的 Web 浏览器。该漏洞源于帧边界属性的不当处理,攻击者可通过构造特定的网页内容,导致浏览器崩溃,从而引发远程拒绝服务攻击。此漏洞对用户的正常使用造成严重影响,建议用户及时更新浏览器版本以确保安全。 ... [详细]
author-avatar
我的双宝宝_486
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有