jQuery中的一些小技巧


Posted in Javascript onJanuary 18, 2017

JQ使用过程中,一些小技巧:

1.is()方法

根据选择器、元素或 jQuery 对象来检测匹配元素集合,如果这些元素中至少有一个元素匹配给定的参数,则返回 true。一些小应用如下:

<ul>
 <li>list <strong>item 1</strong></li>
 <li><span>list item 2</span></li>
 <li>list item 3</li>
</ul>
$("ul").click(function(event) {
 var $target = $(event.target);
 if ( $target.is("li") ) {
  $target.css("background-color", "red");
 }
});

如此,便可以限制住,只有列表项li本身点击之后,才会触发写入的点击事件.

其也可以做以下一些判断:

// 是不是一个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!");

这里有一点需要注意,&&运算符可以用来做一个判断,当前面的条件满足时,后面的会执行,但是后面的条件不能是表达式,只能是console.log()或则++i一类的.

还有以下比较有用的用法:

elem.animate({'width':200},1000);
// 是否正在动画
elem.is(':animated') && console.log("it is animated!");

2.jquery中拓展方法

$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效。

如扩展$.fn.abc(),即$.fn.abc()是对jquery扩展了一个abc方法,那么后面你的每一个jquery实例都可以引用这个方法了.

那么你可以这样子:$("#div").abc();

jQuery.extend(object);为扩展jQuery类本身.为类添加新的方法。

jQuery.fn.extend(object);给jQuery对象添加方法。

jQuery.extend(object); 为jQuery类添加添加类方法,可以理解为添加静态方法。如:

elem.animate({'width':200},1000);
// 是否正在动画
elem.is(':animated') && console.log("it is animated!");

便为 jQuery 添加一个为add 的 “静态方法”,之后便可以在引入 jQuery 的地方,使用这个方法了,

$.add(3,4); //return 7

jQuery.fn.exists = function(){ return this.length > 0; }
console.log($('#elem').exists() ? "exists!" : "doesn't exist!");

3.jQuery方法$()实际上是拥有两个参数的

$('li','#firstList').each(function(){
  console.log($(this).html());
});

这里,第二个参数用来限制第一个参数给定的查找结果

$('<div>',{
  "class": "bigBlue",
  "css": {
    "background-color":"purple"
  },
  "width" : 20,
  "height": 20,
  "animate" : {  // 可以设置div的动画效果
    "width": 200,
    "height":50
  }
}).appendTo('#result');

这里,第二个参数用来对创建的元素进行设置.

4.jquery中的end()方法,可以让链式语法写起来更加高效,快捷.

<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>
breakfast.find('.eggs').text('Yes').end() // back to breakfast
.find('.toast').text('Yes').end().find('.juice').toggleClass('juice coffee').text('Yes');

这里,end()会返回查找元素的上一级.

5.contextmenu事件  右键点击

也许希望web 应用感觉更像原生的,那么可以阻止contextmenu默认事件。

$(function(){
  $(document).on("contextmenu",function(e){
    e.preventDefault();
  });
});

当然,应用此事件,也可以自定义,右键出来的操作菜单,类似于

jQuery中的一些小技巧

6.有时候不希望网页的某一部分内容被选择比如复制粘贴这种事情,我们可以这么做:

$('p.descr').attr('unselectable', 'on').css('user-select', 'none').on('selectstart', false);

这样,内容就不能再被选择了.

7.最小的DOM操作

用js操作DOM是非常浪费资源的,下面的方法一般是我们通常的做法:

var elem = $('#elem');
for(var i = 0; i < 100; i++){
  elem.append('<li>element '+i+'</li>');
}

这样做,重复的向元素中添加,无疑是一种极大的资源浪费,而通过下面的方法,则可以减少大量的DOM操作

var elem = $('#elem'),
arr = [];
for(var i = 0; i < 100; i++){
  arr.push('<li>element '+i+'</li>');
}
elem.append(arr.join(''));

8.更方便的分解URL

我们一般可以使用正则表达式来分解URL,但是这并不是一个好方法,我们可以借助a标签来完成URL的分解

var url = 'http://tutorialzine.com/books/jquery-trickshots?trick=12&&abc=123#comments';
  var a = $('<a>',{ href: url });
  console.log(url); 
  console.log('Host name: ' + a.prop('hostname')); //Host name: tutorialzine.com
  console.log('Path: ' + a.prop('pathname')); //Path: /books/jquery-trickshots
  console.log('Query: ' + a.prop('search')); //Query: ?trick=12&&abc=123
  console.log('Protocol: ' + a.prop('protocol')); //Protocol: http:
  console.log('Hash: ' + a.prop('hash')); //Hash: #comments

这样我们就可以很快速的完成URL的分解

9.有时候,缓存selector,反而可以优化你的js

下面有三种情况,第一种情况是一部分人的通常做法,这种写法费力而且不讨好,后面两种方案则是对第一种的优化,可以二选一.

第一种:

$('#pancakes li').eq(0).remove();
$('#pancakes li').eq(1).remove();
$('#pancakes li').eq(2).remove();

第二种和第三种,可以二选一:

//第二种
var pancakes = $('#pancakes li');
pancakes.eq(0).remove();
pancakes.eq(1).remove();
pancakes.eq(2).remove();
//第三种
pancakes.eq(0).remove().end().eq(1).remove().end().eq(2).remove().end();

10.on()方法

on() 方法在被选元素及子元素上添加一个或多个事件处理程序。

自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品。该方法给 API 带来很多便利,推荐使用该方法,它简化了 jQuery 代码库。

注意:使用 on() 方法添加的事件处理程序适用于当前及未来的元素(比如由脚本创建的新元素)。

提示:如需移除事件处理程序,请使用 off() 方法。

提示:如需添加只运行一次的事件然后移除,请使用 one 方法。

$(selector).on(event,childSelector,data,function,map)

jQuery中的一些小技巧

11.模拟触发事件

我们可以通过trigger模拟触发一个click事件

var press = $('#press');
press.on('click',function(e, how){
  how = how || '';
  alert('The buton was clicked ' + how + '!');
});
press.trigger('click');
press.trigger('click',['fast']);

同时,我们亦可以,使用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>
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(){
  // Pass data along with the event
  div.trigger('punch',['hard']);
});
button3.click(function(){
  div.trigger('click');
});
clear.click(function(){
  //some clear code
});

12.触摸事件

// Define some variables
var ball = $('<div id="ball"></div>').appendTo('body'),
startPosition = {}, elementPosition = {};
// Listen for mouse and touch events
ball.on('mousedown touchstart',function(e){
  e.preventDefault();
  // Normalizing the touch event object
  e = (e.originalEvent.touches) ? e.originalEvent.touches[0] : e;
  // Recording current positions
  startPosition = {x: e.pageX, y: e.pageY};
  elementPosition = {x: ball.offset().left, y: ball.offset().top};
  // These event listeners will be removed later
  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(){
  // Removing the heavy *move listeners
  ball.off('.rem');
});

13.更快的阻止默认事件

通常,我们用event.preventDefalut()来阻止默认事件,但是jquery为此提供了更简便的方法:

<a href="http://google.com/" id="goToGoogle">Go To Google</a>
$('#goToGoogle').click(false);

14.使用event.result链接多个事件处理程序。

对一个元素绑定多个事件处理程序并不常见,而使用event.result更可以将多个事件处理程序联系起来。看下面的例子。

var press = $('#press');
press.on('click',function(){
  return 'Hip';
});
press.on('click',function(e){
  console.log(e.result + ' Hop!');
})
//控制台输出: HipHop!

15.平行的运行多个Ajax请求

当我们需要发送多个Ajax请求是,相反于等待一个发送结束再发送下一个,我们可以平行地发送来加速Ajax请求发送。

$.when($.get('assets/misc/1.json'), $.get('assets/misc/2.json')).then(function(r1, r2){
  console.log(r1[0].message + " " + r2[0].message);
})

16.通过jQuery获得ip

我们不仅可以在电脑上ping到一个网站的ip,也可以通过jQuery得到

$.get('https://jsonip.com/', function(res){ console.log(res.ip); });

17.使用最简单的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');

18.通过IP地址获得地理位置

有很多在线服务可以告诉我们IP地址所在的城市和国家,下面我们先ping到百度的IP地址,然后获取其地理位置:

var ip = '119.75.218.70',
  api = 'http://freegeoip.net/json/' + ip + '?callback=?';
$.getJSON(api, function(r){
  console.log('How is the weather in ' + r.city + ', ' + r.country_name + '?');
});

19.使用匿名函数来产生一个独立的代码块

定义全局变量和函数是一种代码很粗糙的行为,更好的方式是通过使用匿名函数使你的代码独立于块之中。看下面的例子:

(function($){
  var c = 1;
  $.fn.count = function(){
    log(c++);
    return this;
  }; 
})(jQuery);
$(document).count();
$('body').count().count();

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
用js实现键盘方向键翻页功能的代码
Jun 03 Javascript
跟着JQuery API学Jquery 之二 属性
Apr 09 Javascript
用jquery统计子菜单的条数示例代码
Oct 18 Javascript
jquery实现图片水平滚动效果代码分享
Aug 26 Javascript
JS实现仿苹果底部任务栏菜单效果代码
Aug 28 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(二)
Dec 10 Javascript
JavaScript函数节流概念与用法实例详解
Jun 20 Javascript
jQuery实现Select下拉列表进行状态选择功能
Mar 30 jQuery
node打造微信个人号机器人的方法示例
Apr 26 Javascript
深入浅析Node.js 事件循环、定时器和process.nextTick()
Oct 22 Javascript
用vuex写了一个购物车H5页面的示例代码
Dec 04 Javascript
微信小程序wxml列表渲染原理解析
Nov 27 Javascript
AngularJS Select(选择框)使用详解
Jan 18 #Javascript
基于JavaScript实现屏幕滚动效果
Jan 18 #Javascript
JavaScript计时器用法分析【setTimeout和clearTimeout】
Jan 18 #Javascript
JavaScript实现简易的天数计算器实例【附demo源码下载】
Jan 18 #Javascript
原生Javascript插件开发实践
Jan 18 #Javascript
js实现炫酷的左右轮播图
Jan 18 #Javascript
jQuery实现别踩白块儿网页版小游戏
Jan 18 #Javascript
You might like
PHP实现手机归属地查询API接口实现代码
2012/08/27 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php笔记之:php数组相关函数的使用
2013/04/26 PHP
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
ExtJS Store的数据访问与更新问题
2010/04/28 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
2016/12/30 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
JavaScript实现垂直滚动条效果
2017/01/18 Javascript
浅谈Vue.js中ref ($refs)用法举例总结
2017/12/19 Javascript
详解Vue.js自定义tipOnce指令用法实例
2018/12/19 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
2019/04/17 Javascript
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python里将list中元素依次向前移动一位
2014/09/12 Python
Python并发编程协程(Coroutine)之Gevent详解
2017/12/27 Python
深入flask之异步非堵塞实现代码示例
2018/07/31 Python
python 实现分页显示从es中获取的数据方法
2018/12/26 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
Python+redis通过限流保护高并发系统
2020/04/15 Python
python mock测试的示例
2020/10/19 Python
举例讲解Python装饰器
2020/12/24 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
荷兰领先的百货商店:De Bijenkorf
2018/10/17 全球购物
《夜晚的实验》教学反思
2014/02/19 职场文书
安卓程序员求职信
2014/02/28 职场文书
公司合并协议书范本
2014/09/30 职场文书
大学生暑假实习总结
2015/07/13 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2016年秋季运动会广播稿
2015/12/21 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
经典人生语录分享:不畏将来,不念过去,笑对当下
2019/12/12 职场文书
教你如何使用Python开发一个钉钉群应答机器人
2021/06/21 Python
用PYTHON去计算88键钢琴的琴键频率和音高
2022/04/10 Python
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python
浅谈MySql update会锁定哪些范围的数据
2022/06/25 MySQL