Java Run Javascript after DOM is ready

  • Thread starter Thread starter Jamin2112
  • Start date Start date
  • Tags Tags
    javascript
AI Thread Summary
The discussion centers on the challenge of defining a function that should be ready after the DOM is fully loaded, without executing it immediately upon loading. A common solution involves using callback functions, which allow for delayed execution until certain conditions are met. Participants share code snippets demonstrating how to define functions within a jQuery document ready handler, ensuring that the functions can access DOM elements without causing errors due to timing issues.There is a debate about the necessity of defining functions without invoking them immediately, with some participants questioning the rationale behind this approach. The conversation highlights the complexities of JavaScript's asynchronous nature and the importance of understanding load timing, as well as the potential need for fallback strategies, such as timers, to ensure compatibility across different browsers. The use of established libraries and polyfills is recommended for handling document readiness more reliably, as they have been tested for various scenarios and browser behaviors. Overall, the discussion emphasizes the importance of proper event handling and the challenges developers face in managing JavaScript execution timing effectively.
Jamin2112
Messages
973
Reaction score
12
... the situation where you want a function to be defined after the DOM is ready, but don't want it to execute right when the DOM is ready (as happens if you simply put it in a document.ready(...) function)?
 
Technology news on Phys.org
The main mechanism being used in Greg's link is called a "callback function", which turns out to be pretty useful in many situations. You can go to this link: http://www.impressivewebs.com/callback-functions-javascript/ which explains it pretty well IMO.
 
It is a bit unclear to me why you would want to define but not invoke a function when the document is ready. Perhaps you can elaborate on what your problem is?

If you really want to, you can just add a document ready handler that defines the function by simple assignment. Using the jQuery [1] document ready event [2] that could look like the following:
JavaScript:
var myFunction = function() {}; // define the symbol in current scope
$(function() {
  var someValueFromDOM = ...;
  myFunction = function() {
    // use someValueFromDOM
  };
});

However, if you are using jQuery you can usually just define your function as normal and just use jQuery selectors [3] directly, like
JavaScript:
function myFunction() {
  var value = $('#my-text-element').text();
  // use value
}

But perhaps you are having a different problem?[1] http://jquery.com/
[2] http://learn.jquery.com/using-jquery-core/document-ready/
[3] http://learn.jquery.com/using-jquery-core/selecting-elements/
 
Filip Larsen said:
It is a bit unclear to me why you would want to define but not invoke a function when the document is ready. Perhaps you can elaborate on what your problem is?

Suppose I want to attach an event listener to an element:

Code:
$('#my-element').hover(function(){ alert("Yo hovered over my element!") });

If I also that function declaration in a JS file in the head, what happens is either:

(1) I put it in a document.ready(...), in which case the alert will be invoked when the page is loaded.
(2) I don't put it in a document.ready(...), in which case there's an error because #my-element isn't in the document tree at the time when the function is read.
 
Is this what you meant by (1):
Code:
$(document).ready (function() {
    $('#my-element').hover(function(){ alert("Yo hovered over my element!") }); 
});
It appeared to work for me.
 
Welcome to the arcane world of Javascript load timing, and browser differences. Which is why I do as little Javascript as I can get by with. Sorry I can't really help you. I'd probably end up doing something crass with a timer.
 
harborsparrow said:
Sorry I can't really help you.

I'm a little puzzled why you then choose to make a post, especially since the post just before yours provided an excellent code snippet showing the idiomatic way to do this in javascript with jQuery.

harborsparrow said:
I'd probably end up doing something crass with a timer.

Then you would most likely be doing it wrong. Javascript programming on the client (and server too for that matter) is highly asynchronous and event-driven, and understanding how this works is critical for making workable code.
 
Just pointing out that timing is the hardest and probably most common Javascript problem, and not always straightforward to solve. I would want to test each solution mentioned here in all the browsers that need to be supported. In my experience, events often don't work alike in different browsers.
 
  • #11
Silicon Waffle said:
http://javascriptkit.com/dhtmltutors/domready.shtml
Something similar can be achieved.

I notice that the fallback strategy in this article is--a timer! Because IMO there is always the odd browser that just doesn't fire events in a sane order. Sigh. It's a good strategy, trying to account for everything and having a fallback plan for when it all fails. Better yet, would be to change to page design not to have to detect page loading--but I know it isn't always possible.
 
  • Like
Likes Silicon Waffle
  • #12
harborsparrow said:
I notice that the fallback strategy in this article is--a timer!

My point in post #8 was that a web page developer should never have to implement this themselves. A quick look at the domready code already mentioned, or the extensive code in jquery.documentReady [3], only confirms that this not something you can just throw together and expect to work in all cases. If backwards compatibility really is needed the developer should instead use one of the many polyfill libraries that have been extensively tested. And it is perfectly fine for such a library to use a recurrent timer as a fall-back strategy to detect when the document is ready.

Regarding the current jQuery.ready() implementation [4] it should be safe to use in the sense that it will eventually fire, but maybe not as fast as one would like for some heavily framed pages on some old browsers. Note that it does not use timers, but relies solely on the HTML5 DOMContentLoaded [1] event with fall-back to the window.load event [2].

[1] https://developer.mozilla.org/en-US/docs/Web/Events/DOMContentLoaded
[2] https://developer.mozilla.org/en-US/docs/Web/Events/load
[3] https://github.com/addyosmani/jquery.parts/blob/master/jquery.documentReady.js
[4] https://github.com/jquery/jquery/blob/master/src/core/ready.js
 
Last edited by a moderator:
  • Like
Likes Silicon Waffle and harborsparrow

Similar threads

Replies
9
Views
1K
Replies
12
Views
2K
Replies
1
Views
2K
Replies
8
Views
2K
Replies
4
Views
1K
Replies
9
Views
2K
Replies
9
Views
4K
Replies
6
Views
3K
Replies
15
Views
3K
Back
Top