抬头看看世界,h5来了javascript
语义化标签css
绘制: canvas/svg/html
http://www.craftymind.com/blowing-up-html5-video-and-mapping-it-into-3d-space/ 看完后我大小便失禁了html5
音视频: audio/videojava
地理信息:Geolocation APInode
跨文档通讯: postMessage API , XMLHttpRequest2web
套字节: WebSocket APIexpress
优化的表单: Forms APIcanvas
工做流: Web Workers API 支持多线程,让web应用程序具有后台处理能力,不会阻塞DOM渲染api
http://www.w3ctech.com/topic/866 我最欣赏的月影前辈所翻译
离线存储: Web Storage API
3D: webGL
http://www.pper.com.cn/ 我又一次失禁了
http://threejs.org/ 止不住的失禁
一些属性和变量
contentEditable ? //文本编辑器
contextmenu ? //添加右击菜单
draggable dropzone ? //自然支持的拖拽
prefetch ? //预先加载 <link rel="prefetch" href="http://www.example.com" >
正文
BOM browser object model
DOM Document Object Model
浏览器监听对象
XMLHttpRequest对象
提问: BOM和DOM的究竟是什么?
DOM的API接口
提问: DOM节点类型有哪几种? 是一个标签一个节点吗?
提问: 你若是是DOM设计师, 你会如何设计DOM的API ???
属性 下面的例子打开当前页面console控制台跑, dom引用当前页面
dom.childNodes; 返回该节点的全部子节点伪数组(NodeList), 注意: 会返回各类类型的节点 dom.childNodes.length; dom.childNodes[1];
dom.firstChild; 返回第一个子节点 === dom.childNodes[0], //document.childNodes[1].childNodes[2].childNodes[20].childNodes[0] === document.childNodes[1].childNodes[2].childNodes[20].firstChild //true
dom.lastChild; 返回最后一个子节点 === dom.childNodes[ dom.childNodes.length-1 ];
dom.nextSibling; 返回下一个兄弟节点, dom.nextSibling.nextSibling 这样玩也能够
dom.previousSibling; 返回上一个兄弟节点,
dom.attributes; 返回该节点的属性数组
dom.nodeName; 返回该节点的节点名称string
dom.nodeValue; 返回该节点的节点值string
dom.textContent; 返回该节点的文本内容, 注意: ie不支持能够用 dom.innerText
dom.innerHTML; 返回该节点的全部HTML代码
dom.id; 返回该节点的id(string) 没有返回""
dom.className; 返回该节点的全部class串; 例:document.childNodes[1].childNodes[2].className //"theme-default aui-layout aui-theme-default contenteditor edit no-tools-pin-toolbar"
dom.style; 返回该节点的样式, 打印 document.getElementById('editor-preload-container').style;
dom.value; 返回该节点的(form元素)的值, 例: document.getElementById('editor-preload-container').value //undefined
方法
dom.hasChildNodes(); 该节点是否存在子节点.
dom.hasAttributes(); 该节点是否存在属性
dom.appendChild(dom); 添加一个子节点,在子节点队尾.
dom.cloneNode(false/true); 克隆节点, false不复制子节点,true复制子节点
dom.insertBefore(新子节点,被插队的节点); 插入子节点,能够控制位置
dom.removeChild(被删节点); 删除子节点,返回被删除节点
dom.replaceChild(被删节点,替换节点); 替换子节点, 返回被删节点
快捷方式和优化
document.childNodes[1].childNodes[2].childNodes[20]; //<div id="editor-preload-container" style></div>
document.childNodes[1].childNodes[2].childNodes[20] instanceof Element; //true
document.getElementById('editor-preload-container') instanceof Element //true
document.getElementsByTagName('div') instanceof HTMLCollection // true
document.createElement();
document.createTextNode();
document.getElementById();
document.getElementsByTagName();
document.getElementsByClassName();
document.images //跑一跑
document.links
document.forms
document.write('html");
document.cookie
document.title
document.referrer
document.domain
事件监听, 跑起来啥都看清楚了
<!doctype html>
<html>
<head>
<meta charset="utf-8">
</head>
<body id="body">
<div style="height:400px;width:400px;background:blue;"></div>
<script type="text/javascript">
var body = document.getElementById('body');
body.addEventListener('click',function(e){
console.log(e instanceof window.MouseEvent );
},false);
</script>
</body>
</html>
addEventListenter(事件类型,处理函数,是否捕获); ---> attachEvent
removeEventListener(事件类型,处理函数); ---> detachEvent
事件冒泡
从下往上冒泡传递,依次触发监听.
e.stopPropagation(); //阻止冒泡 ---> cancelBubble = true;
e.preventDefault(); //阻止默认行为 --> returnValue = false;
事件类型:
document. 跑一下
XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
xhr.open(请求类型区分大小写, 请求地址, 是否异步,false===同步);
xhr.onreadystatechange = function(无参){
if( xhr.readState === 4 ){ 请求状态, 0未初始/1载入请求/2载入完成/3请求交互/4请求完成
if( xhr.status === 200 ){ http请求的状态码
xhr.responseText 返回内容
}
}
}
xhr.senRequestHeader(key:value); //设置请求头信息,能够设置多个 //setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send(发送的数据);
XMLHttpRequest2
* 上传下载2进制数据,例如图片
* 自动解码数据类型: ArrayBuffer / Blob / Document / JSON / Text
* 监听上传,下载的进度
javascript性能优化-repaint和reflow
原文地址: http://www.cnblogs.com/jiajiaobj/archive/2012/06/11/2545291.html
repaint(重绘) ,repaint发生更改时,元素的外观被改变,且在没有改变布局的状况下发生,如改变outline,visibility,background color,不会影响到dom结构渲染。
reflow(渲染),与repaint区别就是他会影响到dom的结构渲染,同时他会触发repaint,他会改变他自己与全部父辈元素(祖先),这种开销是很是昂贵的,致使性能降低是必然的,页面元素越多效果越明显。
什么时候发生:
1. DOM元素的添加、修改(内容)、删除( Reflow + Repaint)
2. 仅修改DOM元素的字体颜色(只有Repaint,由于不须要调整布局)
3. 应用新的样式或者修改任何影响元素外观的属性
4. Resize浏览器窗口、滚动页面
5. 读取元素的某些属性(offsetLeft、offsetTop、offsetHeight、offsetWidth、 scrollTop/Left/Width/Height、clientTop/Left/Width/Height、 getComputedStyle()、currentStyle(in IE))
var fragment = document.createDocumentFragment();
fragment.appendChild(document.createTextNode('keenboy test 111'));
fragment.appendChild(document.createElement('br'));
fragment.appendChild(document.createTextNode('keenboy test 222'));
document.body.appendChild(fragment);
4. 集中修改样式
4.1尽量少的修改元素style上的属性
4.2尽可能经过修改className来修改样式
4.3经过cssText属性来设置样式值
element.style.width=”80px”; //reflow
element.style.height=”90px”; //reflow
element.style.border=”solid 1px red”; //reflow
以上就产生屡次reflow,调用的越多产生就越多
element.style.cssText=”width:80px;height:80px;border:solid 1px red;”; //reflow
4.4缓存Layout属性值
var left=elem.offsetLeft; 屡次使用left也就产生一次reflow
4.5设置元素的position为absolute或fixed
元素脱离标准流,也从DOM树结构中脱离出来,在须要reflow时只须要reflow自身与下级元素
4.6尽可能不要用table布局
table元素一旦触发reflow就会致使table里全部的其它元素 reflow。在适合用table的场合,能够设置table-layout为auto或fixed,这样可让table一行一行的渲染,这种作法也是为了限制reflow的影响范围
4.7避免使用expression,他会每次调用都会从新计算一遍(包括加载页面)