JavaScript jQuery 事件、动画、扩展

事件

http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/00143564690172894383ccd7ab64669b4971f4b03fa342d000

动画

http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/001434500456006abd6381dc3bb439d932cb895b62d9eee000

扩展

jQuery内置的方法永远不可能满足所有的需求。比如,我们想要高亮显示某些DOM元素,用jQuery可以这么实现:

$(‘span.hl‘).css(‘backgroundColor‘, ‘#fffceb‘).css(‘color‘, ‘#d85030‘);
$(‘p a.hl‘).css(‘backgroundColor‘, ‘#fffceb‘).css(‘color‘, ‘#d85030‘);

总是写重复代码可不好,万一以后还要修改字体就更麻烦了,能不能统一起来,写个highlight()方法?

$(‘span.hl‘).highlight();
$(‘p a.hl‘).highlight();

答案是肯定的。我们可以扩展jQuery来实现自定义方法。将来如果要修改高亮的逻辑,只需修改一处扩展代码。这种方式也称为编写jQuery插件。

jQuery插件

给jQuery对象绑定一个新方法是通过扩展$.fn对象实现的。让我们来编写第一个扩展——highlight1()

$.fn.highlight1 = function () {
    // this已绑定为当前jQuery对象:
    this.css(‘backgroundColor‘, ‘#fffceb‘).css(‘color‘, ‘#d85030‘);
    return this;
}

注意到函数内部的this在调用时被绑定为jQuery对象,所以函数内部代码可以正常调用所有jQuery对象的方法。

对于如下的HTML结构:

<div id="test-highlight1">
    <p>什么是<span>jQuery</span></p>
    <p><span>jQuery</span>是目前最流行的<span>JavaScript</span>库。</p></div>

为什么最后要return this;?因为jQuery对象支持链式操作,我们自己写的扩展方法也要能继续链式下去:

$(‘span.hl‘).highlight1().slideDown();

不然,用户调用的时候,就不得不把上面的代码拆成两行。

但是这个版本并不完美。有的用户希望高亮的颜色能自己来指定,怎么办?

我们可以给方法加个参数,让用户自己把参数用对象传进去。于是我们有了第二个版本的highlight2()

$.fn.highlight2 = function (options) {
    // 要考虑到各种情况:
    // options为undefined
    // options只有部分key
    var bgcolor = options && options.backgroundColor || ‘#fffceb‘;
    var color = options && options.color || ‘#d85030‘;
    this.css(‘backgroundColor‘, bgcolor).css(‘color‘, color);
    return this;
}

另一种方法是使用jQuery提供的辅助方法$.extend(target, obj1, obj2, ...),它把多个object对象的属性合并到第一个target对象中,遇到同名属性,总是使用靠后的对象的值,也就是越往后优先级越高:

// 把默认值和用户传入的options合并到对象{}中并返回:
var opts = $.extend(false, {
    backgroundColor: ‘#00a8e6‘,
    color: ‘#ffffff‘
}, options);

紧接着用户对highlight2()提出了意见:每次调用都需要传入自定义的设置,能不能让我自己设定一个缺省值,以后的调用统一使用无参数的highlight2()

也就是说,我们设定的默认值应该能允许用户修改。

那默认值放哪比较合适?放全局变量肯定不合适,最佳地点是$.fn.highlight2这个函数对象本身。

于是最终版的highlight()终于诞生了:

$.fn.highlight = function (options) {
    // 合并默认值和用户设定值: false可忽略,默认为false;
    var opts = $.extend(false, $.fn.highlight.defaults, options);
    this.css(‘backgroundColor‘, opts.backgroundColor).css(‘color‘, opts.color);
    return this;
}
// 设定默认值:
$.fn.highlight.defaults = {
    color: ‘#d85030‘,
    backgroundColor: ‘#fff8de‘
}

用户使用时,只需一次性设定默认值:

$.fn.highlight.defaults.color = ‘#fff‘;
$.fn.highlight.defaults.backgroundColor = ‘#000‘;

然后就可以非常简单地调用highlight()了。

最终,我们得出编写一个jQuery插件的原则:

  1. $.fn绑定函数,实现插件的代码逻辑;
  2. 插件函数最后要return this;以支持链式调用;
  3. 插件函数要有默认值,绑定在$.fn.<pluginName>.defaults上;
  4. 用户在调用时可传入设定值以便覆盖默认值。

针对特定元素的扩展

我们知道jQuery对象的有些方法只能作用在特定DOM元素上,比如submit()方法只能针对form。如果我们编写的扩展只能针对某些类型的DOM元素,应该怎么写?

还记得jQuery的选择器支持filter()方法来过滤吗?我们可以借助这个方法来实现针对特定元素的扩展。

举个例子,现在我们要给所有指向外链的超链接加上跳转提示,怎么做?

先写出用户调用的代码:

$(‘#main a‘).external();

然后按照上面的方法编写一个external扩展:

$.fn.external = function () {
    // return返回的each()返回结果,支持链式调用:
    return this.filter(‘a‘).each(function () {
        // 注意: each()内部的回调函数的this绑定为DOM本身!
        var a = $(this);
        var url = a.attr(‘href‘);
        if (url && (url.indexOf(‘http://‘)===0 || url.indexOf(‘https://‘)===0)) {
            a.attr(‘href‘, ‘#0‘)
             .removeAttr(‘target‘)
             .append(‘ <i class="uk-icon-external-link"></i>‘)
             .click(function () {
                if(confirm(‘你确定要前往‘ + url + ‘?‘)) {
                    window.open(url);
                }
            });
        }
    });
}
时间: 2024-10-04 02:08:20

JavaScript jQuery 事件、动画、扩展的相关文章

Javascript - Jquery - 事件

事件(Event) 页面载入事件 ready(x) x是事件侦听器,由window或document调用.加载完毕会调用x. $(document).ready(function(){ }) //可以简写为:$(function(){ }) //或 $(document).ready(aa=function(){ }) //或 $(document).ready(aa) function aa(){ } 键盘鼠标事件 keyup(x) x是事件侦听器,键盘按下时或使用鼠标粘贴时会调用x. $(d

JavaScript JQuery输入正则扩展InputVerify【jquery-InputVerify.js】

正则表达式的工具类,目前包括文本长度.手机号.邮箱.特殊字符.html标签.url地址格式.中文.英文.为空.数字,提供了jquery和Dom的使用方式,依赖于jquery 有三种使用方式,分别为标签.jQuery和Dom 标签需要为标签添加verify和onverify属性,verify为正则判断配置文本,这个配置为BinVerify的参数,onverify为正则判断回调function名称,在标签使用之前需要使用jQuery内的扩展方法Verify启用:$.Verify(); [注:这里的o

JavaScript, JQuery事件委托

1.引言 现实当中,前台MM收到快递后,她会判断收件人是谁,然后按照收件人的要求签收,甚至代为付款.(公司也不会容忍那么多员工站在门口就为了等快递); 这种事件委托还有个好处,就是即便公司又来很多员工,前台MM照样可以签收新员工的快递,新员工即便刚来但一样拥有拿自己快件的方法: 2.概念 通俗来讲: 事件有:onclick.onmouseover.onmouseout等等:委托呢,就是让别人来做,这件事情本身是加在元素上,然而你却加载别人身上来做,完成事件: 3.原理 利用冒泡原理,将事件加在父

javascript事件之:jQuery事件接口概述

事件的操作,在JavaScript是非常频繁的.然而原生javaScript的事件API让新手感觉非常不友好,再加上事件依赖于DOM,而原生javaScript对DOM的选择又是三板斧的功力.由此催生出以jQuery为领头羊的对原生js事件操作的兼容性处理,API优化以及一些功能的拓展. 现在,以jQuery2.0.3为例,我们来看看jQuery的事件接口. 首先来看拓展到jQuery.prototype下的实例方法: //5049 - 51501 jQuery.fn.extend({ 2 on

JavaScript之jQuery-4 jQuery事件(页面加载后执行、事件处理、事件冒泡、事件对象、模拟操作)

一.jQuery 页面加载后执行 代码执行的时机选择 - $(document).ready()方法和 window.onload事件具有相似的功能,但是在执行时机方面是有区别的 - window.onload 事件是在网页中所有的元素(包括元素的所有关联文件)完全加载到浏览器后才执行 - $(document).ready()方法注册的事件处理程序,在DOM完全加载后就可以调用 - 一般来讲, $(document).ready()的执行要优于window.onload事件 - 需要注意的是,

Javascript学习------top/left简单动画,效果与jquery的动画差不多

在网上查看jquery的动画帧率为13毫秒 我用下面的小例子验证了一下: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>top/left简单动画</title> 5 <style type="text/css"> 6 * { margin: 0px; padding: 0px; } 7 </style> 8 <script src="http:

javascript事件委托和jQuery事件绑定on、off 和one

一. 事件委托什么是事件委托?用现实中的理解就是:有100 个学生同时在某天中午收到快递,但这100 个学生不可能同时站在学校门口等,那么都会委托门卫去收取,然后再逐个交给学生.而在jQuery 中,我们通过事件冒泡的特性,让子元素绑定的事件冒泡到父元素(或祖先元素)上,然后再进行相关处理即可.如果一个企业级应用做报表处理,表格有2000 行,每一行都有一个按钮处理.如果用之前的.bind()处理,那么就需要绑定2000 个事件,就好比2000 个学生同时站在学校门口等快递,不断会堵塞路口,还会

JavaScript&amp;jQuery.键盘事件

键盘事件 键盘事件,当用户操作键盘时发生. 常见的键盘事件有: input,当<input>或<textarea>元素的值发生变化时触发. keydonw,当用户按下键盘上的任意键时触发. keypress,当用户按下键盘上一个键并在屏幕上反映一个字符时触发. keyup,当用户松开键盘上一个键时触发. <html> <head> <title>TODO supply a title</title> <meta charset=

JavaScript&amp;jQuery.HTML5事件

HTML5事件 事件 说明 DOMContentLoaded 在DOM树形成后触发(与此同时,图片.CSS和JavaScript可能还在加载).在这个事件中,脚本运行要早于load事件,因为load事件会等待所有资源(比如图片或广告)加载完之后才触发.这种方式会让页面看起来加载速度更快. hashchange 当URL的hash值变化时(不会造成整个窗口刷新)触发.hash值通常在链接中用来指定不同的部分(也被称作为锚点),在使用AJAX加载的页面内容中也会被使用. beforeunload 当