How to add onload event to a div element

前端 未结 24 2252
谎友^
谎友^ 2020-11-22 00:26

How do you add an onload event to an element?

Can I use:

for t

相关标签:
24条回答
  • 2020-11-22 00:56

    In November 2019, I am seeking a way to create a (hypothetical) onparse EventListener for <elements> which don't take onload.

    The (hypothetical) onparse EventListener must be able to listen for when an element is parsed.


    Third Attempt (and Definitive Solution)

    I was pretty happy with the Second Attempt below, but it just struck me that I can make the code shorter and simpler, by creating a tailor-made event:

    let parseEvent = new Event('parse');
    

    This is the best solution yet.

    The example below:

    1. Creates a tailor-made parse Event
    2. Declares a function (which can be run at window.onload or any time) which:
      • Finds any elements in the document which include the attribute data-onparse
      • Attaches the parse EventListener to each of those elements
      • Dispatches the parse Event to each of those elements to execute the Callback

    Working Example:

    // Create (homemade) parse event
    let parseEvent = new Event('parse');
    
    // Create Initialising Function which can be run at any time
    const initialiseParseableElements = () => {
    
      // Get all the elements which need to respond to an onparse event
      let elementsWithParseEventListener = document.querySelectorAll('[data-onparse]');
      
      // Attach Event Listeners and Dispatch Events
      elementsWithParseEventListener.forEach((elementWithParseEventListener) => {
    
        elementWithParseEventListener.addEventListener('parse', updateParseEventTarget, false);
        elementWithParseEventListener.dataset.onparsed = elementWithParseEventListener.dataset.onparse;
        elementWithParseEventListener.removeAttribute('data-onparse');
        elementWithParseEventListener.dispatchEvent(parseEvent);
      });
    }
    
    // Callback function for the Parse Event Listener
    const updateParseEventTarget = (e) => {
      
      switch (e.target.dataset.onparsed) {
    
        case ('update-1') : e.target.textContent = 'My First Updated Heading'; break;
        case ('update-2') : e.target.textContent = 'My Second Updated Heading'; break;
        case ('update-3') : e.target.textContent = 'My Third Updated Heading'; break;
        case ('run-oQuickReply.swap()') : e.target.innerHTML = 'This <code>&lt;div&gt;</code> is now loaded and the function <code>oQuickReply.swap()</code> will run...'; break;
      }
    }
    
    // Run Initialising Function
    initialiseParseableElements();
    
    let dynamicHeading = document.createElement('h3');
    dynamicHeading.textContent = 'Heading Text';
    dynamicHeading.dataset.onparse = 'update-3';
    
    setTimeout(() => {
    
      // Add new element to page after time delay
      document.body.appendChild(dynamicHeading);
    
      // Re-run Initialising Function
      initialiseParseableElements();
    
    }, 3000);
    div {
      width: 300px;
      height: 40px;
      padding: 12px;
      border: 1px solid rgb(191, 191, 191);
    }
    
    h3 {
    position: absolute;
    top: 0;
    right: 0;
    }
    <h2 data-onparse="update-1">My Heading</h2>
    <h2 data-onparse="update-2">My Heading</h2>
    <div data-onparse="run-oQuickReply.swap()">
    This div hasn't yet loaded and nothing will happen.
    </div>


    Second Attempt

    The First Attempt below (based on @JohnWilliams' brilliant Empty Image Hack) used a hardcoded <img /> and worked.

    I thought it ought to be possible to remove the hardcoded <img /> entirely and only dynamically insert it after detecting, in an element which needed to fire an onparse event, an attribute like:

    data-onparse="run-oQuickReply.swap()"
    

    It turns out, this works very well indeed.

    The example below:

    1. Finds any elements in the document which include the attribute data-onparse
    2. Dynamically generates an <img src /> and appends it to the document, immediately after each of those elements
    3. Fires the onerror EventListener when the rendering engine parses each <img src />
    4. Executes the Callback and removes that dynamically generated <img src /> from the document

    Working Example:

    // Get all the elements which need to respond to an onparse event
    let elementsWithParseEventListener = document.querySelectorAll('[data-onparse]');
    
    // Dynamically create and position an empty <img> after each of those elements 
    elementsWithParseEventListener.forEach((elementWithParseEventListener) => {
    
      let emptyImage = document.createElement('img');
      emptyImage.src = '';
      elementWithParseEventListener.parentNode.insertBefore(emptyImage, elementWithParseEventListener.nextElementSibling);
    });
    
    // Get all the empty images
    let parseEventTriggers = document.querySelectorAll('img[src=""]');
    
    // Callback function for the EventListener below
    const updateParseEventTarget = (e) => {
    
      let parseEventTarget = e.target.previousElementSibling;
      
      switch (parseEventTarget.dataset.onparse) {
    
        case ('update-1') : parseEventTarget.textContent = 'My First Updated Heading'; break;
        case ('update-2') : parseEventTarget.textContent = 'My Second Updated Heading'; break;
        case ('run-oQuickReply.swap()') : parseEventTarget.innerHTML = 'This <code>&lt;div&gt;</code> is now loaded and the function <code>oQuickReply.swap()</code> will run...'; break;
      }
      
      // Remove empty image
      e.target.remove();
    }
    
    // Add onerror EventListener to all the empty images
    parseEventTriggers.forEach((parseEventTrigger) => {
      
      parseEventTrigger.addEventListener('error', updateParseEventTarget, false);
      
    });
    div {
      width: 300px;
      height: 40px;
      padding: 12px;
      border: 1px solid rgb(191, 191, 191);
    }
    <h2 data-onparse="update-1">My Heading</h2>
    <h2 data-onparse="update-2">My Heading</h2>
    <div data-onparse="run-oQuickReply.swap()">
    This div hasn't yet loaded and nothing will happen.
    </div>


    First Attempt

    I can build on @JohnWilliams' <img src> hack (on this page, from 2017) - which is, so far, the best approach I have come across.

    The example below:

    1. Fires the onerror EventListener when the rendering engine parses <img src />
    2. Executes the Callback and removes the <img src /> from the document

    Working Example:

    let myHeadingLoadEventTrigger = document.getElementById('my-heading-load-event-trigger');
    
    const updateHeading = (e) => {
    
      let myHeading = e.target.previousElementSibling;
      
      if (true) { // <= CONDITION HERE
        
        myHeading.textContent = 'My Updated Heading';
      }
      
      // Modern alternative to document.body.removeChild(e.target);
      e.target.remove();
    }
    
    myHeadingLoadEventTrigger.addEventListener('error', updateHeading, false);
    <h2>My Heading</h2>
    <img id="my-heading-load-event-trigger" src />

    0 讨论(0)
  • 2020-11-22 00:56

    You could use an interval to check for it until it loads like this: https://codepen.io/pager/pen/MBgGGM

    let checkonloadDoSomething = setInterval(() => {
      let onloadDoSomething = document.getElementById("onloadDoSomething");
      if (onloadDoSomething) {
        onloadDoSomething.innerHTML="Loaded"
        clearInterval(checkonloadDoSomething);
      } else {`enter code here`
        console.log("Waiting for onloadDoSomething to load");
      }
    }, 100);
    
    0 讨论(0)
  • 2020-11-22 00:58

    First to answer your question: No, you can't, not directly like you wanted to do so. May be a bit late to answer, but this is my solution, without jQuery, pure javascript. It was originally written to apply a resize function to textareas after DOM is loaded and on keyup.

    Same way you could use it to do something with (all) divs or only one, if specified, like so:

    document.addEventListener("DOMContentLoaded", function() {
        var divs = document.querySelectorAll('div'); // all divs
        var mydiv = document.getElementById('myDiv'); // only div#myDiv
        divs.forEach( div => {
            do_something_with_all_divs(div);
        });
        do_something_with_mydiv(mydiv);
    });
    

    If you really need to do something with a div, loaded after the DOM is loaded, e.g. after an ajax call, you could use a very helpful hack, which is easy to understand an you'll find it ...working-with-elements-before-the-dom-is-ready.... It says "before the DOM is ready" but it works brillant the same way, after an ajax insertion or js-appendChild-whatever of a div. Here's the code, with some tiny changes to my needs.

    css

    .loaded { // I use only class loaded instead of a nodename
        animation-name: nodeReady;
        animation-duration: 0.001s;
    }
    
    @keyframes nodeReady {  
        from { clip: rect(1px, auto, auto, auto); }
        to { clip: rect(0px, auto, auto, auto); }  
    }
    

    javascript

    document.addEventListener("animationstart", function(event) {
        var e = event || window.event;
        if (e.animationName == "nodeReady") {
            e.target.classList.remove('loaded');
            do_something_else();
        }
    }, false);
    
    0 讨论(0)
  • 2020-11-22 00:59

    No, you can't. The easiest way to make it work would be to put the function call directly after the element

    Example:

    ...
    <div id="somid">Some content</div>
    <script type="text/javascript">
       oQuickReply.swap('somid');
    </script>
    ...
    

    or - even better - just in front of </body>:

    ...
    <script type="text/javascript">
       oQuickReply.swap('somid');
    </script>
    </body>
    

    ...so it doesn't block the following content from loading.

    0 讨论(0)
  • 2020-11-22 00:59

    I am learning javascript and jquery and was going through all the answer, i faced same issue when calling javascript function for loading div element. I tried $('<divid>').ready(function(){alert('test'}) and it worked for me. I want to know is this good way to perform onload call on div element in the way i did using jquery selector.

    thanks

    0 讨论(0)
  • 2020-11-22 01:01

    You can trigger some js automatically on an IMG element using onerror, and no src.

    <img src onerror='alert()'>
    
    0 讨论(0)
提交回复
热议问题