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;
共同学习,写下你的评论
评论加载中...
作者其他优质文章