zoukankan      html  css  js  c++  java
  • 扩展 -------jQuery

    本文摘要:http://www.liaoxuefeng.com/

    编写jQuery插件

    为了满足需求,我们经常会调用一些插件,js插件都是别人写的,今天就来了解了解一些方法。

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

    $.fn.highlight1 = function () {
        // this已绑定为当前jQuery对象:
        this.css('backgroundColor', '#fffceb').css('color', '#d85030');
        return this;  //返回this  就是说还可以继续链式写法
    }

    使用:

    $('#XX').highlight1();
    $('#XX').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;
    }

    调用:

    $('#XXX').highlight2({
        backgroundColor: '#00a8e6',
        color: '#ffffff'
    });

    对于默认值的处理,我们用了一个简单的&&||短路操作符,总能得到一个有效的值。

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

    // 把默认值和用户传入的options合并到对象{}中并返回:        第二个参数就是默认值,最后一个则是用户传入的参数
    var opts = $.extend({}, {
        backgroundColor: '#00a8e6',
        color: '#ffffff'
    }, options);

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

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

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

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

    $.fn.highlight = function (options) {
        // 合并默认值和用户设定值:
        var opts = $.extend({}, $.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()了。

    $.fn.highlight.defaults.color = '#659f13';  //设置默认值
    $.fn.highlight.defaults.backgroundColor = '#f2fae3';
    
    $('#xxx').highlight();
    
    $('#yyy').highlight({     
        color: '#dd1144'
    });

    最终,我们得出编写一个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);
                    }
                });
            }
        });
    }

    对如下的HTML结构:

    <!-- HTML结构 -->
    <div id="test-external">
        <p>如何学习<a href="http://jquery.com">jQuery</a>?</p>
        <p>首先,你要学习<a href="/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000">JavaScript</a>,并了解基本的
    <a href="https://developer.mozilla.org/en-US/docs/Web/HTML">HTML</a>。</p> </div>
    
    
    $('#test-external a').external();

    效果:

    小结

    扩展jQuery对象的功能十分简单,但是我们要遵循jQuery的原则,编写的扩展方法能支持链式调用、具备默认值和过滤特定元素,使得扩展方法看上去和jQuery本身的方法没有什么区别。

  • 相关阅读:
    WPF 本地化语言设置
    WPF 调节树状图滚动条值
    WPF中ListBox的使用注意事项
    SQL 树状结构表中查出所所有父级/子级
    Vue创建
    wpf 控件注意事项
    链表习题(1)-设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点
    排序-快速排序
    排序-堆排序
    图-图的遍历
  • 原文地址:https://www.cnblogs.com/Sea1ee/p/7192975.html
Copyright © 2011-2022 走看看