(转)WEB前端开发工程师面试题大全(一)
依照我个人答案与网上相关答案进行编写
作者:刘建
毕业院校:家里蹲大学低能班
联系邮箱:243376129@qq.com
如果有错误,欢迎发邮件,本人尽量修正。
一个前端技术工程师必须掌握的知识,写得很详细了,相信看完会对大家有所帮助。
——————————————————————————————————————————————————————————————————————
当然,高手就不用看这些面试题了。
见过某个高手,有自己的个人网站,然后把工作经历(他的工作单位基本都是著名网站,比如网易)、网站作品、掌握知识的熟练程度和掌握时间做成了一个页面。
人家网上应聘直接发个网页地址就够了。
当然这样的高手很少,这些题是为了大部分人出的,检测知识面。
开始进入正题:
——————————————————————————————————————————————————————————————————————
HTML与XHTML有什么区别?
①XHTML 元素必须被正确地嵌套。
错误:<p><span>this is example.</p></span>
正确:<p><span>this is example.</span></p>
HTML下<table width=100>,可以不写引号"",
而XHTML必须正确的写成:<table width="100">
②XHTML元素必须被关闭。
错误:<p>this is example.
正确:<p>this is example.</p>
HTML下可以写:<br>,而XHTML有严格限制,每个标签都得关闭,要写成:<br />
③标签名必须用小写字母。
错误:<P>this is example.<P>
正确:<p>this is example.</p>
④XHTML 文档必须拥有根元素。所有的 XHTML 元素必须被嵌套于 <html> 根元素中。
HTML根元素:在HTML文档中,元素<html>代表了文档的根,其他所有的元素都是在该元素的基础上进行延伸或拓展的。
该元素也是HTML文档的最外层元素,因此也称为根元素。
⑤XHTML废除了一些html里面的标签,原因是制定这个规范的w3c的人觉得有些旧东西该淘汰或不科学。
在XHTML和HTML下,同样的CSS样式表解析出来会有很多细节上的小差异。
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
网站重构的测试(来自腾讯的前端工程师面试题)
HTML文档流必须从Main开始然后才是两侧
原题解答看着让人有些没说到关键点,我进行下补充。
布局基本框架
上面只是一个简化图,实际比这个复杂不少:Left与Right是固定宽度,中间Main要求自适应。
——————
文档流:文档流是文档中可显示对象在排列时所占用的位置。将窗体自上而下分成一行行,并在每行中按从左至右的挨次排放元素。
网页中大部分对象默认是占用文档流,也有一些对象是不占文档流的,比如表单中隐藏域。
当然我们也可以让占用文档流的元素转换成不占文档流,这就要用到CSS中属性position来控制。
有三种状况将使得元素离开文档流而存在,分别是浮动、绝对定位、固定定位。然则在IE中浮动元素也存在于文档流中。
浮动元素不占任何正常文档流空间,而浮动元素的定位照样基于正常的文档流,然后从文档流中抽出并且能够尽量远的挪动至左侧或者右侧。
文字内容会环绕在浮动元素四周。当一个元素从正常文档流中抽出后,依然在文档流中的其他元素将疏忽该元素并填补他原先的空间。
——————
核心问题是Html文档流必须从Main开始然后才是两侧,下面就是这个要求的Html结构
1 <div id=”main”> 2 </div> 3 <div id=”left”> 4 </div> 5 <div id=”right”> 6 </div>
常规做法把两侧放在主要内容的前面进行左右浮动,然后中间使用边距,这样有个缺点就是网速慢的时候主要内容却在最后显示。
按照上面的Html布局,如果按常规把left和right各自左右浮动,中间main使用边距的话就会出现下面这种情况:
一、使用绝对定位。
不占用文档流的先读
绝对定位需要设置左右边距(实际应用中往往需要在外面套一个相对定位的盒子)。整个Demo如下(通过Firefox与IE5.5——8测试):
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head>
4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5 <title>三栏布局</title>
6 <style type="text/css">
7 * { margin:0; padding:0; }
8 #main { position:absolute; left:200px; right:200px }/*绝对定位,使content不占据html文档流空间,让后面的left,right浮上去*/
9 #left, #right { width:200px; }
10 #left { float:left; }
11 #right { float:right; }
12 </style>
13 </head>
14 <body>
15 <div id="main">
16 <p style="height:999px; background:#fffaba; ">content</p>
17 </div>
18 <div id="left">
19 <p style="height:999px; background:#8fc41f;">left</p>
20 </div><div id="right">
21 <p style="height:999px; background:#00b7ef;">right</p>
22 </div>
23 </body>
24 </html>
CSS2引入了一种新的简单选择器:通配选择器(universal selector),显示为一个星号(*)。该选择器可以与任何元素匹配,就像是一个通配符。
例如,下面的规则可以使文档中的每个元素都为红色:
* {color:red;}
二、Main左浮动。
如果Main浮动的话首先要解决宽度自适应的问题,设置宽度100%显示,然后就得把Left拉到Main左侧,这里巧妙使用两种偏移方法。
先定义为浮动的先读。
IE6会有兼容问题,需要Hack一下。
Hack解释:一般基于开源的程序的基础,对其代码进行增加、删除或者修改、优化,使之在功能上符合新的需求。
这里的Hack就是修改的意思。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>三栏布局-浮动方法</title>
<style type="text/css">
* { margin:0; padding:0; }
#wrap { padding:0 300px 0 200px; *overflow:hidden; }
#main { float:left; width:100%; }
#left, #right { position:relative; _display:inline; }
#left { width:200px; float:left; margin-left:-100%; right:200px; _right:-300px; }
#right { width:300px; float:right; margin-right:-300px; }
</style>
</head>
<body>
<div id="wrap">
<div id="main">
<p style="height:999px; background:#fffaba; ">content</p>
</div>
<div id="left">
<p style="height:999px; background:#8fc41f;">left</p>
</div>
<div id="right">
<p style="height:999px; background:#00b7ef;">right2</p>
</div>
</div>
</body>
</html>
后记:关于侧栏宽度固定,主要部分宽度自适应的布局是再普通不过了,而大部分人的做法就是把侧栏放在自适应盒子前面,
然后进行浮动解决,从来没有想过使用最优化的html文档流完成这个布局。第一种方法由于用了绝对定位,适合在特殊应用中使用,
常规布局推荐使用第二种解决。
此题原文转自:http://www.planeart.cn/?p=446
在原文基础上进行修改。
——————————————————————————————————————————————————————————————————————
Doctype?严格模式与混杂模式,如何触发这两种模式,区分它们有何意义?
Doctype(document type 文档类型)
可声明三种DTD(document type definition 文档类型固定)类型,分别表示严格版本、过渡版本以及基于框架的 HTML 文档。
HTML
HTML 4.01 规定了三种文档类型:Strict、Transitional 以及 Frameset。
HTML Strict DTD(HTML严格模式)
如果您需要干净的标记,免于表现层的混乱,请使用此类型。请与层叠样式表(CSS)配合使用:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" " http://www.w3.org/TR/html4/strict.dtd">
HTML Transitional DTD(过度版本)
Transitional DTD 可包含 W3C 所期望移入样式表的呈现属性和元素。如果您的读者使用了不支持层叠样式表(CSS)的浏览器以至于您不得不使用 HTML 的呈现特性时,请使用此类型:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " http://www.w3.org/TR/html4/loose.dtd">
Frameset DTD
Frameset DTD 应当被用于带有框架的文档。除 frameset 元素取代了 body 元素之外,Frameset DTD 等同于 Transitional DTD:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" " http://www.w3.org/TR/html4/frameset.dtd">
进一步讲解
严格模式:必须按照声明的标准执行,规定元素的位置后,这个元素就必须在这个位置不能乱动。
好处:层次分明,便于阅读。
混杂模式:标准比较宽松,主要为了兼容,模拟老式浏览器去看老网站。了解一下就行。
关于触发
严格模式:都会有一个DTD,比如上面的DTD HTML 4.01
混杂模式:①声明一个混杂模式的DTD
②如果严格模式找不到他要执行的标准,就会变成混杂模式
区分它们的意义:
严格模式:有些老的浏览器不支持新技术设计网页的标准,所以用新技术设计的网页无法显示
混杂模式:为了让使用老浏览器的用户看到你网页的内容。
举个例子
标准模式:就如一个标准美女,样子好看,不过做饭,干家务等基本不会。
混杂模式:不是美女,有可能很普通、有可能很难看,不过能干家务。
你娶媳妇的时候觉得这两个有区别没?
——————————————————————————————————————————————————————————————————————
行内元素有哪些?块级元素有哪些?CSS的盒模型?
行内元素:
就是内联元素(inline element)一般都是基于语义级(semantic)的基本元素。内联元素只能容纳文本或者其他内联元素。
其实就是元素与元素之间不换行
a:锚点
img:图片
abbr:缩写
acronym:首字
input:输入框
span:常用内联容器,定义文本内区块
select:项目选择
var:定义变量
label:表格标签
code:计算机代码(在引用源码的时候需要)
big:大字体
b:粗体(不推荐
br:换行
cite:引用
dfn:定义字段
em:强调
i:斜体
kbd:定义键盘文本
q:短引用
s:中划线(不推荐)
samp:定义范例计算机代码
small:小字体文本
strike:中划线
strong:粗体强调
sub:下标
sup:上标
textarea:多行文本输入框
u:下划线
块级元素:
块元素一般都从新行开始,它可以容纳内联元素和其他块元素,常见块元素是段落标签P。form这个块元素比较特殊,它只能用来容纳其他块元素。
块元素(block element)和内联元素(inline element)都是html规范中的概念。块元素和内联元素的基本差异是块元素一般都从新行开始。
而当加入了css控制以后,块元素和内联元素的这种属性差异就不成为差异了。
比如,我们完全可以把内联元素cite加上display:block这样的属性,让他也有每次都从新行开始的属性。
块元素(block element)
address:地址
blockquote:块引用
center:举中对齐块
dir:目录列表
div:常用块级容易,也是css layout的主要标签
dl:定义列表
fieldset-form:控制组
form:交互表单
h1:大标题
h2:副标题
h3:3级标题
h4:4级标题
h5:5级标题
h6:6级标题
hr:水平分隔线
menu:菜单列表
noframes:frames可选内容(对于不支持frame的浏览器显示此区块内容)
noscript:可选脚本内容(对于不支持script的浏览器显示此内容)
ol:排序表单
p:段落
pre:格式化文本
table:表格
ul:非排序列表
CSS的盒子模型
顾名思义,就是用把某些内容用一个盒子包装起来,需要给这个盒子设定一些属性,才能让这个盒子看起来是个盒子

属性名:
内容:content 要放一只大闸蟹
填充:padding 需要冷藏,就用冰块,这个属性就是冰块填了多厚
边框:border 盒子纸质的厚度,用什么颜色的纸
边界:margin 别的盒子离这个盒子的距离
把上面这几个属性属性说明一下,那主考官就知道了,除非他不了解CSS
——————————————————————————————————————————————————————————————————————
如果让你来制作一个访问量很高的大型网站,你会如何来管理所有CSS文件、JS与图片
在原答案基础上,加上我个人建站的心得。
回答:涉及到人手、分工、同步;
前期团队必须确定好网站全局样式(globe.css),编码模式(utf-8)等;
编写习惯必须一致(例如都是采用继承式的写法,单样式都写成一行);
继承式写法举例
function test(a,b)
{}
var date1 =new date;
date1.test(a,b);
var date1 =new date;
date1.test(a,b);
标注样式编写人,各模块都及时标注(标注关键样式调用的地方);
易于纠正错误,查清责任。
页面进行标注(例如 页面 模块 开始和结束);
CSS跟HTML分文件夹并行存放,命名都得统一(例如style.css)
JS 分文件夹存放 命名以该JS功能为准英文翻译;
图片采用png8(256色PNG类型图片格式的别名)其他别的图片文件格式也行,保证格式基本一致,不要这几张用JPG,那几张用GIF
格式相同的整合在一起,使用方便,便于将来的管理
——————————————————————————————————————————————————————————————————————
用JS实现随机选取10到100之间的10个数字,存入到数组,并排序。
在网上看到一道题,算是有一定难度,然后那题给出的答案无论是语法还是算法,错得一塌糊涂。
以下给我自己写的答案
<script>
var array=[];
function getRandom(start,end)
{
var choice=end-start;
var a1=[];
for(var i=0;i<91;i++)
{
a1[i]=i+10
}
var a2=[];
for(var i=0;i<10;i++)
{
a2.push(a1.splice(Math.floor(Math.random()*a1.length) , 1));
a2.sort();
}
return a2;
}
array.push(getRandom(10,100));
alert(array);
</script>
测试通过,有更好答案的朋友麻烦告诉我这低能儿一声,感激不尽。
——————————————————————————————————————————————————————————————————————
双击表格每一列头进行该列整行排序,再双击倒序。(腾讯2012前端开发笔试题)
涉及到很多知识点,建议认真看看。不愧为腾讯,这题实在不容易。
1 以下的代码直接存为sortTable.js,在页面中包含:
2 <script type="text/javascript" src="sortTable.js"></script>
3
4 function ieOrFireFox(ob)
5 {
6 if (ob.textContent != null)
7 return ob.textContent;
8 var s = ob.innerText;
9 return s.substring(0, s.length);
10 }
11
12 //排序 tableId: 表的id,iCol:第几列 ;dataType:iCol对应的列显示数据的数据类型
13 function sortAble(tableId, iCol, dataType)
14 {
15 var table = document.getElementById(tableId);
16 var tbody = table.tBodies[0];
17 var colRows = tbody.rows;
18 var aTrs = new Array;
19 //将将得到的列放入数组,备用
20 for (var i=0; i < colRows.length-1; i++)
21 {
22 aTrs[i] = colRows[i+1];
23 }
24
25 //判断上一次排列的列和现在需要排列的是否同一个。
26 if (table.sortCol == iCol)
27 {
28 aTrs.reverse();
29 }
30 else
31 {
32 //如果不是同一列,使用数组的sort方法,传进排序函数
33 aTrs.sort(compareEle(iCol, dataType));
34 }
35 oFragment = document.createDocumentFragment();
36
37 for (var i=0; i < aTrs.length; i++)
38 {
39 oFragment.appendChild(aTrs[i]);
40 }
41 tbody.appendChild(oFragment);
42 //记录最后一次排序的列索引
43 table.sortCol = iCol;
44 }
45 //将列的类型转化成相应的可以排列的数据类型
46 function convert(sValue, dataType)
47 {
48 switch(dataType)
49 {
50 case "int":
51 return parseInt(sValue);
52 case "float":
53 return parseFloat(sValue);
54 case "date":
55 return new Date(Date.parse(sValue));
56 default:
57 return sValue.toString();
58 }
59 }
60
61 //排序函数,iCol表示列索引,dataType表示该列的数据类型
62 function compareEle(iCol, dataType)
63 {
64 return function (oTR1, oTR2)
65 {
66 var vValue1 = convert(ieOrFireFox(oTR1.cells[iCol]), dataType);
67 var vValue2 = convert(ieOrFireFox(oTR2.cells[iCol]), dataType);
68 if (vValue1 < vValue2)
69 {
70 return -1;
71 }
72 else if (vValue1 > vValue2)
73 {
74 return 1;
75 }
76 else
77 {
78 return 0;
79 }
80 };
81 }
82
83
84
85
86 然后直接在页面中就可以使用排序方法了:
87
88 表格写法:
89 <table width="96%" height="" border="0" id="tableId">
90 <tr>
91 <th >日期</th>
92 <th onclick="sortAble('tableId', 1)" style="cursor:pointer">某列</th>
93 <th onclick="sortAble('tableId', 2)" style="cursor:pointer">某列</th>
94 <th onclick="sortAble('tableId', 3)" style="cursor:pointer">某列</th>
95 <th >某列</th>
96 <th >某列</th>
97 <th onclick="sortAble('tableId', 6, 'int')" style="cursor:pointer">某整数列</th>
98 </tr>
99 <tr>
100 jsp循环生成列表数据
101 </tr>
102 </table>
XML DOM textContent 属性
定义和用法
textContent 属性返回或设置选定元素的文本。
如果返回文本,则该属性返回元素节点内所有文本节点的值。
如果设置文本,则该属性删除所有子节点,并用单个文本节点来替换它们。
语法:
返回文本:
elementNode.textContent
设置文本:
elementNode.textContent=string
JavaScript sort() 方法
定义和用法
sort() 方法用于对数组的元素进行排序。
语法
arrayObject.sort(sortby)
| 参数 | 描述 |
| sortby | 可选。规定排序顺序。必须是函数。 |
返回值
对数组的引用。请注意,数组在原数组上进行排序,不生成副本。
说明
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
在本例中,我们将创建一个数组,并按字母顺序进行排序:
<script type="text/javascript"> var arr = new Array(6) arr[0] = "10" arr[1] = "5" arr[2] = "40" arr[3] = "25" arr[4] = "1000" arr[5] = "1" document.write(arr + "<br />") document.write(arr.sort()) </script>
输出:
10,5,40,25,1000,1 1,10,1000,25,40,5
请注意,上面的代码没有按照数值的大小对数字进行排序,要实现这一点,就必须使用一个排序函数:
<script type="text/javascript">
function sortNumber(a,b)
{
return a - b
}
var arr = new Array(6)
arr[0] = "10"
arr[1] = "5"
arr[2] = "40"
arr[3] = "25"
arr[4] = "1000"
arr[5] = "1"
document.write(arr + "<br />")
document.write(arr.sort(sortNumber))
</script>
输出:
10,5,40,25,1000,1 1,5,10,25,40,1000
实例
1 <html>
2 <body>
3
4 <script type="text/javascript">
5
6 function sortNumber(a, b)
7 {
8 return a - b
9 }
10
11 var arr = new Array(6)
12 arr[0] = "10"
13 arr[1] = "5"
14 arr[2] = "40"
15 arr[3] = "25"
16 arr[4] = "1000"
17 arr[5] = "1"
18
19 document.write(arr + "<br />")
20 document.write(arr.sort(sortNumber))
21
22 </script>
23
24 </body>
25 </html>
输出:
10,5,40,25,1000,1 1,5,10,25,40,1000
HTML <th> 标签
定义表格内的表头单元格。
HTML 表单中有两种类型的单元格:
- 表头单元格 - 包含表头信息(由 th 元素创建)
- 标准单元格 - 包含数据(由 td 元素创建)
th 元素内部的文本通常会呈现为居中的粗体文本,而 td 元素内的文本通常是左对齐的普通文本。
实例
普通的 HTML 表格,包含两行两列:
<table border="1">
<tr>
<th>Company</th>
<th>Address</th>
</tr>
<tr>
<td>Apple, Inc.</td>
<td>1 Infinite Loop Cupertino, CA 95014</td>
</tr>
</table>
HTML <col> 标签
<col> 标签为表格中一个或多个列定义属性值。
如需对全部列应用样式,<col> 标签很有用,这样就不需要对各个单元和各行重复应用样式了。
您只能在 table 或 colgroup 元素中使用 <col> 标签。
实例
col 元素为表格中的三个列规定了不同的对齐方式:
<table width="100%" border="1">
<col align="left" />
<col align="left" />
<col align="right" />
<tr>
<th>ISBN</th>
<th>Title</th>
<th>Price</th>
</tr>
<tr>
<td>3476896</td>
<td>My first HTML</td>
<td>$53</td>
</tr>
</table>
HTML DOM rows 集合
定义和用法
rows 集合返回表格中所有行(TableRow 对象)的一个数组,即一个 HTMLCollection。
该集合包括 <thead>、<tfoot> 和 <tbody> 中定义的所有行。
语法
tableObject.rows[]
实例
下面的例子使用了 rows 集合来显示第一行中的内容:
1 <html>
2 <head>
3 <script type="text/javascript">
4 function showRow()
5 {
6 alert(document.getElementById('myTable').rows[0].innerHTML)
7 }
8 </script>
9 </head>
10 <body>
11
12 <table id="myTable" border="1">
13 <tr>
14 <td>Row1 cell1</td>
15 <td>Row1 cell2</td>
16 </tr>
17 <tr>
18 <td>Row2 cell1</td>
19 <td>Row2 cell2</td>
20 </tr>
21 </table>
22 <br />
23 <input type="button" onclick="showRow()" value="Show innerHTML">
24
25 </body>
26 </html>
CSS cursor 属性
定义和用法
cursor 属性规定要显示的光标的类型(形状)。
该属性定义了鼠标指针放在一个元素边界范围内时所用的光标形状(不过 CSS2.1 没有定义由哪个边界确定这个范围)。
| 值 | 描述 |
|---|---|
| url |
需使用的自定义光标的 URL。 注释:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标。 |
| default | 默认光标(通常是一个箭头) |
| auto | 默认。浏览器设置的光标。 |
| crosshair | 光标呈现为十字线。 |
| pointer | 光标呈现为指示链接的指针(一只手) |
| move | 此光标指示某对象可被移动。 |
| e-resize | 此光标指示矩形框的边缘可被向右(东)移动。 |
| ne-resize | 此光标指示矩形框的边缘可被向上及向右移动(北/东)。 |
| nw-resize | 此光标指示矩形框的边缘可被向上及向左移动(北/西)。 |
| n-resize | 此光标指示矩形框的边缘可被向上(北)移动。 |
| se-resize | 此光标指示矩形框的边缘可被向下及向右移动(南/东)。 |
| sw-resize | 此光标指示矩形框的边缘可被向下及向左移动(南/西)。 |
| s-resize | 此光标指示矩形框的边缘可被向下移动(北/西)。 |
| w-resize | 此光标指示矩形框的边缘可被向左移动(西)。 |
| text | 此光标指示文本。 |
| wait | 此光标指示程序正忙(通常是一只表或沙漏)。 |
| help | 此光标指示可用的帮助(通常是一个问号或一个气球)。 |
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
——————————————————————————————————————————————————————————————————————
HTML DOM 对象
HTML DOM hash 属性
1 <html>
2 <head>
3 <script type="text/javascript">
4 function changeLink()
5 {
6 document.getElementById('venus').hash="bottom"
7 }
8 </script>
9 </head>
10 <body>
11
12 <img src="/i/eg_planets.jpg"
13 usemap="#planetmap" />
14
15 <map name="planetmap">
16 <area
17 id="venus"
18 shape="circle"
19 coords="180,139,14"
20 href ="/example/hdom/venus2.html#top"
21 alt="Venus" />
22 </map>
23
24 <input type="button" onclick="changeLink()" value="改变链接" />
25
26 </body>
27 </html>


浙公网安备 33010602011771号