Question:1
Explain what the following code will
do:
$(
"div#first, div.first, ol#items > [name$='first']" )
Answer:
This code
performs a query to retrieve any
<div>
element with the id first
, plus all <div>
elements with the
class first
, plus all elements
which are children of the <ol
id="items">
element and whose name
attribute ends with the
string "first"
.
This is an example of using multiple selectors at once. The function will
return a jQuery object containing the results of the query.
Question:2
What is wrong with this code, and how can it be fixed to work properly even with buttons that are added later dynamically?
// define the click handler for all buttons
$( "button" ).bind( "click", function() {
alert( "Button Clicked!" )
});
/* ... some time later ... */
// dynamically add another button to the page
$( "html" ).append( "<button>Click Alert!</button>" );
Answer:
The button that is added dynamically after the call to bind()
will not have the click handler attached. This is because the bind()
method only attaches handlers to elements that exist at the time the call to bind()
is made.
This problem is solved with functions that use “event bubbling” to match events on both current and future elements. In the past, this was done by replacing bind()
with live()
. live()
was deprecated in jQuery 1.7 though. delegate()
works similarly to live()
but also provides control over how far an event must bubble up the DOM.
However, the recommended method is to use on()
, which can behave like bind()
, live()
, or delegate()
depending on syntax. The following code attaches the handler to all current and future buttons:
// define the click handler for all buttons
$( document ).on( "click", "button", function() {
alert( "Button Clicked!" )
});
/* ... some time later ... */
// dynamically add another button to the page
$( "html" ).append( "<button>Click Alert!</button>" );
Question:3
What’s the deal with the $
in jQuery? What is it and what does it mean?
Also, how can jQuery be used in conjunction with another JavaScript library that also uses $
for naming? Bonus credit if you can provide two answers.
Answer:
Since $
has no special meaning in JavaScript, it is free to be used in object naming. In jQuery, it is simply used as an alias for the jQuery
object and jQuery()
function.
However, jQuery has no monopoly on use of $
, so you may encounter situations where you want to use it in conjunction with another JS library that also uses $
, which would therefore result in a naming conflict. jQuery provides the jQuery.noConflict()
method for just this reason. Calling this method makes it necessary to use the underlying name jQuery
instead in subequent references to jQuery and its functions.
Here’s an example from the jQuery documentation:
<script src="other_lib.js"></script>
<script src="jquery.js"></script>
<script>
$.noConflict();
// Code that uses other library's $ can follow here.
</script>
Alternatively, you can also use a closure instead of the $.noConflict() method; e.g.:
(function ($) {
// Code in which we know exactly what the meaning of $ is
} (jQuery));
No comments:
Post a Comment
Thanks