zoukankan      html  css  js  c++  java
  • jQuery tips and tricks 1

    There are many
    articles
    about jQuery tips and tricks on the internet.

    I am very happy to have so many resources for reference, and i will make my own
    examples in order to learn these tips and tricks for a better work effective.

    1. Get the DOM elements from a jQuery object

        $("div")[0];
    $("div").get(0);
    $("div").get()[0];

    Note:get() returns all matched DOM elements in an array.

    Get the tag name of a DOM node:

        $("body")[0].tagName.toLowerCase() === "body"; // true
    $("div").click(function() {
    this.tagName.toLowerCase() === "div"; //true
    });

    2. Whether a jQuery object has DOM elements

        if($("div").length) {
    // there is at least one div DOM element in the page
    }
    // The following code snipppets do the same thing:
    // if($("div").size()) ...
    // if($("div")[0]) ...
    // if($("div").get(0)) ...

    Beware of the this error decision:

        // if($("div")) ....

    beacuse:

        !!$("div") // true
    !!$("no_thus_tag") // true
    !!$({}) // true

    3. Find the index of an element

        <ul class="menu">
    <li>menu 1</li>
    <li>menu 2</li>
    <li>menu 3</li>
    </ul>
        $("ul.menu li").click(function() {
    // Find the index of this li node
    $(this).parent().find("li").index(this); // "menu 1" -> 0
    });

    Or it can be write in a more effective way:

        var lis = $("ul.menu li");
    lis.click(function() {
    lis.index(this); // "menu 3" -> 2
    });

    4. Bind event to ANY jQuery object, NOT only jQuery DOM object

    In Athena client-side JavaScript framework, we need a global event publish&subscribe
    mechanism:

        (function() {

    function eventNode() {
    var node = $("#_wbx_event");
    if (node.length === 0) {
    node = $("<div />").attr("id", "_wbx_event").appendTo("body");
    }
    return node;
    }

    $.wbx = $.wbx || {};
    $.wbx.util = {
    trigger: function() {
    var node = eventNode();
    node.trigger.apply(node, arguments);
    },

    bind: function() {
    var node = eventNode();
    node.bind.apply(node, arguments);
    }
    };

    })();

    This code can also be wrote like this:

        (function() {

    var eventObj = $({});

    $.wbx = $.wbx || {};
    $.wbx.util = {
    trigger: function() {
    eventObj.trigger.apply(eventObj, arguments);
    },

    bind: function() {
    eventObj.bind.apply(eventObj, arguments);
    }
    };

    })();

    Test code:

        $(function() {

    $.wbx.util.bind("custom_event_1", function(e, data) {
    // trigger custom_event_1 target_body
    alert("trigger custom_event_1 " + data);
    });

    $("body").click(function() {
    $.wbx.util.trigger("custom_event_1", ["target_body"]);
    });

    });

    5. $.fn is just a shortcut of $.prototype

    In fact, $ is a function and $.prototype is used to define functions that extend
    the jQuery objects.

    In the beginning, i was confused with the principle of jQuery:

    If $ is a function, and we define a plugin like this $.prototype.plugin1 = function()
    {};

    It’s likely we should invoke our plugin this way:

        (new $("div")).plugin1();

    But actually invocation:

        $("div").plugin1();

    After review the jQuery source code, i understood the way jQuery works.

    And this is a step by step tutorial to demostrate how can jQuery achieve this:

    STEP 1:

        function W() {
    }
    W.prototype.plugin1 = function() {
    alert("plugin1");
    };
    (new W()).plugin1();

    STEP 2:

        function W() {
    return new Q();
    }
    function Q() {
    }
    Q.prototype.plugin1 = function() {
    alert("plugin1");
    };
    W().plugin1();

    STEP 3:

        function W() {
    return new Q();
    }
    function Q() {
    }
    Q.prototype = W.prototype;

    W.prototype.plugin1 = function() {
    alert("plugin1");
    };
    W().plugin1();

    STEP 4:

        function W() {
    return new W.prototype.init();
    }
    W.prototype = {
    init: function() {
    }
    };
    W.prototype.init.prototype = W.prototype;

    W.prototype.plugin1 = function() {
    alert("plugin1");
    };
    W().plugin1();

    STEP 5: The following is the way jQuery implement:

        jQuery = function(selector, context) {
    // The jQuery object is actually just the init constructor 'enhanced'
    return new jQuery.fn.init(selector, context);
    };

    jQuery.fn = jQuery.prototype = {
    init: function(selector, context) {
    var result = []; // omit the implemention details
    return this.setArray(result);
    },
    setArray: function(elems) {
    // Resetting the length to 0, then using the native Array push
    // is a super-fast way to populate an object with array-like properties
    this.length = 0;
    Array.prototype.push.apply(this, elems);
    return this;
    }
    };
    // Give the init function the jQuery prototype for later instantiation
    jQuery.fn.init.prototype = jQuery.fn;
  • 相关阅读:
    让美国震惊的10大营销案例
    嵌入式培训为什么选凌阳教育?
    推荐几本互联网行业的经典书目
    谈谈被误解的友情链接交换条件【转】
    20 tips for building modern sites while supporting old versions of IE
    国外PHP大师给初学者的8条建议
    专访许雪松:深入理解嵌入式开发
    周宁:做一个生意之前,请自问自己6个问题
    《时代》百大影响力人物:任正非李开复上榜
    TPL DataFlow初探(二)
  • 原文地址:https://www.cnblogs.com/sanshi/p/1504809.html
Copyright © 2011-2022 走看看