Skip to content

Instantly share code, notes, and snippets.

@PizzaBrandon
Forked from buu700/jquery.waituntilexists.js
Last active August 24, 2023 14:23
Show Gist options
  • Star 71 You must be signed in to star a gist
  • Fork 26 You must be signed in to fork a gist
  • Save PizzaBrandon/5709010 to your computer and use it in GitHub Desktop.
Save PizzaBrandon/5709010 to your computer and use it in GitHub Desktop.
Updated waitUntilExists plugin
;(function ($, window) {
var intervals = {};
var removeListener = function(selector) {
if (intervals[selector]) {
window.clearInterval(intervals[selector]);
intervals[selector] = null;
}
};
var found = 'waitUntilExists.found';
/**
* @function
* @property {object} jQuery plugin which runs handler function once specified
* element is inserted into the DOM
* @param {function|string} handler
* A function to execute at the time when the element is inserted or
* string "remove" to remove the listener from the given selector
* @param {bool} shouldRunHandlerOnce
* Optional: if true, handler is unbound after its first invocation
* @example jQuery(selector).waitUntilExists(function);
*/
$.fn.waitUntilExists = function(handler, shouldRunHandlerOnce, isChild) {
var selector = this.selector;
var $this = $(selector);
var $elements = $this.not(function() { return $(this).data(found); });
if (handler === 'remove') {
// Hijack and remove interval immediately if the code requests
removeListener(selector);
}
else {
// Run the handler on all found elements and mark as found
$elements.each(handler).data(found, true);
if (shouldRunHandlerOnce && $this.length) {
// Element was found, implying the handler already ran for all
// matched elements
removeListener(selector);
}
else if (!isChild) {
// If this is a recurring search or if the target has not yet been
// found, create an interval to continue searching for the target
intervals[selector] = window.setInterval(function () {
$this.waitUntilExists(handler, shouldRunHandlerOnce, true);
}, 500);
}
}
return $this;
};
}(jQuery, window));
(function(e,f){var b={},g=function(a){b[a]&&(f.clearInterval(b[a]),b[a]=null)};e.fn.waitUntilExists=function(a,h,j){var c=this.selector,d=e(c),k=d.not(function(){return e(this).data("waitUntilExists.found")});"remove"===a?g(c):(k.each(a).data("waitUntilExists.found",!0),h&&d.length?g(c):j||(b[c]=f.setInterval(function(){d.waitUntilExists(a,h,!0)},500)));return d}})(jQuery,window);
@codedr1
Copy link

codedr1 commented Sep 19, 2014

Ok, thank you.

@erm3nda
Copy link

erm3nda commented Jan 15, 2015

Can you add to your work an html working example with a delayed item?

@jakobjp
Copy link

jakobjp commented Jul 30, 2015

Would it be possible to incorporate some further settings?

  • Time length between attempts
  • Number of maximum attempts
  • Callback for timeout (max attempts tried without finding element)

@PizzaBrandon
Copy link
Author

I've left this code here for anyone to reference, but I no longer maintain or add features to it. You are more than welcome to.

@tnymlr
Copy link

tnymlr commented May 19, 2016

Hello! Would you be so kind to provide a license? It would be really helpful for people which want to use it in enterprises.

@yosephsa
Copy link

Hey, great plugin! Do you mind providing a liscence with it? Would really help know when and where I can use it. Thanks!

@fredojbg
Copy link

Cool

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment