jQuery高级技巧——DOM操作篇
页面加载之DOMReady事件
所谓domReady,也就是文档就绪,我们都知道,在操作dom时必须要在dom树加载完成后才能进行操作。如何检测DOM树已经构建完成,以下是一些实现的方式:
1.使用jQuery:
// with jQuery
$(document).ready(function(){ /* ... */ });
// shorter jQuery version
$(function(){ /* ... */ });
2.监听DOMContentLoaded事件,DOM 树创建完成后会触发,不支持IE10以下版本。
// without jQuery (doesn't work in older IEs)
document.addEventListener('DOMContentLoaded', function(){
// your code goes here
}, false);
3.监听readyState状态,可实现跨浏览器
readyState 的状态属性:
- "uninitialized" – 原始状态
- "loading" – 下载数据中
- "loaded" – 下载完成
- "interactive" – 还未执行完毕
- "complete" – 脚本执行完毕
r(function(){
alert('DOM Ready!');
});
function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}
这个方法是不断监听readyState的loading状态,加载完成后则执行对应方法。具体可参考:http://www.dustindiaz.com/smallest-domready-ever
根据特定页面的执行对应的代码
如果所有页面的代码都写在一个JavaScript文件中,这样的代码就会难以维护。简单的办法就是根据不同的页面执行不同的代码。来看下例子:
例如在test.js有以下代码:
var route = {
_routes: {}, // The routes will be stored here
add: function(url, callback) {
this._routes[url] = callback;
},
run: function() {
jQuery.each(this._routes, function(pattern) { // pattern 指向_routes对象集合的key,即url
if (location.href.match(pattern)) {
// "this" points to the function to be executed
this(); //this 指向指向 _routes对象集合的value,即要执行的方法
}
});
}
}
// Will execute only on this page:
route.add('test.html', function() {
alert('Hello there!');
});
route.add('products.html', function() {
alert("this won't be executed :(");
});
// You can even use regex-es:
route.add('.*.html', function() {
alert('This is using a regex!');
});
route.run();
使用逻辑与运算符
利用逻辑与运算符可以简化条件分支语句写法,例子:
一般的写法:
// Instead of writing this:
if($('#elem').length){
// do something
}
更好的写法:
$('#elem').length && alert("doing something");
非常有用的jquery is()方法
is()方法非常有用,来看些例子:
HTML:
<div id="elem"></div>
JS:
// 变量保存jQuery对象
var elem = $('#elem');
// 判断是否为div
elem.is('div') && console.log("it's a div");
// 是否包含类名.bigbox
elem.is('.bigbox') && console.log("it has the bigbox class!");
// 是否可见
elem.is(':not(:visible)') && console.log("it is hidden!");
// 设置元素执行动画
elem.animate({'width':200},1);
// 是否执行动画
elem.is(':animated') && console.log("it is animated!");
定义一个exists函数
判断一个jQuery对象是否存在需要判断length属性,可以封装为exists函数,简化代码,更加易读。
HTML:
<div id="elem"></div>
JS:
//一般方法
console.log($('#elem').length == 1 ? "exists!" : "doesn't exist!");
// 封装方法
jQuery.fn.exists = function(){ return this.length > 0; }
console.log($('#elem').exists() ? "exists!" : "doesn't exist!");
使用$()函数的第二个参数
$()函数可以接收两个参数,第二个参数的作用是什么,可以来看下例子:
<ul id="firstList" >
<li>one</li>
<li>two</li>
<li>three</li>
</ul> <ul id="secondList" >
<li>blue</li>
<li>green</li>
</ul>
作用一:
//选取一个元素,通过#firstList限制元素只能在当前的ul节点范围内选取
$('li' , '#firstList' ). each(function(){
console.log($(this). html());
});
//相当于$('#firstList' ). find('li' );
作用二:
//创建一个元素。第二个参数为对应的配置属性,包含jQuery方法会被执行
var div = $('<div>' ,{
"class" : "bigBlue" ,
"css" : {
"background-color" : "purple"
},
"width" : 20,
"height" : 20,
"animate" : { //使用jQuery的方法作为属性
"width" : 200,
"height" : 50
}
}); div. appendTo('body' );
取消右键Click事件
$(function(){
$(document).on("contextmenu" , function(e){
e. preventDefault();
});
});
取消文本选中
//适应于所有浏览器
$('p.descr' ). attr('unselectable' , 'on' )
. css('user-select' , 'none' )
. on('selectstart' , false);
解析锚元素URL
// 需要解析的URL
var url = 'http://tutorialzine.com/books/jquery-trickshots?trick=12#comments' ; // 通过url创建一个新的链接
var a = $('<a>' ,{ href: url }); console. log('Host name: ' + a. prop('hostname' ));
console. log('Path: ' + a. prop('pathname' ));
console. log('Query: ' + a. prop('search' ));
console. log('Protocol: ' + a. prop('protocol' ));
console. log('Hash: ' + a. prop('hash' ));
输出结果:
Host name: tutorialzine.com
Path: /books/jquery-trickshots
Query: ?trick=12
Protocol: http:
Hash: #comments
以上是一些知识总结,如有任何建议或疑问,欢迎留言讨论。
参考链接:
http://www.cnblogs.com/rubylouvre/p/4277408.html
http://www.dustindiaz.com/smallest-domready-ever
jQuery高级技巧——DOM操作篇的更多相关文章
- jQuery2.x源码解析(DOM操作篇)
jQuery2.x源码解析(构建篇) jQuery2.x源码解析(设计篇) jQuery2.x源码解析(回调篇) jQuery2.x源码解析(缓存篇) jQuery这个类库最为核心重要的功能就是DOM ...
- jQuery的DOM操作详解
DOM(Document Object Model-文档对象模型):一种与浏览器, 平台, 语言无关的规则, 使用该接口可以轻松地访问页面中所有的标准组件DOM操作的分类 核心-DOM: DOM Co ...
- 解密jQuery内核 DOM操作
jQuery针对DOM操作的插入的方法有大概10种 append.prepend.before.after.replaceWith appendTo.prependTo.insertBefore.in ...
- 第3章 jQuery的DOM操作
一. DOM 分为DOM核心,HTML-DOM和CSS-DOM 1.DOM核心 不专属与javascript. 获取对象:document.getElementsByTagName('div') 获 ...
- jQuery – 3.JQuery的Dom操作
3.1 JQuery的Dom操作 1.使用html()方法读取或者设置元素的innerHTML 2.使用text()方法读取或者设置元素的innerText 3.使用attr() ...
- jQuery高级技巧——性能优化篇
通过CDN(Content Delivery Network)引入jQuery库 要提升网站中javascript的性能的最简单的一步就是引入最新版本的jQuery库,新发布的版本通常在性能上会有 ...
- js,jQuery和DOM操作的总结(二)
jQuery的基本操作 (1)遍历键值对和数组 , , , , , ]; $.map(arr, function (ele, index) { alert(ele + '===' + index); ...
- 03-老马jQuery教程-DOM操作
jQuery DOM操作 在没有jQuery之前,DOM的操作相对来说有点麻烦,尤其是DOM节点的搜索.目前我们已经学习了jQuery的选择器,接下带大家一块学习jQuery的DOM操作,jQuery ...
- Jquery所有Dom操作汇总
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
随机推荐
- HP P1008打印机如何打印特殊纸张
一.问题的提出 HP P1008中间有一个进纸槽,这是干什么的? 二.问题的分析 查说明,说这个进纸槽是叫做优先进纸槽,用于各种非常规的纸张的打印. 三.问题的解决 弄一张特殊尺寸的纸张,打开要编辑的 ...
- DMSFrame 之简单用法(一)
1.DMSFrame是一个完整的ORM框架,框架相对来说也比成熟了.使用上有些地方还是比较方便的.DLL文件大约300K左右,但却可以支持各种方式的查询,完全的LINQ化的方式书写代码,更有利于维护. ...
- D3D11中的MSAA
这两年我的工作都转到了D3D11,目前新出硬件几乎全部支持此标准,加上D3D11接口清晰,概念直观,等到windows7普及,想必未来都是D3D11的天下.最近时间较空,我陆续开始写些基础文章,希望对 ...
- Failure is not fatal, but failure to change might be.
Failure is not fatal, but failure to change might be. 失败不是致命的,但无法改变却可能是致命的.
- C#基础总结之三循环控制-for-数组-乘法表-arraylist
#region 第三天 作业 乘法表 ////正三角 //for (int i = 1; i < 10; i++) //{ // for (int j = 1; j <= i; j++) ...
- How ADB works
ADB (Android Debug Bridge): How it works? 2012.2.6 early draft Tetsuyuki Kobayashi What is ADB? If y ...
- 技术总结之SpringIOC
1)SpringIOC核心模拟实现 思路:初始化Spring容器时,从配置文件中读取定义好的Bean的信息,根据配置属性初始化后存入Spring容器中. 当需要某个Bean时,直接从容器中通过id获取 ...
- 详解MemCached原理
memcached是一个高性能的分布式内存缓存服务器,memcached在Linux上可以通过yum命令安装,这样方便很多,在生产环境下建议用Linux系统,memcached使用libevent这个 ...
- DDD:当视图模型、领域模型和数据模型都采用了同样的类型的时候,我们该如何处理?
如果采用这种模式,模型会在不同的逻辑层之间传递,以向内传递为例,模型的状态变化是由外向内的不同逻辑层负责修改的,因为这种模式下模型的封装性是很差的,架构和框架要做到:清晰的表达每个逻辑层该如何使用和修 ...
- jackson反序列化时忽略不需要的字段
有时候,如果数据库表中增加一个字段,但返回的JSON字符串中含有我们并不需要的字段,那么当对应的实体类中不含有该字段时,会抛出一个异常,告诉你有些字段没有在实体类中找到.解决办法很简单,在声明Obje ...