
1.当document文档就绪时执行JavaScript代码。
我们为什么使用jQuery库呢?原因之一就在于我们可以使jQuery代码在各种不同的浏览器和存在bug的浏览器上完美运行。
- <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
-
- <script>
-
-
-
-
- $(document).ready(function(){ });
-
-
- $(function(){ });
-
-
- document.addEventListener('DOMContentLoaded',function(){
-
- });
-
-
-
- r(function(){
- alert('DOM Ready!');
- })
-
- function r(f){/in/.test(document.readyState)?setTimeout('r('+f+')',9):f()}
-
- </script>
2.使用route。
- <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
-
- <script>
-
- var route = {
- _routes : {},
-
- add : function(url, action){
- this._routes[url] = action;
- },
-
- run : function(){
- jQuery.each(this._routes, function(pattern){
- if(location.href.match(pattern)){
-
- this();
- }
- });
- }
- }
-
-
- route.add('002.html', function(){
- alert('Hello there!')
- });
-
- route.add('products.html', function(){
- alert("this won't be executed : (")
- });
-
-
- route.add('.*.html', function(){
- alert('This is using a regex!')
- });
-
- route.run();
-
- </script>
3.使用JavaScript中的AND技巧。
使用&&操作符的特点是如果操作符左边的表达式是false,那么它就不会再判断操作符右边的表达式了。所以:
-
-
if($('#elem').length){
-
- }
-
-
-
- $('#elem').length && log("doing something");
4. is()方法比你想象的更为强大。
下面举几个例子,我们先写一个id为elem的div。js代码如下:
-
- var elem = $('#elem');
-
-
- elem.is('div') && log("it's a div");
-
-
- elem.is('.bigbox') && log("it has the bigbox class!");
-
-
- elem.is(':not(:visible)') && log("it is hidden!");
-
-
- elem.animate({'width':200},1);
-
-
- elem.is(':animated') && log("it is animated!");
其中判断是否为动画我觉得非常不错。
5.判断你的网页一共有多少元素。
通过使用$(“*”).length();方法可以判断网页的元素数量。
-
- log('This page has ' + $('*').length + ' elements!');
6.使用length()属性很笨重,下面我们使用exist()方法。
- / Old way
- log($('#elem').length == 1 ? "exists!" : "doesn't exist!");
-
-
-
- jQuery.fn.exists = function(){ return this.length > 0; }
-
- log($('#elem').exists() ? "exists!" : "doesn't exist!");
7.jQuery方法$()实际上是拥有两个参数的,你知道第二个参数的作用吗?
-
-
-
- $('li','#firstList').each(function(){
- log($(this).html());
- });
-
- log('-----');
-
-
-
-
- var div = $('<div>',{
- "class": "bigBlue",
- "css": {
- "background-color":"purple"
- },
- "width" : 20,
- "height": 20,
- "animate" : {
- "width": 200,
- "height":50
- }
- });
-
- div.appendTo('#result');
8.使用jQuery我们可以判断一个链接是否是外部的,并来添加一个icon在非外部链接中,且确定打开方式。
这里用到了hostname属性。
- <ul id="links">
- <li><a href="007.html">The previous tip</a></li>
- <li><a href="./009.html">The next tip</a></li>
- <li><a href="http://www.google.com/">Google</a></li>
- </ul>
-
-
- $('#links a').each(function(){
-
- if(this.hostname != location.hostname){
-
- $(this).append('<img src="assets/img/external.png" />')
- .attr('target','_blank');
- }
-
- });
9.jQuery中的end()方法可以使你的jQuery链更加高效。
- <ul id="meals"> <li> <ul class="breakfast"> <li class="eggs">No</li> <li class="toast">No</li> <li class="juice">No</li> </ul> </li> </ul>
-
-
- var breakfast = $('#meals .breakfast');
-
- breakfast.find('.eggs').text('Yes')
- .end()
- .find('.toast').text('Yes')
- .end()
- .find('.juice').toggleClass('juice coffee').text('Yes');
-
- breakfast.find('li').each(function(){
- log(this.className + ': ' + this.textContent)
- });
10.也许你希望你的web 应用感觉更像原生的,那么你可以阻止contextmenu默认事件。
- <script>
-
- $(function(){
- $(document).on("contextmenu",function(e){
- e.preventDefault();
- });
- });
- </script>
11.一些站点可能会使你的网页在一个bar下面,即我们所看到在下面的网页是iframe标签中的,我们可以这样解决。
-
-
-
if(window != window.top){
- window.top.location = window.location;
- }
-
else{
- alert('This page is not displayed in a frame. Open 011.html to see it in action.');
- }
12.你的内联样式表并不是被设置为不可改变的,如下:
-
- $('#regular-style-block').css({'display':'block', 'white-space':'pre'})
- .attr('contentEditable',true);
这样即可改变内联样式了。
13.有时候我们不希望网页的某一部分内容被选择比如复制粘贴这种事情,我们可以这么做:
- <p class="descr">In certain situations you might want to prevent text on the page from being selectable. Try selecting this text and hit view source to see how it is done.</p>
-
- <script>
-
- $(function(){
- $('p.descr').attr('unselectable', 'on')
- .css('user-select', 'none')
- .on('selectstart', false);
- });
- </script>
这样,内容就不能被选择啦。
14.从CDN中引入jQuery,这样的方法可以提高我们网站的性能,并且引入最新的版本也是一个不错的主意。
下面会介绍四种不同的方法。
- <!-- Case 1 - requesting jQuery from the official CDN -->
- <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
- <!-- Case 2 - requesting jQuery from Google's CDN (notice the protocol) -->
- <!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> -->
- <!-- Case 3 - requesting the latest minor 1.8.x version (only cached for an hour) -->
- <!-- <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10/jquery.min.js"></script> -->
- <!-- Case 4 - requesting the absolute latest jQuery version (use with caution) -->
- <!-- <script src="http://code.jquery.com/jquery.min.js"></script> -->
15.保证最小的DOM操作。
我们知道js操作DOM是非常浪费资源的,我们可以看看下面的例子。
- CODE
-
-
-
-
-
-
-
- var elem = $('#elem'),
- arr = [];
-
-
for(var i = 0; i < 100; i++){
- arr.push('<li>element '+i+'</li>');
- }
-
- elem.append(arr.join(''));
16.更方便的分解URL。
也许你会使用正则表达式来解析URL,但这绝对不是一种好的方法,我们可以借用a标签来实现它。
-
- var url = 'http://tutorialzine.com/books/jquery-trickshots?trick=12#comments';
-
-
- var a = $('<a>',{ href: url });
-
- log('Host name: ' + a.prop('hostname'));
- log('Path: ' + a.prop('pathname'));
- log('Query: ' + a.prop('search'));
- log('Protocol: ' + a.prop('protocol'));
- log('Hash: ' + a.prop('hash'));
17.不要害怕使用vanilla.js。
-
- $('#colors li').each(function(){
-
-
-
-
- log(this.id);
-
- });
18.最优化你的选择器
-
-
- var iterations = 10000, i;
-
- timer('Fancy');
-
-
for(i=0; i < iterations; i++){
-
- $('#peanutButter div:first');
- }
-
- timer_result('Fancy');
-
- timer('Parent-child');
-
-
for(i=0; i < iterations; i++){
-
- $('#peanutButter div');
- }
-
- timer_result('Parent-child');
-
- timer('Parent-child by class');
-
-
for(i=0; i < iterations; i++){
-
- $('#peanutButter .jellyTime')
19.缓存你的selector。
-
-
-
-
-
-
- var pancakes = $('#pancakes li');
-
- pancakes.eq(0).remove();
- pancakes.eq(1).remove();
- pancakes.eq(2).remove();
-
-
-
-
-
20.对于重复的函数只定义一次
如果你追求代码的更高性能,那么当你设置事件监听程序时必须小心,只定义一次函数然后把它的名字作为事件处理程序传递是不错的方法。
- $(document).ready(function(){
- function showMenu(){
- alert('Showing menu!');
-
- }
-
- $('#menuButton').click(showMenu);
- $('#menuLink').click(showMenu);
-
- });
21.像对待数组一样地对待jQuery对象
由于jQuery对象有index值和长度,所以这意味着我们可以把对象当作普通的数组对待。这样也会有更好地性能。
- var arr = $('li'),
- iterations = 100000;
-
- timer('Native Loop');
-
-
for(var z=0;z<iterations;z++){
-
- var length = arr.length;
- for(var i=0; i < length; i++){
- arr[i];
- }
- }
- timer_result('Native Loop');
-
- timer('jQuery Each');
-
-
for(z=0;z<iterations;z++){
-
- arr.each(function(i, val) {
- this;
- });
- }
- timer_result('jQuery Each');
22.当做复杂的修改时要分离元素。
修改一个dom元素要求网页重绘,这个代价是高昂的,所以如果你想要再提高性能,就可以尝试着当对一个元素进行大量修改时先从页面中分离这个元素,修改完之后再添加到页面。
-
- var elem = $('#elem');
-
- timer('In place');
-
-
for(i=0; i < iterations; i++){
-
- elem.width(Math.round(100*Math.random()));
- elem.height(Math.round(100*Math.random()));
-
- }
-
- timer_result('In place');
-
- var parent = elem.parent();
-
-
- timer('Detached');
-
- elem.detach();
-
-
for(i=0; i < iterations; i++){
-
- elem.width(Math.round(100*Math.random()));
- elem.height(Math.round(100*Math.random()));
-
- }
-
- elem.appendTo(parent);
-
- timer_result('Detached');
23.不要一直等待load事件。
我们已经习惯了把我们所有的代码都放在ready的事件处理程序中,但是,如果你的html页面很庞大,decument ready恐怕会被延迟了,所以对于一些我们不希望ready后才可以触发的事件可以放在html的head元素中。
- <script>
-
-
-
-
-
- $(document).on('click', '#clickMe', function(){
- alert('Hit view source and see how this is made');
- });
-
- $(document).ready(function(){
-
-
-
-
-
- });
-
-
-
-
-
- </script>
24.当使用js给多个元素添加样式时更好的做法是创建一个style元素。
我们之前提到过,操作dom是非常慢的,所以当添加多个元素的样式时创建一个style元素并添加到document中是更好的做法。
- <ul id="testList">
- <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li> <li>Item</li>
- </ul>
-
- var style = $('<style>');
-
-
- style.text('#testList li{ color:red;}');
-
-
- style.prependTo('#result');
25.给html元素分配一个名为JS的class。
现代的web apps非常的依赖js,这里的一个技巧就是只有当js可用时才能显示特定的元素。看下面的代码。
- $(document).ready(function(){
- $('html').addClass('JS');
- });
-
- html.JS #message { display:block; }
- #message {display:none;}
这样,只有js可用的时候id为message的元素才会显示;如果不支持js,则该元素不会显示。
26.监听不存在的元素上的事件。
jQuery拥有一个先进的事件处理机制,通过on()方法可以监听还不存在的事件。 这是因为on方法可以传递一个元素的子元素选择器作为参数。看下面的例子:
- <ul id="testList"> <li>Old</li> <li>Old</li> <li>Old</li> <li>Old</li> </ul>
-
- var list = $('#testList');
-
-
- list.on('click','li',function(){
- $(this).remove();
- });
-
-
-
-
- list.append('<li>New item (click me!)</li>');
这样,即使li是后创建的,也可以通过on()方法来监听。
27.只使用一次事件监听。
有时,我们只需要绑定只运行一次的事件处理程序。那么one()方法是一个不错的选择,通过它你就可以高枕无忧了。
- <button id="press">Press me!</ul>
- var press = $('#press');
-
-
- press.one('click',function(){
- alert('This alert will pop up only once');
- });
-
-
-
-
28.模拟触发事件。
我们可以通过使用trigger模拟触发一个click事件。
- <button id="press">Press me!</ul>
- var press = $('#press');
-
-
- press.on('click',function(e, how){
- how = how || '';
- alert('The buton was clicked ' + how + '!');
- });
-
-
- press.trigger('click');
-
-
- press.trigger('click',['fast']);
29.使用触摸事件。
使用触摸事件和相关的鼠标事件并没有太多不同,但是你得有一个方便的移动设备来测试会更好。看下面这个例子。
-
- var ball = $('<div id="ball"></div>').appendTo('body'),
- startPosition = {}, elementPosition = {};
-
-
- ball.on('mousedown touchstart',function(e){
- e.preventDefault();
-
-
- e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
-
-
- startPosition = {x: e.pageX, y: e.pageY};
- elementPosition = {x: ball.offset().left, y: ball.offset().top};
-
-
- ball.on('mousemove.rem touchmove.rem',function(e){
- e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
-
- ball.css({
- top:elementPosition.y + (e.pageY - startPosition.y),
- left: elementPosition.x + (e.pageX - startPosition.x),
- });
-
- });
- });
-
- ball.on('mouseup touchend',function(){
-
- ball.off('.rem');
- });
30.更好地使用on()/off()方法。
在jQuery1.7版本时对事件处理进行了简化,看看下面的例子吧。
- <div id="holder"> <button id="button1">1</button> <button id="button2">2</button> <button id="button3">3</button> <button id="button4">4</button> <button id="clear" style="float: right;">Clear</button> </div>
-
-
-
- var button1 = $('#button1'),
- button2 = $('#button2'),
- button3 = $('#button3'),
- button4 = $('#button4'),
- clear = $('#clear'),
- holder = $('#holder');
-
-
- button1.on('click',function(){
- log('Click');
- });
-
-
- button2.on('mouseenter mouseleave',function(){
- log('In/Out');
- });
-
-
- button3.on('click', Math.round(Math.random()*20), function(e){
-
-
-
- log('Random number: ' + e.data);
-
- });
-
-
- button4.on('click.temp', function(e){
- log('Temp event!');
- });
-
- button2.on('click.temp', function(e){
- log('Temp event!');
- });
-
-
- $('#holder').on('click', '#clear', function(){
- log.clear();
- });
-
-
- var t;
-
- clear.on({
-
- 'mousedown':function(){
-
- t = new Date();
-
- },
-
- 'mouseup':function(){
-
- if(new Date() - t > 1000){
-
-
-
-
-
- $('button').off('.temp');
- alert('The .temp events were cleared!');
- }
-
- }
- });
31.更快地阻止默认事件行为。
我们知道js中可以使用preventDefault()方法来阻止默认行为,但是jQuery对此提供了更简单的方法。如下:
- <a href="http://google.com/" id="goToGoogle">Go To Google</a> $('#goToGoogle').click(false);
32.使用event.result链接多个事件处理程序。
对一个元素绑定多个事件处理程序并不常见,而使用event.result更可以将多个事件处理程序联系起来。看下面的例子。
- <button id="press">点击</button>
- <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
- <script>
-
- var press = $('#press');
- press.on('click',function(){
- return 'Hip';
- });
-
-
-
-
- press.on('click',function(e){
- console.log(e.result + ' Hop!');
- });
- </script>
这样,控制台会输出Hip Hop!
33.创建你自己习惯的事件。
你可以使用on()方法创建自己喜欢的事件名称,然后通过trigger来触发。举例如下:
- <button id="button1">Jump</button> <button id="button2">Punch</button> <button id="button3">Click</button> <button id="clear" style="float: right;">Clear</button> <div id="eventDiv"></div>
- <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script>
-
- <script>
-
- var button1 = $('#button1'),
- button2 = $('#button2'),
- button3 = $('#button3'),
- clear = $('#clear'),
- div = $('#eventDiv');
-
- div.on({
- jump : function(){
- alert('Jumped!');
- },
-
- punch : function(e,data){
- alert('Punched '+data+'!');
- },
-
- click : function(){
- alert('Simulated click!');
- }
-
- });
-
- button1.click(function(){
- div.trigger('jump');
- });
-
- button2.click(function(){
-
- div.trigger('punch',['hard']);
- });
-
- button3.click(function(){
- div.trigger('click');
- });
-
- clear.click(function(){
-
- });
-
- </script>
34.在下载文件旁显示文件大小。
你知道如何在不下载一个文件的情况下通过发送一个ajax请求头得到一个文件的大小吗? 使用jQuery就很容易。
- <a href="001.html" class="fetchSize">First Trickshot</a> <br />
- <a href="034.html" class="fetchSize">This Trickshot</a> <br />
- <a href="assets/img/ball.png" class="fetchSize">Ball.png</a> <br />
-
-
- $('a.fetchSize').each(function(){
-
-
- var link = this;
-
- $.ajax({
- type : 'HEAD',
- url : link.href,
- complete : function(xhr){
-
-
- $(link).append(' (' + humanize(xhr.getResponseHeader('Content-Length')) + ')');
-
- }
- });
-
- });
-
- function humanize(size){
- var units = ['bytes','KB','MB','GB','TB','PB'];
-
- var ord = Math.floor( Math.log(size) / Math.log(1024) );
- ord = Math.min( Math.max(0,ord), units.length-1);
-
- var s = Math.round((size / Math.pow(1024,ord))*100)/100;
- return s + ' ' + units[ord];
- }
注意:这个例子如何我们直接使用浏览器是没法得到的,必须使用本地的web服务器打开运行才可以。
35.使用延迟简化你的Ajax请求
延迟(deferreds)是一个强大的工具。jQuery对于每一个Ajax请求都会返回一个deferred对象。 deferred.done()
方法接受一个或多个参数,所有这些都参数可以是一个单一的函数或一个函数数组。当Deferred(延迟)解决时,doneCallbacks被调用。回调是依照他们添加的顺序执行。一旦deferred.done()
返回Deferred(延迟)对象,Deferred(延迟)可以链接其它的延迟对象,包括增加额外的.done()
方法。下面这样就会使你的代码更易读:
-
-
-
- $.get('assets/misc/1.json').done(function(r){
- log(r.message);
- });
-
-
-
-
-
-
- $.get('assets/misc/non-existing.json').fail(function(r){
- log('Oops! The second ajax request was "' + r.statusText + '" (error ' + r.status + ')!');
- });
36.平行的运行多个Ajax请求。
当我们需要发送多个Ajax请求是,相反于等待一个发送结束再发送下一个,我们可以平行地发送来加速Ajax请求发送。
-
-
- $.when($.get('assets/misc/1.json'), $.get('assets/misc/2.json')).then(function(r1, r2){
- log(r1[0].message + " " + r2[0].message);
- });
37.通过jQuery获得ip
我们不仅可以在电脑上ping到一个网站的ip,也可以通过jQuery得到。
- $.get('http://jsonip.com/', function(r){ log(r.ip); });
-
-
-
38.使用最简单的ajax请求
jQuery(使用ajax)提供了一个速记的方法来快速下载内容并添加在一个元素中。
- <p class="content"></p> <p class="content"></p>
-
- var contentDivs = $('.content');
-
-
- contentDivs.eq(0).load('1.txt');
-
-
- contentDivs.eq(1).load('1.html #header');
39.序列化对象
jQuery提供了一个方法序列化表单值和一般的对象成为URL编码文本字符串。这样,我们就可以把序列化的值传给ajax()作为url的参数,轻松使用ajax()提交表单了。
- <form action="">
- First name: <input type="text" name="FirstName" value="Bill" /><br />
- Last name: <input type="text" name="LastName" value="Gates" /><br />
- </form>
-
-
-
-
- $(document).ready(function(){
- console.log($("form").serialize());
- });
-
-
- log($.param({'pet':'cat', 'name':'snowbell'}));
作者:918之初
来源:51CTO