最近应聘前端开发,遇到不少问题,在此作个总结整理。
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分为三部分:
- 核心DOM:遍历DOM树、添加新节点、删除节点、修改节点
- HTML DOM:以一种简便的方法访问DOM树
- 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);
}