Dave Aaron Smith
Dave Aaron Smith

Reputation: 4567

Check if the jQuery page load events fired already

Is there a way to check if jQuery fired the page load events yet, or do you have to roll your own? I need to alter the behavior of links, but I don't want to wait until the page finishes loading because the user could conceivably click on a link on, say, the top half of the page before the page finishes loading. Right now I'm doing it like this:

var pageLoaded = false;
$(function() {
  pageLoaded = true;
});

function changeLinks() {
  $("a[data-set-already!='true']").each(function() {
    $(this).attr("data-set-already", "true").click(...);
  }); 
  // Is there something along the lines of jQuery.pageWasLoaded that I can
  // use instead?
  if (!pageLoaded) {
    window.setTimeout(changeLinks, 100);
  }
}
changeLinks(); // Added per @jondavidjohn's question

Upvotes: 1

Views: 2396

Answers (3)

Kevin B
Kevin B

Reputation: 95031

you could use .live() to initiate a click event that needs additional work when binding.

$("a[data-set-already!='true']").live(function(){
  // since this event will only fire once per anchor tag, you
  // can safely bind click events within it without worrying
  // about getting duplicate bound click events.
  var $this = $(this);
  $this
    .data("dataSetAlready",true)
    .click(myClickHandler);
});

this is also a useful technique for late-initializing plugins on elements that may not exist at domReady.

Upvotes: 1

gilly3
gilly3

Reputation: 91467

You could use setInterval and clear the interval on domready:

var changeLinksInterval = setInterval(function () {
    $("a[data-set-already!='true']").each(function() {
        $(this).attr("data-set-already", "true").click(...);
    });
}, 100);
$(function () {
    clearInterval(changeLinksInterval);
});

By the way, in your code example, you shouldn't need .each() - you should be able to call .attr() and .click() directly and let jQuery do the looping. Unless there is more to your .each() code that you didn't post.

$("a[data-set-already!='true']").attr("data-set-already", "true").click(...);

Upvotes: 1

bstakes
bstakes

Reputation: 1898

Since you are using the document ready shorthand, I'm guessing you mean when the dom is loaded. For this:

$.isReady

Upvotes: 5

Related Questions