window
window
对象有innerWidth
和innerHeight
属性,可以获取浏览器窗口的内部宽度和高度。内部宽高是指除去菜单栏、工具栏、边框等占位元素后,用于显示网页的净宽高。
对应的,还有一个outerWidth
和outerHeight
属性,可以获取浏览器窗口的整个宽高。(包含地址栏,菜单栏,标签栏)
navigator
- navigator.appName:浏览器名称;
- navigator.appVersion:浏览器版本;
- navigator.language:浏览器设置的语言;
- navigator.platform:操作系统类型;
- navigator.userAgent:浏览器设定的
User-Agent
字符串。
navigator
的信息可以很容易地被用户修改,不要用这些信息判断浏览器版本适配不同代码;正确的方法是充分利用JavaScript对不存在属性返回undefined
的特性,直接用短路运算符||
计算;
screen
- screen.width:屏幕宽度,以像素为单位;
- screen.height:屏幕高度,以像素为单位;
- screen.colorDepth:返回颜色位数,如8、16、24。
location
location.protocol; // 'http' location.host; // 'www.example.com' location.port; // '8080' location.pathname; // '/path/index.html' location.search; // '?a=1&b=2' location.hash; // 'TOP' //要加载一个新页面,可以调用location.assign() if (confirm('重新加载当前页' + location.href + '?')) { location.reload(); } else { location.assign('/'); // 设置一个新的URL地址 }
document
document
对象表示当前页面。由于HTML在浏览器中以DOM形式表示为树形结构,document
对象就是整个DOM树的根节点。
document
的title
属性是从HTML文档中的<title>xxx</title>
读取的,但是可以动态改变:
Cookie安全问题
document
对象还有一个cookie
属性,可以获取当前页面的Cookie。
Cookie是由服务器发送的key-value标示符。因为HTTP协议是无状态的,但是服务器要区分到底是哪个用户发过来的请求,就可以用Cookie来区分。当一个用户成功登录后,服务器发送一个Cookie给浏览器,例如user=ABC123XYZ(加密的字符串)...
,此后,浏览器访问该网站时,会在请求头附上这个Cookie,服务器根据Cookie即可区分出用户。
由于JavaScript能读取到页面的Cookie,如果引入的第三方的JavaScript中存在恶意代码,则www.foo.com
网站将直接获取到www.example.com
网站的用户登录信息。为了解决这个问题,服务器在设置Cookie时可以使用httpOnly
,设定了httpOnly
的Cookie将不能被JavaScript读取。这个行为由浏览器实现,主流浏览器均支持httpOnly
选项,IE从IE6 SP1开始支持。为了确保安全,服务器端在设置Cookie时,应该始终坚持使用httpOnly
。
history
history
对象保存了浏览器的历史记录,JavaScript可以调用history
对象的back()
或forward ()
,相当于用户点击了浏览器的“后退”或“前进”按钮。
这个对象属于历史遗留对象,对于现代Web页面来说,由于大量使用AJAX和页面交互,简单粗暴地调用history.back()
可能会让用户感到非常愤怒。
新手开始设计Web页面时喜欢在登录页登录成功时调用history.back()
,试图回到登录前的页面。这是一种错误的方法。
任何情况,你都不应该使用history
这个对象了。
DOM插入
空的dom,直接innerHTML=“”;
使用innerHTML一定要注意对字符编码避免XSS攻击;
innerText
不返回隐藏元素的文本,而textContent
返回所有文本。另外注意IE<9不支持textContent(两者都自动对字符串进行HTML编码,保证无法设置任何HTML标签)
非空插入最后一个子节点:appendChild();
如果我们要把子节点插入到指定的位置:insertBefore(newDom,childIndexDom);
删除:removeChild
// 拿到待删除节点: var self = document.getElementById('to-be-removed'); // 拿到父节点: var parent = self.parentElement; // 删除: var removed = parent.removeChild(self); removed === self; // true
注意到删除后的节点虽然不在文档树中了,但其实它还在内存中,可以随时再次被添加到别的位置。
Jquery
直接改变:$().html();
插入:$().append(); 插入
$().prepend();添加到最前
最后另外注意,如果要添加的DOM节点已经存在于HTML文档中,它会首先从文档移除,然后再添加,也就是说,用append()
,你可以移动一个DOM节点。
插入到指定节点:$().after()和$().before();(不同于js的insertBefore的子节点,此处为同级节点)
选择器
js:
document.getElementById('drink-menu');
document.getElementsByTagName('dt');
jquery:
$("parent>child");//直接子节点 $('ul.lang li:first-child'); // 第一个子节点 $('ul.lang li:last-child'); // 最后一个子节点 $('ul.lang li:nth-child(2)'); // 选出第N个元素,N从1开始 $('ul.lang li:nth-child(even)'); // 选出序号为偶数的元素 $('ul.lang li:nth-child(odd)'); // 选出序号为奇数的元素 $('div:visible'); // 所有可见的div $('div:hidden'); // 所有隐藏的div
表单选择
-
:input
:可以选择<input>
,<textarea>
,<select>
和<button>
; -
:file
:可以选择<input type="file">
,和input[type=file]
一样; -
:checkbox
:可以选择复选框,和input[type=checkbox]
一样; -
:radio
:可以选择单选框,和input[type=radio]
一样; -
:focus
:可以选择当前输入焦点的元素,例如把光标放到一个<input>
上,用$('input:focus')
就可以选出; -
:checked
:选择当前勾上的单选框和复选框,用这个选择器可以立刻获得用户选择的项目,如$('input[type=radio]:checked')
; -
:enabled
:可以选择可以正常输入的<input>
、<select>
等,也就是没有灰掉的输入; -
:disabled
:和:enabled
正好相反,选择那些不能输入的。
同级元素过滤查找
<!-- HTML结构 --> <ul class="lang"> <li class="js dy">JavaScript</li> <li class="dy">Python</li> <li id="swift">Swift</li> <li class="dy">Scheme</li> <li name="haskell">Haskell</li> </ul> var swift = $('#swift'); swift.next(); // Scheme swift.next('[name=haskell]'); // 空的jQuery对象,因为Swift的下一个元素Scheme不符合条件[name=haskell] swift.prev(); // Python swift.prev('.dy'); // Python,因为Python同时符合过滤器条件.dy //过滤和函数式编程的map、filter类似,jQuery对象也有类似的方法。 var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell var a = langs.filter('.dy'); // 拿到JavaScript, Python, Scheme //或者传入函数,函数内部this被绑定为DOM对象,不是jQuery对象 var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell langs.filter(function () { return this.innerHTML.indexOf('S') === 0; // 返回S开头的节点 }); // 拿到Swift, Scheme //map()方法把一个jQuery对象包含的若干DOM节点转化为其他对象: var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell var arr = langs.map(function () { return this.innerHTML; }).get(); // 用get()拿到包含string的Array:['JavaScript', 'Python', 'Swift', 'Scheme', 'Haskell'] //一个jQuery对象如果包含了不止一个DOM节点,first()、last()和slice()方法可以返回一个新的jQuery对象,把不需要的DOM节点去掉 var langs = $('ul.lang li'); // 拿到JavaScript, Python, Swift, Scheme和Haskell var js = langs.first(); // JavaScript,相当于$('ul.lang li:first-child') var haskell = langs.last(); // Haskell, 相当于$('ul.lang li:last-child') var sub = langs.slice(2, 4); // Swift, Scheme, 参数和数组的slice()方法一致
事件:
click: 鼠标单击时触发; dblclick:鼠标双击时触发; mouseenter:鼠标进入时触发; mouseleave:鼠标移出时触发; mousemove:鼠标在DOM内部移动时触发; hover:鼠标进入和退出时触发两个函数,相当于mouseenter加上mouseleave
keypress:按一次键后触发。
change:当<input>
、<select>
或<textarea>
的内容改变时触发;
ready:当页面被载入并且DOM树完成初始化后触发。ready
仅作用于document
对象。由于ready
事件在DOM完成初始化后触发,且只触发一次,所以非常适合用来写其他的初始化代码。
事件取消绑定
// 10秒钟后解除绑定: function hello() { alert('hello!'); } a.click(hello); // 绑定事件 a.off('click', hello);//取消绑定 // 绑定事件: a.click(function () { alert('hello!'); }); // 解除绑定: a.off('click', function () { alert('hello!'); }); //这种写法无效这是因为两个匿名函数虽然长得一模一样,但是它们是两个不同的函数对象 //可以使用a.off('click')取消所有的click $(selector).unbind(event,function)//未传参数的话,会取消绑定所有绑定的事件 //解决某些改变有js程序控制时不能触发事件的情况 var input = $('#test-input'); input.change(function () { console.log('changed...'); }); //此时不会触发,我们可以手动调用input.change(); 相当于input.trigger('change'),它是trigger()方法的简写。 //浏览器安全限制在浏览器中,有些JavaScript代码只有在用户触发下才能执行,例如,window.open()函数;放在用户操作的回调函数中是可以运行的