So I just found out that you can pass custom parameters to jQuery's trigger()
, which greatly simplifies automating UI actions.
Say you're building a really basic carousel:
<ul class="carousel"> <li><img src="slide1.jpg" /></li> <li><img src="slide2.jpg" /></li> <li><img src="slide3.jpg" /></li> </ul> <button id="next">Next</button> $.fn.carousel = function(options) { //hide all the slides, except the first one this.children().hide().first().show() var self = this $(options.next).click(function(e) { e.preventDefault() //move first slide to end of list and hide it self.children().first().appendTo(self).hide() //show new first slide self.children().first().show() }) } $(".carousel").carousel({next: "#next"})
And say you want to make it rotate automatically every 10 seconds.
var animation = setInterval(function() { $("#next").trigger("click") }, 10000)
BUT, you want to make it stop once a user clicks the button to go next. What now?
Custom parameters
You basically just want to differentiate between a real user clicking, and the click event that is fired programmatically from the setInterval. We can use custom parameters to do this fairly elegantly:
var animation = setInterval(function() { $("#next").trigger("click", [true]) }, 10000) $.fn.carousel = function(options) { //hide all the slides, except the first one this.children().hide().first().show() var self = this $(options.next).click(function(e, continueAnimation) { if (!continueAnimation) clearInterval(animation) e.preventDefault() //move first slide to end of list and hide it self.children().first().appendTo(self).hide() //show new first slide self.children().first().show() }) } $(".carousel").carousel({next: "#next"})
A regular click event only passes the event object as a parameter to the callback function, so the continueAnimation
variable is undefined in that case. When triggering the event programmatically, we can pass the value true
and run code conditionally based on that.
So that's it.
No comments:
Post a Comment