jQuery tips and tricks - 1

申高峰
2023-12-01

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;
 类似资料: