前端面试题(二)

最近应聘前端开发,遇到不少问题,在此作个总结整理。

1. AJAX发送请求为什么会乱码?怎样解决?

摘要: 有的时候虽然设置了全站的编码,但仍可能出现中文乱码的问题,主要体现在get方法提交的请求。

1.1 从客户端到服务器端:

url地址后要传中文参数,url就要编码,用encodeURI(url)方法。
这里要注意encode方法要使用两次,即encodeURI(encodeURI(url));如果只使用一次,则在服务器端要再进行一次编码。

1.2 从服务器端到客户端:

服务器端的编码格式一般用utf-8,所有传到页面也应该用utf-8解码,页面设置为:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如果是jsp的页面,要加上:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

如果用了框架,如struts,ajax异步后,其实是返回一个空白页面的,而这个页面我们是看不到的,ajax只是接受其中的html内容而已,所以这个页面无法用utf-8编码,因此如果有这种情况的话,保险起见,在服务器端写如下代码:

response.setContentType("text/html;charset=utf-8");

2. DOM和HTMLDOM有什么区别与联系?

2.1 DOM分为三部分:

  1. 核心DOM:遍历DOM树、添加新节点、删除节点、修改节点
  2. HTML DOM:以一种简便的方法访问DOM树
  3. XML DOM:用于操作XML文档

2.2 核心DOM与HTML DOM的区别:

核心DOM

1.1 对象:Document,Node,   ElementNode,TextNode,AttributeNode,CommentNode,NodeList 

1.2 核心DOM提供了统一的操作接口
createElement、 appendChild、setAttribute、removeAttribute、nodeName ...

1.3 核心DOM创建新元素:
    var newNode=document.createElement("img")

给元素添加属性:

    e.setAttribure(‘’,‘’)
    e.setAttribureNode(attr)

1.4 适用场合:
    核心DOM适合操作节点,如创建,删除,查找等

HTML DOM

2.1 对象:image,Table,Form,Input,Select...HTML标签对象化
    注:TableCell:td;TableRow:tr

2.2 HTML DOM提供了封装好的各种对象
    Image、Select、Option...

2.3 HTML DOM创建新元素

    var newNode=new Image();

给元素添加属性:

    img.src='';
    img.id='';
    imd.title='';
    img.className=''
    img.style.display='';

这是典型的HTML DOM方法,他将创建元素以及访问元素的属性这些方法都简化了,直接把属性当做是对象的属性。

2.4 适用场合:
    HTML DOM适合操作属性,如读取或修改属性的值

3. 什么是事件流?

3.1 事件冒泡

IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档)。

3.2 事件捕获

事件捕获的思想是不太具体的节点应该更早的接收到事件,而最具体的节点应该在最后接收到节点。事件捕获的用意在于事件到达预定目标之前捕获它。

3.3 DOM事件流

“DOM2级事件流”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和冒泡阶段。首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件。最后一个阶段是冒泡阶段,可以在这个阶段对事件作出响应。以简单的HTML页面为例,单击<div>元素会按照下图顺序触发事件

图片

在DOM事件流中,实际的目标(<div>元素)在捕获阶段不会接收到事件。这意味着在捕获阶段,事件从document到<html>再到<body>后就停止了。下一个阶段是“处于目标”阶段,于是事件在<div>上发生,并在事件处理中被看成冒泡阶段的一部分。然后冒泡阶段发生,事件又传播回文档。

多数支持DOM事件流的浏览器都实现了一种特定行为;即使“DOM2级事件”规范明确要求捕获阶段不会涉及事件的目标,但Safari、Chrome、Firefox和Opera9.5及更高版本都会在捕获阶段触发事件对象上的事件。结果,就是有两个机会在目标对象上面操作事件。

Opera、Firefox、Chrome和Safari都支持DOM事件流;IE不支持DOM事件流。

4. 解决跨域有哪些办法?

4.1 jsonp

XMLHttpRequest请求不同域上的数据是不可以的,但是引入不同域上的js文件是允许的。例如,请求http://example.com/data.php的json数据,可以在前台页面这样请求:

<script src="http://example.com/data.php?callback=do"></script>

4.2 修改document.domain

讲两个页面的document.domain设置成相同域名即可,js中设置,形如:

document.domain = "";

4.3 window.name

在一个窗口中,窗口载入的所有页面共享一个window.name,每个页面都对window.name具有读写权限,可以在window.name中设置想要的数据。

4.4 H5 Api: window.postMessage

window.postMessage可以向任何window对象传送数据。例如:

  • a.html
    iframe.contentWindow.postMessage(msg);
  • b.html
    window.onmessage = function (e) {
        e = e || event;
        alert(e.data);
    }

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值