1、前端性能优化、前端技术架构、调试、前端安全性问题、前端兼容性问题、nodejs、移动端开发、HTML5/CSS3、正则表达式、web前端的瓶颈(兼容性、组件(框架)不够完善等);
2、getElementByTagName返回一个伪数组:HTML Collection;
3、getElementById只能是document.getElementById,
createElement只能是document.createElement;
4、Nodelist也是一个伪数组;
5、getElementByClassName在IE8不好用;
4、正则表达式的两种方式: a、var reg = /pattern/;
b、 var reg = new RegExp('pattern');
注意:第二种方式可以传变量,而第一种方式不行。
5、constructor:构造器(String、Number...):,也可以得到准确的构造函数。
Var a = 123;
a.constructor == Number 或者 typeof a == “number”;
6、elem.setAttribute(name,value);会在dom结构里添加该属性;而elem[“aa”] = ‘bb’,则只是存到内存里,用property的方式获取,或者elem.aa获取
7、elem.CurrentStyle,是IE获取样式的方法;
document.defaultView.getComputedStyle(elem,false),标准浏览器下获取样式的方式。
8、Height:元素内容的高度;
Widht:元素内容的宽度;
fullHeight:获取元素完整的高度,包含:获取元素(不论是隐藏还是显示的元素)完整的高度,包含:内容的高度和border-width,padding-top、padding-bottom;
fullWidth:获取元素(不论是隐藏还是显示的元素)完整的宽度,包含:内容的宽度和border-width,padding-right、padding-left;
offsetWidth:包含内容的宽度和border-width、padding-right、padding-left,但是不能得到隐藏元素的宽度;这个属性并不是W3C的标准,但是浏览器对它支持的很好;
offsetHeight:包含内容的高度和border-width、padding-top、padding-bottom,但是不能得到隐藏元素的宽度;
clientWidth:(可视区域的宽度)document.documentElement.clientWidth或者document.body.clientWidth(IE下适用);注意:document.documentElement是获取HTML根元素的;
clientHeight:可视区域(不包含滚动条,但包含padding)的高度;
innerWidth:可视区域的宽度;
outerHeight:???;
windowWidth:可视区域的宽度;
windowHeight:可视区域的高度;
scrollWidth:内容的实际宽度(可能带有滚动条,也会把真个内容的高度计算上);
scrollHeight:内容的实际高度(可能带有滚动条,也会把真个内容的高度计算上);
蓝色代表属性,黑色代表自己封装的方法(wichung-1.0.js:D:wichung培训资料),以下同上;
9、(display:none;)与(visibility:hidden;position:absolute;)的效果一样,空间都释放了;而单独使用visibility:hidden则只会隐藏,而不会释放空间;
10、left:elem.style.left;
top:elem.style.top;
offsetLeft:相对于已定位的父元素的left(可能会用上offsetParent:已定位的父元素);
offsetTop:;
scrollLeft:带有滚动条时才有意义的一个属性,指的是实际的left;
scrollTop:带有滚动条时才有意义的一个属性,指的是实际的top;
10、pageX属性是非IE的属性,不符合W3C标准,;
clientX属性各种浏览器都适用的;
offsetX是相对于目标元素来说的(IE下)
layerX是相对于目标元素来说的(非IE下);
11、获取亲爹:elem.parentNode;elem.offsetParent:代表最近的已定位的父元素,有可能是亲爹;
12、Core DOM:;
XML DOM :;
HTML DOM:;
13、元素节点(类型:1,没有nodeValue)、属性节点(类型:2,有nodeValue)、文本节点(类型:3,有nodeValue)、注释节点;
14、elem.childNodes会得到元素的所有节点(空格也算);
15、Elem.children(不符合W3C标准,但是各个浏览器支持的很好)会得到元素真正的孩子,不算空格;
16、elem.firstChild(会计算上空格)与elem.firstElementChild(,不会计算上空格,之算上真正的元素IE8及以下不支持);previousSiblings&&previousElementSibling,nextSiblings&&nextElementSibling;
17、jQuery(“#div1”).text()可以获取div1下的文本,包括div下子元素的文本都可以得到;原生的innerText属性在火狐(textContent可以用)不适用,存在兼容性问题;
18、事件:
a) 、标准下:addEventListener(‘click’,function(){},false);removeEventListener()为移除事件;
IE下:attachEvent(‘onclick’,function(){}),但是attach下的this不是指定的元素,而是window;detachEvent()为移除事件;
19、所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。
XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。所有现代浏览器(IE7+、Firefox、Chrome、Safari 以及 Opera)均内建 XMLHttpRequest 对象。
GET方式:
xmlhttp.open("GET","demo_get.asp",true);
xmlhttp.send();
POST方式(以下方式是在提交表单数据时常用的,也可以写成上面get方式的形式):
xmlhttp.open("POST","ajax_test.asp",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("fname=Bill&lname=Gates");
当readyState发生变化时,则会触发这个事件:
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
Data = xmlhttp.responseText;
//下面则进行对返回的数据data的操作。
}
}
几种状态:
readyState |
存有 XMLHttpRequest 的状态。从 0 到 4 发生变化。 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4: 请求已完成,且响应已就绪 |
status |
200: "OK" 404: 未找到页面 |
查找常见的状态码(status)?????
20、在alt和title同时设置的时候,alt作为图片的替代文字出现,title是图片的解释文字。
21、Arguments代表的是实参,等于该参数,且可读可写;fn.length等于该函数形参的个数;
22、闭包(closure):从表现来看,是在外部函数内有一个内部函数,且该内部函数调用了外部函数的局部资源,当外部函数执行后,该函数的局部资源不会被垃圾回收机制(GC)回收:
1、For(var i=0;i<aLi.length;i++){
2、(function(index){
3、aLi[index].onclick = function(){
4、Alert(index);
};
})(i);
}
第四行中,index为内部函数(第二行)的局部变量;每次该函数调用(该函数会被调用aLi.length次)完后,都不会释放该函数的局部变量(index);
缺点:内存泄露:
1、当页面中元素被移除或替换时,若元素绑定的事件仍没被移除,在IE中不会作出恰当处理,此时要先手工移除事件,不然会存在内存泄露。
.....
23、跨域:(带src属性(script、img、link)的都可以加载外部资源,利用这个属性的特点去实现跨域);
{主域与子域之间的跨域:在子域里document.domain = “qq.com(主域)”;}
{不同域之间的跨域(以下也称JSONP(json padding填充),需求:第三方平台):
在a域名下有一个文件现在向b域名(IP:192.168.25.78)请求数据:
{<script src=”http://192.168.25.78/test/test.php?name:lisi&age:23&callback=aa”></script>
<script>
function aa(str){
//这里就能处理传回来的数据了
}
</script>
}
在b域名下的test项目下的test.php文件:
<?php
$name = $_GET[‘name’];
$sayHello = $name.’,hello’;
$callback = $_GET[‘callback’];
echo $callback.‘(“‘.$sayHello.’”)’;
?>
24、异步加载JS,使用defer或者async属性,它会使浏览器在加载时略过(但是是在另一个进程去加载)该文件去加载其他的js文件;一般不能乱用,只有在该脚本计算量大且不着急用时才能用异步加载方式;
<script src=”aa.js” async></script>
25、js中的类
prototype:一个类的原始的对象,通过原型下添加的任何方法,都会被实例化的对象继承;一个类中如果有this.sayHello方法,而且也有classA.prototype.sayHello。则会执行this.sayHello,这有关原型链在本类中找不到该方法,则一层一层网上找;
26、js中的继承
1)对象冒充:
function classA(sColor){//var classA = function(sColo){
this.color = sColor;
this.sayColor = function(){
alert(this.color);
};
}
function classB(sColor){
1、this.newMethod = classA;/*相当于this.newMethod = function(){
this.color = sColor;//这个时候this是classB,而语法.color相当于给this添加了一个属性,这就相当于给classB添加了一个属性;sayColor方法也是这样添加到classB中了;
this.sayColor = function(){
alert(this.color);
};
}
;*/
2、this.newMethod(sColor);//调用之后才是真正的完成继承
3、delete this.newMethod;//这个时候已完成继承,所以newMethod已经没有作用了,就给删了
this.name = name;
}
上面第一二三行==classA.call(this,sColor);
2)prototype:prototype 对象是个模板,要实例化的对象都以这个模板为基础。总而言之,prototype 对象的任何属性和方法都被传递给那个类的所有实例。两种用途:一个是给类添加方法;另一个是继承【
classB.prototype = new ClassA();
classB.prototype.constructor = ClassB;//不写这句话则会导致classB实例化的对象的constructor成为classA;
】
27、call()和apply():只有函数才有这两个方法,与对象冒充等有关
28、事件冒泡、时间委托、事件捕获capture
javascript的typeof返回值有以下6种:
1.number(数字);
2.string(字符串);
3.boolean(布尔值);
4.object(对象、数组和null);
5.function(函数);
6.undefined;
名称 |
复杂度 |
说明 |
备注 |
冒泡排序 |
O(N*N) |
将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 |
|
插入排序 Insertion sort |
O(N*N) |
逐一取出元素,在已经排序的元素序列中从后向前扫描,放到适当的位置 |
起初,已经排序的元素序列为空 |
选择排序 |
O(N*N) |
首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此递归。 |
|
快速排序 Quick Sort |
O(n *log2(n)) |
先选择中间值,然后把比它小的放在左边,大的放在右边(具体的实现是从两边找,找到一对后交换)。然后对两边分别使用这个过程(递归)。 |
|
堆排序HeapSort |
O(n *log2(n)) |
利用堆(heaps)这种数据结构来构造的一种排序算法。堆是一个近似完全二叉树结构,并同时满足堆属性:即子节点的键值或索引总是小于(或者大于)它的父节点。 |
近似完全二叉树 |
希尔排序 SHELL |
O(n1+£) 0<£<1 |
选择一个步长(Step) ,然后按间隔为步长的单元进行排序.递归,步长逐渐变小,直至为1. |
|
箱排序 |
O(n) |
设置若干个箱子,把关键字等于 k 的记录全都装入到第k 个箱子里 ( 分配 ) ,然后按序号依次将各非空的箱子首尾连接起来 ( 收集 ) 。 |
分配排序的一种:通过" 分配 " 和 " 收集 " 过程来实现排序。 |
桶排序 Bucket Sort |
O(n) |
桶排序的思想是把 [0 , 1) 划分为 n 个大小相同的子区间,每一子区间是一个桶。 |
冒泡排序算法:
function bubbleSort(arr){ var n=arr.length; //获取数组的长度,即有n个数在排序 var temp=null; //定义一个临时变量,交换数据用 for(var i=0; i<n-1; i++){ //外层循环n-1次 for(var j=0; j<n-1-i; j++){ //内层每次循环n-1-i次,每次循环完,都能从剩下的数当中找出一个最大的放在n-1-i的位置 if(arr[j]>arr[j+1]){ //如果a[j]>a[j+1]则交换位置 temp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } return arr; //返回排好序的数组 }
快速排序:
function quickSort(arr){ var len=arr.length;//获取arr的长度 if(len<=1){//如果arr的长度小于等于1则直接返回arr return arr; } var pIndex=Math.floor(len/2);//获取基准点的索引下标 var pivot=arr.splice(pIndex,1);//用splice方法获取基准点pivot=[arr[pIndex]],此时的arr为去除第pIndex项之后的剩余项; var left=[]; var right=[]; for(var i=0; i<arr.length; i++){ if(arr[i]<pivot[0]){//如果小于基准点就放到数组l中 left.push(arr[i]); }else{//如果大于等于基准点就放到右边数组中 right.push(arr[i]); } } return quickSort(left).concat(pivot,quickSort(right));//递归不断重复整个过程 }
插入排序:
function insertSort(arr){ var temp=null;//定义一个临时变量保存要插入元素的值 for(var i=1; i<arr.length; i++){//从索引位置1开始遍历数组 if(arr[i]<arr[i-1]){//只有要插入的元素小于已排好序的最大元素的时候才需要进行下面的操作 temp=arr[i];//把要插入的元素赋给一个临时变量 var p=i-1;//已排好序的数组的最后一项索引为i-1 while(temp<arr[p] && p>=0){//如果要插入的元素小于已排好序的元素并且没有到已排好数组的开始位置 arr[p+1]=arr[p];//把大于要插入元素(temp)的已排好序元素位置往后挪一位 p--;//从后往前遍历已经排好序的元素 } arr[p+1]=temp;//把要插入的元素插入到已排好序的数组中,索引位置为p+1 } } return arr;//返回已排好序的数组 }
选择排序:
function selection_sort(unsorted){
for (var i = 0; i < unsorted.length; i++){
var min = unsorted[i], min_index = i;
for (var j = i; j < unsorted.length; j++) {
if (unsorted[j] < min){
min = unsorted[j];
min_index = j;
}
}
if (min_index != i){
var temp = unsorted[i];
unsorted[i] = unsorted[min_index];
unsorted[min_index] = temp;
}
}
return unsorted;
}
希尔排序:
#include <stdio.h>#include <stdlib.h>void swap(int *p1, int *p2){ int temp; temp=*p1; *p1=*p2; *p2=temp;}void shell(int *a,int d,int len){ int i,j; for(i=d+1;i<len;i++) { for(j=i+d;j>=i && j<len;j--) { if(a[j]<a[j-d]) swap(&a[j],&a[j-d]); } }}void shellSort(int *a,int d,int len){ while(d>=1) { shell(a,d,len); d=d/2; }}
归并排序:
int merge(int start, int mid, int end)
{
int num1[mid - start + 1];
int num2[end - mid];
int i = start;
int j = mid + 1;
while(i <= mid){
num1[i - start] = num[i];
i ++;
}
while(j <= end){
num2[j - mid - 1] = num[j];
j ++;
}
i = 0;
j = 0;
int k = start;
while(i < mid - start + 1 && j < end - mid){
if(num1[i] < num2[j]){
num[k ++] = num1[i];
i ++;
}
else{
num[k ++] = num2[j];
j ++;
}
}
while(i < mid - start + 1){
num[k ++] = num1[i ++];
}
while(j < end - mid){
num[k ++] = num2[j ++];
}
}
void mergesort(int start, int end)
{
if(start < end){
int mid = (start + end) / 2;
mergesort(start, mid);
mergesort(mid + 1, end);
merge(start, mid, end);
}
return ;
}
归并排序:O(n)
排序法 |
平均时间 |
最差情形 |
稳定度 |
额外空间 |
备注 |
冒泡 |
O(n2) |
O(n2) |
稳定 |
O(1) |
n小时较好 |
交换 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
选择 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
插入 |
O(n2) |
O(n2) |
稳定 |
O(1) |
大部分已排序时较好 |
基数 |
O(logRB) |
O(logRB) |
稳定 |
O(n) |
B是真数(0-9),R是基数(个十百) |
Shell |
O(nlogn) |
O(ns) 1<s<2 |
不稳定 |
O(1) |
s是所选分组 |
快速 |
O(nlogn) |
O(n2) |
不稳定 |
O(nlogn) |
n大时较好 |
归并 |
O(nlogn) |
O(nlogn) |
稳定 |
O(1) |
n大时较好 |
堆 |
O(nlogn) |
O(nlogn) |
不稳定 |
O(1) |
n大时较好 |
二叉树遍历:
先序遍历:
例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F
中序遍历:(左大子的左子:从上往下写->左大子的右子:从上往下写->根节点->右大子的左子:从上往下写->右大子的右子:从上往下写)
例如遍历已知二叉树的结果:B->G->D->H->A->E->C->F
后序遍历:
例如遍历已知二叉树的结果:G->H->D->B->E->F->C->A
层次遍历:
从上到下,从左到右遍历二叉树的各个结点(实现时需要借辅助容器);
例如遍历已知二叉树的结果:A->B->C->D->E->F->G->H
29、解决跨域问题:第一题js跨域问题解决办法:1、document.domain+iframe的设置;2、动态创建script;3、利用iframe和location.hash;4、window.name实现的跨域数据传输;5、使用HTML5 postMessage;6、利用flash; 7、利用window剪贴板
30、说说nodejs的异步I/O是什么?面对负责的业务需求,多次回调的node代码场景,你有什么看法,如何让代码更好阅读和维护?
1.简单来讲,nodejs中没有多线程机制,那么是如何实现高并发访问的呢,正是由于异步I/O,所谓异步I/O是指nodejs可以以非阻塞的访问去执行代码,然后使用回调的方式来继续完成代码完成后续的工作。2.nodejs在复杂的业务情况下,会大量的产生回调的代码,并且一层层嵌套,会相当的复杂,难于维护,所以如果有可能应该尽可能的多封装一些通用好用的api接口,减少应用层开发者的回调函数数量,比如mongoose就是一个好的对native mongodb的封装。
31、为满足商业项目的开发需要,你要从一堆的开源产品里做技术选型,请问需要考虑哪些因素?
1.最重要的是要有丰富完善的开发文档,如果没有,你会很蛋疼
2.要有较多的成功案例,如果没有,你可能会成为小白鼠
3.要有活跃的社区,如果没有,碰到问题没人帮你,岂不很孤单?
4.要有大公司支持,这样的话以后可能被收购,会有更强大的支持
32、面向PC端和移动端的网页性能优化技术有哪些异同:
改善网站性能的主要策略并没有因为从PC变成手机或者平板设备而有变化,只是会参杂一些小的策略。不论在PC还是在移动浏览器上,页面展示需要的时间里,只有20%是用来读取页面的HTML的。剩下的80%是用来加载额外的像样式表、脚本文件、或者图片这样的资源和执行客户端的程序。
三个主要的改善性能的策略是:
•减少每个页面需要获取额外资源的HTTP请求数
•减少每个请求加载的大小
•优化客户端执行的优先级和脚本执行的效率片这样的资源和执行客户端的程序。
三个主要的改善性能的策略是:
•减少每个页面需要获取额外资源的HTTP请求数
•减少每个请求加载的大小
•优化客户端执行的优先级和脚本执行的效率
由于移动网络通常比桌面机器的网络慢,所以减少请求数和请求加载量是非常
重要的。由于移动端的浏览器解析HTML和执行JavaScript的效率比桌面PC低,
所以优化客户端程序也是非常关键的。另外,移动端浏览器的缓存大小比桌面PC低,所以需要有方法能重复利用本地的缓存资源。
33、请描述用户在浏览器中从输入http://www.taobao.con开始发生了什么?针对每个过程我们应该如何优化?
1.浏览器查找域名的IP地址, 减少DNS查询
2.浏览器给web服务器发送一个HTTP请求,减少http请求数量
3.服务器“处理”请求,服务器端应尽可能优化来提高处理和响应速度,比如数据库访问
4.服务器发回一个HTML响应,避免返回特别大的数据
5.浏览器开始显示HTML,将影响见面渲染速度的代码,如果加载的js,放在html的结束等
34、//在网页开发过程中,往往需要进行调试工作,假如一个线上地址(http://testcdn.com/index/index.js)出现了问题,请列出你所知道的几种快速进行调试的方式,边谈谈这几种方式的原理和优缺点?
// 1. 利用alert和console.log函数,优点简单,最简单的环境下也可以使用,缺
// 点效率低,不能深度跟踪
// 2. 利用chrome webdev和firefox firebug,优点简单强大
// 3. 利用webstrom这样的开发工具中的调试工具,优点强大,缺点对工具要
// 求较高
// 网络答案:
// 五种前端开发必备的调试技术。
// Weinre移动调试
// 优点:实现pc和手机的socket通信,从而实现实时调试。
// 缺点:每次都要在调试的页面引入js,安装麻烦
// DOM 断点
// 优点:DOM断点是一个Firebug和chrome DevTools提供的功能,当js需要操作打
// 了断点的DOM时,会自动暂停,类似debugger调试。
// 缺点:Firebug中,DOM断点可以在Script> Breakpoints里面看到
// chrome DevTools中,需要在Elements面板的DOM Breakpoints中看到
// debugger断点
// 需要调试js的时候,我们可以给需要调试的地方通过debugger打断点,代码执
// 行到断点就会暂停,这时候通过单步调试等方式就可以调试js代码
// native方法hook
// 缺点:这种方法不保证在所有浏览器中有效,比如ios的safari隐私模式下,我
// 们就不可以修改localStorage方法
// 远程映射本地调试
/*
优点:当线上某个js/css出现问题,我们可以用代理的方式,将远程的文件代
理到本地来实现远程映射调试。其实除了这个功能,还可以作为抓包工具,这
在移动端是很重要的。
*/
35、clearfix什么意思?
清除浮动的方式:a、overflow:hidden;
b、clear
c、clearfix
对比:clearfix 主要是用在浮动层的父层,而 clear主要是用在浮动层与浮动层之间,和浮动层同 一级,如果想要撑开父层的高度,clear 就要 放在最后。
<body>
<h2>用 clear 清除浮动</h2>
<div class="demo">
<div class="fl item1"></div>
<div class="fl item2"></div>
<div class="clear"></div>
</div>
<h2>用 clearfix 清除浮动</h2>
<div class="clearfix demo">
<div class="fl item1"></div>
<div class="fl item2"></div>
</div>
</body>
36、img 属性tppabs代表什么?
解答:是离线浏览器下载完整个网页后,在图片或超级链接标签内加入的标签,以记录该图片或超级链接指向的原始地址。因为这个标签不是合法 标签,所以普通浏览器会忽略它。
37X-UA-Compatile:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">:这是个是IE8的专用标记,用来指定IE8浏览器去模拟某个特定版本的IE浏览器的渲染方式,以此来解决部分兼容问题,例如模拟IE7的具体方式如下:<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" />但令我好奇的是,此处这个标记后面竟然出现了chrome这样的值,难道IE也可以模拟chrome了?迅速搜索了一下,才明白原来不是微软增强了IE,而是谷歌做了个外挂:Google Chrome Frame(谷歌内嵌浏览器框架GCF)。这个插件可以让用户的IE浏览器外不变,但用户在浏览网页时,实际上使用的是Google Chrome浏览器内核,而且支持IE6、7、8等多个版本的IE浏览器,谷歌这个墙角挖的真给力!
Canvas
Canvas是一种标签,与其他标签不同的是,它用 JavaScript 在网页上绘制图像。其背景默认是透明的;
beginPath()与closePath()可以分割线条不同的状态(起点、终点、线条颜色、线条宽度等);可得到多种状态的线条;
画动画的步骤:1、准备画布;2、清空画布(清空上一次的轨迹);3、绘制图形;4、开启定时器并在定时器中调用相对应的API;5、重复2、3;
基本复习:
浏览器底层(原生的)->核心框架(jquery、dojo、YUI等)->框架组件->应用层(根据项目需求开发组件)
浏览器底层的问题:1、js核心语法层面薄弱(不够全面,会借用jQuery框架来补足);2、js原生API不好用(cookie(只有document.cookie)、ajax(基本代码太多,繁杂了)等);3、浏览器兼容性问题(js、css上的);
Less:优点:网站的重构对前端工程师的压力会减低,不过这也形成的缺点,在less的嵌套下,一旦dom结构发生变化,则less也会产生很大的变化;
Css命名冲突的解决:设置命名空间(设定限制(类似于功能_content)、使用派生选择器(父级选择器 子选择器));
Js命名冲突:js通过匿名空间(匿名函数)隔开共有私有;
页面处理文件的问题(可以用sea.js(遵循的是CMD规范)或者require.js遵循AMD规范):1、手动处理组件间的依赖关系;2、加载项太多,破坏页面的整洁度(粒度越小(功能越细致越单一),可复用性强,加载的文件就多);
Require.js中要暴露的文件用关键字define,而不需要暴露的文件用require,替代define的位置;
自定义事件:用底层的事件(DOM事件:click、mousedown、focus等;BOM事件:resize、storage等)去模拟自定义事件。自定义事件是基于观察者模式的(observe model,是一种设计模式),优点:跳出原生事件的限制,提高封装的抽象层级;【需要有自定义事件的原因:底层的事件可能不太满足业务需求(通过盒子的打开和关闭举例:只关心盒子的打开和关闭,但是底层的事件没有能满足这个open和close的事件,所以会需要自定义事件);自定义事件的原理:会有三个方法(注册事件on:会为当前的元素的某一个类型的事件绑定多个事件;取消事件off:去检测在注册事件里是否存在,若存在,则删除;触发事件fire:循环该类型的处理函数,挨个循环执行;);执行和调用过程:主要是什么时候触发:所有自定义的事件都是浏览器根据底层事件来调用的】;举例:
function Obserable(){this.handlers={};//持有事件处理函数}
Obserable.prototype={//重写EventTarget的原型对象
constructor:EventTarget,
on:function(type,handler){//对应于观察者模式-在相应的被观察者注册观察者
//handlers中是否已有针对此事件类型的数组
//没有创建一个空数组
//把这个处理函数推入对应的handlers[type]数组,
if(typeof this.handlers[type]=="undefined"){this.handlers[type]=[];}
this.handlers[type].push(handler);},
fireEvent:function(event){if(!event.target){event.target=this;}
if(this.handlers[event.type] instanceof Array){
var handlers=this.handlers[event.type];//检出被观察者注册的观察者
for(var i=0;len=handlers.length;i++){handlers[i]();//回调函数执行,也就是观察者更新自己}
}}};
function handlerMessage(event){alert("处理函数被回调");}
var ob=new Obserable();ob.on('message',handlerMessage);
ob.fireEvent({type:'message'});
最后,不难发现,原生态的事件,是在某一个特殊时刻(单击,获得焦点等等)发生时,由游览器把这一特殊时刻的一些信息,譬如事件类型,和其他的一些必要信息封装成event对象,触发事件处理程序时把这个event对象作为实参传入,而我们自定义的事件,当然只能由我们自己触发,传入的实参event也是我们自己传入的(这个event,想封装什么就封装什么,需要什么就封装什么).
Function类:原生function类的问题(1、所有类继承自Object;2、object提供的帮助太少)
jQuery中继承是用$.extend(obj1,obj2)来实现
正则表达式:两种方式(1、var pattern = /pattern/;2、
Var a = ‘string’;
var reg = new RegExp(‘a’ + a +’b’);)
正则的执行语法:
reg.test(str);
reg.exec(要匹配的字符串);-->返回一个数组,第一个代表整个字符串,第二个开始代表第一个子正则表达式匹配的结果;主要是用于有子正则的时候;如果没有子正则,则考虑用match();str.match(reg)会返回一个数组,该数组包括每个匹配的结果;str.replace(reg,string|callback);
str.search(reg)->返回该匹配的结果所对应的index与indexOf()方法类似,只是search可以接收正则表达式;
Str.split(string eg,howmany)->返回一个被string/reg分割的数组;
37、cookie:是指web浏览器存储的少量数据,在javascript中,cookie用于保存状态以及能够为web浏览器提供一种身份识别机制。但是使用cookie不会采用任何加密机制,因此它们是不安全的。cookie默认的有效期是很短暂的;它只能持续在web浏览器的绘画期间,一旦用户关闭浏览器,cookie保存的数据就丢失了。Cookie的有效期和整个浏览器进程的有效期一致;如果想要延长cookie的有效期,可以通过设置max-age属性;且cookie对同目录下的文件都可见;
cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、所以个人建议:
将登陆信息等重要信息存放为SESSION
其他信息如果需要保留,可以放在COOKIE中
nodejs
Nodejs是一个让javascript运行在服务器端的开发平台;最大的特点就是采用异步I/O(nodejs使用的是单线程模型,对于所有I/O都采用异步式请求方式,避免了频繁的切换,nodejs在执行的过程中会维护一个事件队列,程序在执行时进入事件循环等待下一个时间到来,每个异步I/O请求完成后会被推送到事件队列,等待程序进程进行处理),与事件驱动、非阻塞式;其内建了一个HTTP服务器,就可直接运行;同步式I/O是高并发多线程的方式,通过时间片的切换实现,会使得CPU性能损失较大;
安装nodejs->安装npm(node package management):;.......。。。。。。。
运行node.js文件:进入当前项目的目录,然后运行需运行的文件:node hello.js就能在控制台输出hello.js里的信息;
模块是nodejs的组成部分;nodejs提供了exports和require两个对象,其中exports是模块公开的接口,require用于从外部获取一个模块的对象;nodejs核心模块:http(其中封装了一个高效的HTTP服务器和一个简易的HTTP客户端。http.Server是一个基于事件的HTTP服务器,它的核心由Node.js下层C++部分实现,而接口由JavaScript封装,兼顾了高性能与简易性。http.request则是一个HTTP客户端工具,用于向HTTP服务器发起请求。var http = require('http');
http.createServer(function(req, res) {res.writeHead(200, { 'Content-Type': 'text/html'});
res.write('<h1>Node.js</h1>');
res.end('<p>Hello World</p>');}).listen(3000);
console.log("HTTP server is listening at port 3000.");
)、events(Node.js本身架构就是事件式的,而它提供了唯一的接口,所以堪称Node.js事件编程的基石。events模块不仅用于用户代码与Node.js下层事件循环的交互,还几乎被所有的模块依赖。events 模块只提供了一个对象: events.EventEmitter。EventEmitter 的核心就是事件发射与事件监听器功能的封装。 )、js(提供了对文件与目录的创建、删除、权限设置,并以及文件的打开、读写与关闭。 )、util(提供常用函数的集合,用于弥补核心 JavaScript 的功能过于精简的不足。 )等;常用框架:express、mongoose、body-parser等~
HTML在浏览器里的渲染原理:页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。
1.客户端浏览器开始从用户向服务器发出请求,服务器响应的将如上的HTML返回给请求的客户端浏览器中。
2.加载从<html>标签开始,并发现<head>标签内有个外部样式文件要加载
<link href="../css/css.css" rel="Stylesheet" type="text/css" />
3.这时客户端浏览器又向服务器发出一个请求加载css.css文件,服务器响应。
4.此时客户端浏览器继续加载html文件里<body>里的标签,在css.css文件加载完后,同时开始渲染页面。
5.客户端浏览器在<body>里的标签中发现一个<img>标签并且引用了服务器进而的一张名为test.jpg的图片.客户端浏览器又向服务器发出一次请求。而浏览器不会因为此时正在加载<img>标签里的图片而停止等待图片加载完,浏览器继续渲染还未完成的部分。
6.<img>标签里的图片加载完了,则要显示出来,同时图片会占有一定的面积,又会影响到后面的布局,浏览器不得不又回来重新渲染一次这部分。
7.总算把body里的标签加载及渲染完后,浏览器又发现了一段代码:
8.浏览器又立刻向服务器发出请求加载js.js文件,服务器响应。
9.浏览器又在js.js文件中发现了一段代码是让<div>标签隐藏的代码,此时浏览器又要重新去渲染被隐藏的<div>部分。
10.最后到浏览器发现了</html>为止。
对于这种来回渲染,内行叫为reflow,reflow几乎是无法避免的,我们不能因为怕会重新渲染而去丢掉一些页面效果。但是reflow是可以优化的,比如图片在css.css样式文件中就定义好图片的高度,这要会减少重新渲染的次数。另外还有一次词叫repaint,叫重绘,repaint如果只是改变如背景颜色或者文字的颜色,repaint的速度要比reflow的速度明显快的多。
百度搜索怎么处理汉字搜索?:我的看法:其实在百度搜索框里,当输入英文字符和中文字符的结果是一样的,只是由于一开始输入的信息字符较少,而且显示在输入框里的并非是中文字符,所以一开始搜索引擎是去庞大的数据索引库(我觉得应该是在排名较前的英文库)里匹配对应输入的字符,当在英文库不能找到时,则试着去搜索排名高的中文索引库的某个字段里查找对应输入的信息,所以能实时的返回可能的结果~
seajs的原理(define(factory) 中的 factory 函数。原理是,当将 js 文件加载回来后,执行的仅是 define(factory) 函数,factory 则还未执行。执行 define 时,会扫描 factory.toString() 方法,得到当前模块依赖的文件,下载完好,再执行 factory 函数, 这样就实现了提前并行加载,但执行时看起来是同步的。 )
1. sea.js 是怎样解决 模块加载(这里说的模块其实就是js文件加载),
2. sea.js 是怎样解决 模块依赖
3. sea.js 是怎样解决 命名冲突
1.模块加载
其实,原理很简单,和手动引入js文件是一样的。
就是当调用有加载功能的函数 如 seajs.use 、 require 、require.async 时,
其内部代码会创建一个script标签,把src设置成你要引入的js文件,然后append到DOM文档中进行加载,
当加载完毕后,再把这个script标签移除掉,所以当我们审查元素时看不到有那个<script>标签,
但因为文件已经引入了,即使把这个script移除也不会影响代码使用.就是利用 script 标签进行模块加载
就是利用 script 标签进行模块加载
2、文件依赖
3、命名冲突,但是sea.js是用define( fn )函数来定义模块的,里面的变量都是局部的
Sea.js 与 require.js的不同:
RequireJS 遵循 AMD(异步模块定义)规范,Sea.js 遵循 CMD (通用模块定义)规范。规范的不同,导致了两者 API 不同。Sea.js 更贴近 CommonJS Modules/1.1 和 Node Modules 规范。 SeaJS只会在真正需要使用(依赖)模块时才执行该模块
SeaJS是异步加载模块的没错, 但执行模块的顺序也是严格按照模块在代码中出现(require)的顺序, 这样才更符合逻辑吧! 你说呢, RequireJS?
而RequireJS会先尽早地执行(依赖)模块, 相当于所有的require都被提前了, 而且模块执行的顺序也不一定100%就是先mod1再mod2;
而SeaJS一样是并行加载所有依赖的模块, 但不会立即执行模块, 等到真正需要(require)的时候才开始解析。
seajs优点:兼容性强,可运用在任何浏览器下;模块化开发,关注结构拆分,可提供粒度小复用性大的模块;
在 TCP/IP 中包含一系列用于处理数据通信的协议:
(1)TCP (传输控制协议:TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯。TCP提供的是一种可靠的数据流服务,采用“带重传的肯定确认”技术来实现传输的可靠性。) - 应用程序之间通信
(2)UDP (用户数据包协议:UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP通讯时不需要接收方确认,属于不可靠的传输,可能会出现丢包现象,实际应用中要求程序员编程验证。) - 应用程序之间的简单通信
(3)IP (网际协议:IP层接收由更低层(网络接口层例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层;相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层。IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址)) - 计算机之间的通信
(4)ICMP (因特网消息控制协议:ICMP与IP位于同一层,它被用来传送IP的控制信息。它主要是用来提供有关通向目的地址的路径信息。) - 针对错误和状态
(5)DHCP (动态主机配置协议:为互联网上主机提供地址和配置参数。DHCP是基于Client/Server工作模式,DHCP服务器为需要为主机分配IP地址和提供主机配置参数。) - 针对动态寻址
搜索引擎的基本工作原理包括如下三个过程:首先在互联网中发现、搜集网页信息;同时对信息进行提取和组织建立索引库;再由检索器根据用户输入的查询关键字,在索引库中快速检出文档,进行文档与查询的相关度评价,对将要输出的结果进行排序,并将查询结果返回给用户。
总结:
1、对前端的看法:首先,前端对于网站来说,通常是指网站的前台部分,包括网站的表现层和结构层。因此前端技术一般分为前端设计和前端开发,前端设计一般可以理解为网站的视觉设计,前端开发则是网站的前台代码实现,包括基本的HTML和CSS以及JavaScript/ajax,现在最新的高级版本是HTML5、CSS3,以及SVG等。随着互联网产业的爆炸式增长,与之伴生的Web前端技术也在历经洗礼和蜕变。尤其是近几年随着移动终端的发展,越来越多的人开始投身或转行至新领域,这更为当今的IT产业注入了新的活力。一下这几方面是需要快速学习的:a、web移动终端开发;b、javascript的其他技术:backbone.js、node.js、zepto.js等;c、各种类库和框架的封装与开发;d、web前端开发规范;虽然现在国内几乎没有学校专门开设有关前端的课程,但是由于自己不小心的踏入,导致现在的深深的迷恋,探索的道路辛苦,但是并不枯燥,我自己也很难相信会在这条路上坚持不间断的了解它长达一年多时间,这也正是前端的魅力所在。
2、对javascript的理解:a、它是一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言;它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。然而现在JavaScript也可被用于网络服务器,如Node.js。组成部分是:(1)ECMAScript,描述了该语言的语法和基本对象。(2)文档对象模型(DOM),描述处理网页内容的方法和接口。(3)浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。基本特点:(1)是一种解释性脚本语言(代码不进行预编译);(2)主要用来向HTML(标准通用标记语言下的一个应用)页面添加交互行为。(3)可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。虽然它的特点很多,但是也会有一些缺点,由于javascript是运行中浏览器上的,所以安全性是一个很大的问题,但是现在可以用javascript来编写运行在服务器端的脚本--nodejs。
优点:(1)由于JavaScript运行在客户端,节省了web服务器的请求时间和带宽;(2)轻量级的脚本语言,比较容易学习;(3)运行在用户机器上,运行结果和处理相对比较快。(3)可以使用第三方附加组件来检查代码片段。
缺点:(原生:(1)安全问题:由于JavaScript在客户端运行,可能被用于黑客目的。(2)渲染问题:在不同浏览器中的处理结果可能不同。)
JQuery:
优点: (1)jQuery消除了JavaScript跨平台兼容问题。(2)相比其他JavaScript和JavaScript库,jQuery更容易使用。(3)jQuery有一个庞大的库/函数。(3)jQuery有良好的文档和帮助手册。(4)jQuery支持AJAX。
缺点: (1)不能向后兼容其他版本。(2)项目中需要包含jQuery库文件。如果包含多个版本的jQuery库,可能会发生冲突。
3、浏览器渲染页面的过程:为了要在浏览器中显示页面结构的HTML。
(1).客户端浏览器开始从用户向服务器发出请求,服务器响应的将如上的HTML返回给请求的客户端浏览器中。(2).加载从<html>标签开始,并发现<head>标签内有个外部样式文件要加载
<link href="css.css" rel="Stylesheet" type="text/css" />
(3)这时客户端浏览器又向服务器发出一个请求加载css.css文件,服务器响应。(4)此时客户端浏览器继续加载html文件里<body>里的标签,在css.css文件加载完后,同时开始渲染页面。(5)客户端浏览器在<body>里的标签中发现一个<img>标签并且引用了服务器进而的一张名为test.jpg的图片.客户端浏览器又向服务器发出一次请求。而浏览器不会因为此时正在加载<img>标签里的图片而停止等待图片加载完,浏览器会继续渲染还未完成的部分。(6)<img>标签里的图片加载完了,则要显示出来,同时图片会占有一定的面积,又会影响到后面的布局,浏览器不得不又回来重新渲染一次这部分。(7).总算把body里的标签加载及渲染完后,浏览器又发现了一段代码:
<script type="text/javascript" src="js/js.js"></script>
(8)浏览器又立刻向服务器发出请求加载js.js文件,服务器响应。(9)浏览器又在js.js文件中发现了一段代码是让<div>标签隐藏的代码,此时浏览器又要重新去渲染被隐藏的<div>部分。(10)最后到浏览器发现了</html>为止。
注意: 从上述简单的说了下浏览器加载HTML页面原理后,会明白很多时候页面打开慢的原因。页面中向服务器请求的次数多会影响到打开速度,重新渲染局部的次数量也会影响到页面打开的速度,当然这只是有时候页面打开速度慢一部分原因。对于这种来回渲染,内行叫为reflow,reflow几乎是无法避免的,我们不能因为怕会重新渲染而去丢掉一些页面效果。但是reflow是可以优化的,比如图片在css.css样式文件中就定义好图片的高度,这要会减少重新渲染的次数。另外还有一次词叫repaint,叫重绘,repaint如果只是改变如背景颜色或者文字的颜色,repaint的速度要比reflow的速度明显快的多。
4、盒模型:盒子模型有两种,分别是 IE 盒子模型和标准 W3C 盒子模型。
从上图可以看到标准 W3C 盒子模型的范围包括 margin、border、padding、content,并且 content 部分不包含其他部分。
从上图可以看到 IE 盒子模型的范围也包括 margin、border、padding、content,和标准 W3C 盒子模型不同的是:IE 盒子模型的 content 部分包含了 border 和 pading。
那应该选择哪中盒子模型呢?当然是“标准 W3C 盒子模型”了。怎么样才算是选择了“标准 W3C 盒子模型”呢?很简单,就是在网页的顶部加上 DOCTYPE 声明。如果不加 DOCTYPE 声明,那么各个浏览器会根据自己的行为去理解网页,即 IE 浏览器会采用 IE 盒子模型去解释你的盒子,而 FF 会采用标准 W3C 盒子模型解释你的盒子,所以网页在不同的浏览器中就显示的不一样了。反之,如果加上了 DOCTYPE 声明,那么所有浏览器都会采用标准 W3C 盒子模型去解释你的盒子,网页就能在各个浏览器中显示一致了。可以用下面语法检测:
....
var sBox = $.boxModel ? "标准W3C":"IE";
document.write("您的页面目前支持:"+sBox+"盒子模型");......
5、W3C标准:W3C已发布了200多项影响深远的Web技术标准及实施指南,如广为业界采用的超文本标记语言(标准通用标记语言下的一个应用)、可扩展标记语言(标准通用标记语言下的一个子集)以及帮助残障人士有效获得Web内容的信息无障碍指南(WCAG)等,有效促进了Web技术的互相兼容,对互联网技术的发展和应用起到了基础性和根本性的支撑作用。[1]万维网联盟(外语缩写:W3C)标准不是某一个标准,而是一系列标准的集合。网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由W3C起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。
6、ECMAScript标准:ECMAScript实际上是一种脚本在语法和语义上的标准;ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)通过ECMA-262标准化的脚本程序设计语言,这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。ECMA-262规定了这门语言的组成部分:语法、类型、语句、关键字、保留字、操作符、对象;
7、同步、异步、阻塞与非阻塞:
同步:函数没有执行完不返回,线程被挂起;阻塞:没有收完数据函数不返回,线程也被挂起;异步:函数立即返回,通过事件或是信号通知调用者;非阻塞:函数立即返回,通过select通知调用者。
I/O的阻塞与非阻塞
阻塞模式的I/O会造成应用程序等待,直到I/O完成。同时操作系统也支持将I/O操作设置为非阻塞模式,这时应用程序的调用将可能在没有拿到真正数据时就立即返回了,为此应用程序需要多次调用才能确认I/O操作完全完成。
I/O的同步与异步
I/O的同步与异步出现在应用程序中。如果做阻塞I/O调用,应用程序等待调用的完成的过程就是一种同步状况。相反,I/O为非阻塞模式时,应用程序则是异步的。
异步I/O与轮询技术
当进行非阻塞I/O调用时,要读到完整的数据,应用程序需要进行多次轮询,才能确保读取数据完成,以进行下一步的操作。
轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。现存的轮询技术有以下这些:read、select、poll、epoll、pselect
、kqueue;在文件I/O这一块与普通的业务逻辑的回调函数不同在于它不是由我们自己的代码所触发,而是系统调用结束后,由系统触发的。 ,以在Windows平台下的实现中,启动Node.js时,便创建了一个基于IOCP的事件循环loop,并一直处于执行状态;
8、canvas:canvas 元素用于在网页上绘制图形。canvas 元素本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完成;getContext("2d") 对象是内建的 HTML5 对象,拥有多种绘制路径、矩形、圆形、字符以及添加图像的方法。(看时钟的代码:file:///D:/wichung培训资料/html5/clock.html)
8、对语义化的理解:分为html标签的语义化和css命名的语义化,几点好处:a、手持移动设备的无障碍阅读(手持移动设备如PDA、智能手机等可能对CSS的解析能力较弱,这时可能就需要更语义的标签来体现一个页面的易读性);b、盲人等一些障碍人士的更好地阅读(屏幕阅读器对不同标签所发出的声音是不同的,使用更语义的标签以能传达不同信息的重要性);c、搜索引擎的友好收录(虽然各大搜索引擎的排名规则不断的再变化,但规则里的正则始终是要匹配标签的,如果能用更语义的标签,蜘蛛爬行能够根据标签的使用来确定上下和各关键字的权重。);d、技术趋势所趋
(正如html诞生时的初衷那样,各个标签的本义就是希望能在特定的地方使用合适的标签,而不是去用样式来表现一个不语义的标签。html5新增了更多的语义化的标签);原本用来实现的结构,通过html5的标签我们可以更完美的表现。e、便于团队项目的可持续运作及维护(语义化的命名能够使我们在多人协作一个项目时更加有序和快捷,而不需要去纠结另一位伙伴的CSS命名是什么意思。如果是个人项目,也便于后期其他同事的修改,语义化的命名时一个项目的可读性更高。);
10、常见的行级元素和块级元素:块级元素(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 - 非排序列表);行级元素(a - 锚点; abbr - 缩写; acronym - 首字; b - 粗体(不推荐); bdo - bidi override; big - 大字体; br - 换行; cite - 引用; code - 计算机代码(在引用源码的时候需要); dfn - 定义字段; em - 强调; font - 字体设定(不推荐); i - 斜体; img - 图片; input - 输入框; kbd - 定义键盘文本; label - 表格标签; q - 短引用; s - 中划线(不推荐); samp - 定义范例计算机代码; select - 项目选择;small - 小字体文本; span - 常用内联容器,定义文本内区块; strike - 中划线; strong - 粗体强调; sub - 下标;sup - 上标;textarea - 多行文本输入框;tt - 电传文本;u - 下划线;var - 定义变量);可变元素 (可变元素为根据上下文语境决定该元素为块元素或者内联元素;applet - java applet;button - 按钮;del - 删除文本 ;ins - 插入的文本;map - 图片区块(map) ;object - object对象;script - 客户端脚本)
11、SEO:seo是指在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的自然排名,获得更多流量,吸引更多目标客户,从而达到网络营销及品牌建设的目标。可以从网站结构和网页信息两方面进行优化:1.网站结构方面
①避免链接无法被搜索引擎爬行,即防止蜘蛛陷阱。(JavaScript链接、flash链接等搜索引擎蜘蛛一般不能跟踪爬行。 要引擎蜘蛛能够爬到网站,要求网站要有良好的结构,符合逻辑,并且所有页面可以通过可爬行的普通HTML链接达到 );
③URL设计要规范化(URL越短越好;避免太多参数;目录层次尽量少;文件及目录名具描述性;URL中包含关键词)
④建立网站地图。(HTML网站地图sitemap;XML网站地图Sitemap:使用站长工具后台提交网站地图文件;使用robots文件制定网站地图文件位置)
⑤内部链接权重分配。(要想使重点内页获得高权重,最简单方法是首页直接加上几个重点内页的链接,甚至可以在侧栏推荐、促销部分加上全站链接。 )
2.页面优化方面
①页面标题,语义化、关键词组合。
②<meta>描述标签,关键词标签。
③H标签、ALT属性的权重分配。(H标签相当于正文标题,是关键词优化的另一个页面元素,通常认为重要性仅次于页面Title;SEO中H3以下层次权重已经很低了;替换文字,可以提高可访问性,同时今年ALT文字SEO重要程度有所提高。 )
④正文中关键词词频,文内锚链接。
⑤精简代码,提高信噪比。(精简HTML代码,使真正的文字内容比例提高,尽量减少HTML格式代码。从某种意义上来说,格式代码对关键词来说都是噪声,精简代码就是提高信噪比。 )
12、DTD(Document Type Definition ):可通过比较文档和文档类型定义文件来看文档是否符合规范,元素和标签使用是否正确。DOCTYPE声明必须放在文档最顶部,在所有代码和标识之上,DOCTYPE声明是必不可少的关键组成部分。DTD语法要求DOCTYPE必须要大写,而且DOCTYPE和元素之间必须要有空格隔开。如在以上代码中DOCTYPE和根元素root之间要有空格隔开。
13、CSS Hack:针对不同的浏览器去写不同的CSS,让它能够同时兼容不同的浏览器,能在不同的浏览器中也能得到我们想要的页面效果。分类:条件hack(<!--[if <keywords>? IE <version>?]>HTML代码块<![endif]-->
Keywords:是否(“”)、大于(gt)、大于或等于(gte)、小于(lt)、小于或等于(lte)、非指定版本(!)
Version:IE6 ......
)、属性级hack(_:
选择IE6及以下。连接线(中划线)(-)亦可使用,为了避免与某些带中划线的属性混淆,所以使用下划线(_)更为合适。
*:
选择IE7及以下。诸如:(+)与(#)之类的均可使用,不过业界对(*)的认知度更高
9:
选择IE6+