div 요소에 onload 이벤트를 추가하는 방법


답변:


233

아냐, 못해 작동시키는 가장 쉬운 방법은 요소 바로 뒤에 함수 호출을 넣는 것입니다.

예:

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

또는 훨씬 더 나은 것 </body>:

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

... 따라서 다음 내용이로드되는 것을 차단하지 않습니다.


3
사용법에 따라 앞에 두는 것이 좋지 않습니다 </body>. <div>자바 스크립트가 활성화 된 경우에만 숨기고 싶지만 "깜박임"은 피하십시오. 가시성 시간은 브라우저가 모든 인라인 / 외부 스크립트를로드 / 파싱하는 데 걸리는 시간에 따라 다릅니다.
mgutt

모든 js를 자체 파일 안에 보관하는 것이 더 낫다는 점에서 이것은 안티 패턴입니까? 특정 요소가 문서에로드 될 때 선택적으로 js를 실행하는 방법이 있습니까?
Ryan Walton

1
안티 패턴은 아니지만 일반적으로 DOM 이로 드 될 때까지 기다렸다가 모든 JS 작업을 수행합니다.
DanMan

1
이 답변에 나오는 사람을 위해 여기에 링크를 내십시오. w3schools.com/tags/ev_onload.asp- 현재 지원하는 모든 HTML 요소onload
Brandon Benefield

이 답변은 더 이상 관련이 없습니다. 여기 새로운 것이 있습니다
mplungjan

74

onload이벤트에만 사용할 수 있습니다 document(body)자체, 프레임, 이미지, 스크립트. 즉, 본문 및 / 또는 각 외부 리소스 에만 연결할 수 있습니다 . div는 외부 리소스가 아니며 본문의 일부로로드되므로 onload이벤트가 적용되지 않습니다.


18
body 요소뿐만 아니라 이미지 및 iframe과 함께 사용할 수도 있습니다. w3schools.com/jsref/event_onload.asp
Joe

2
인라인 스크립트는 외부 리소스 onload가 아니므 <script>srcHTML 속성 없이는 작동하지 않습니다 (인라인 스크립트에서이 조언을 사용하려고 시도했지만 작동하지 않는 것으로 나타났습니다)
gog

64

onerror를 사용하고 src를 사용하지 않고 IMG 요소에서 일부 j를 자동으로 트리거 할 수 있습니다.

<img src onerror='alert()'>

4
훌륭한! IMG SRC (오류) = "함수 ()"/> : 각도뿐만 아니라에서 트리거 타이프 라이터로 사용할 수 있습니다
브라이언 리처드슨

1
이것은 환상적인 접근법입니다. 귀하의 솔루션 확장을 확인하십시오 : stackoverflow.com/questions/4057236/…
Rounin

Caniuse? ͏͏͏͏͏͏͏
Pacerier

28

onload 이벤트는 아래 나열된 것과 같은 몇 가지 태그 만 지원합니다.

<body>, <frame>, <iframe>, <img>, <input type="image">, <link>, <script>, <style>

다음은 onload 이벤트에 대한 참조입니다.


17

이 시도! 그리고 div에서 트리거를 두 번 사용하지 마십시오!

div 태그 전에 호출 할 함수를 정의 할 수 있습니다.

$(function(){
    $('div[onload]').trigger('onload');
});

데모 : jsfiddle


위의 jsfiddle에는 jQuery 로더가 없으며 작동하지 않습니다.
Arif Burhan

@Arif Burhan 나는 그것을 얻지 못한다. JQuery (edge)를로드합니다. 다시 확인해 주시겠습니까? 모바일을 사용해도 "Hello World"를 볼 수 있습니다.
Kuofp

@Kuofp 그 바이올린에는 대상 요소가로드 될 때 실제로 핸들러가 호출되지 않습니다. jquery를 사용하여 속성이있는 요소를 검색 onload한 다음 해당 함수를 호출합니다. onload예를 들어 jsfiddle.net/mrszgbxh
Trindaz

1
@Trindaz 정확히! 다시 말해, 스크립트는 onload 이벤트처럼 작동합니다. 의견을 남겨 주셔서 감사합니다!
Kuofp

10

div의로드 이벤트에서 함수를 호출하려는 경우 jQuery를 사용하지 않으려는 경우 (내 경우와 같이 충돌하기 때문에) 모든 HTML 코드 또는 함수 코드를 포함하여 작성한 다른 코드는 단순히 함수를 호출합니다.

/* All Other Code*/
-----
------
/* ----At the end ---- */
<script type="text/javascript">
   function_name();
</script>

또는

/* All Other Code*/
-----
------
/* ----At the end ---- */
<script type="text/javascript">
 function my_func(){
   function definition;      

  }

 my_func();
</script>

이 방법으로 둘 이상의 기능을 추가 할 수 있습니까? 즉, </ body> 태그 바로 앞에있는 html 문서의 끝에서? 그렇다면, 작성된 순서가 중요합니까?
Neo

예, 둘 이상의 함수를 추가 할 수 있으며 순서는 일반 (바닐라) 자바 스크립트와 상관 없습니다.
dev_khan

7

MutationObserver를 사용하여 아래 샘플 코드를 효율적으로 추가하여 문제를 해결할 수 있습니다.

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style>
        #second{
            position: absolute;
            width: 100px;
            height: 100px;
            background-color: #a1a1a1;
        }
    </style>
</head>
<body>
<div id="first"></div>
<script>
    var callthis = function(element){
           element.setAttribute("tabIndex",0);
        element.focus();
        element.onkeydown = handler;
        function handler(){
                alert("called")
        }
    }


    var observer = new WebKitMutationObserver(function(mutations) {
        mutations.forEach(function(mutation) {
            for (var i = 0; i < mutation.addedNodes.length; i++)
            if(mutation.addedNodes[i].id === "second"){
                callthis(mutation.addedNodes[i]);
            }

        })
    });
    observer.observe(document.getElementById("first"), { childList: true });


    var ele = document.createElement('div');
    ele.id = "second"

    document.getElementById("first").appendChild(ele);

</script>

</body>
</html>

1
지난번에 나는 돌연변이 이벤트가 끔찍하게 수행되었는지 확인했습니다.
DanMan

7

2019년 11월에서, 나는 (가상) 만드는 방법 찾고 있어요 onparse EventListener<elements>적용되지 않습니다 onload.

(가설 적) 요소가 구문 분석 될 때onparse EventListener 청취 할 수 있어야합니다 .


세 번째 시도 (및 결정적인 솔루션)

아래 의 두 번째 시도 에 매우 만족 했지만 맞춤 이벤트를 만들어 코드를 더 짧고 간단하게 만들 수 있다는 사실에 놀랐습니다.

let parseEvent = new Event('parse');

이것은 아직 최고의 솔루션입니다.

아래 예 :

  1. 맞춤형 제작 parse Event
  2. 다음과 같은 기능 ( window.onload언제든지 언제든지 실행할 수 있음)을 선언합니다 .
    • 속성을 포함하는 문서에서 요소를 찾습니다. data-onparse
    • parse EventListener각 요소에를 첨부합니다
    • 전달 parse Event이들 요소의 각각은 실행하도록Callback

작업 예 :

// 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>


두 번째 시도

아래 의 첫 번째 시도 ( @JohnWilliams'화려한 빈 이미지 핵 기반 )는 하드 코드 된<img /> 되고 작동했습니다.

나는 하드 코딩 된 코드를 <img />완전히 제거하고 onparse이벤트 를 발생시켜야하는 요소에서 다음과 같은 속성 을 감지 한 후에 만 ​​동적으로 삽입 할 수 있어야한다고 생각했습니다 .

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

실제로 이것은 매우 잘 작동합니다.

아래 예 :

  1. 속성을 포함하는 문서에서 요소를 찾습니다. data-onparse
  2. <img src />각 요소 바로 다음에 동적으로 생성 하여 문서에 추가
  3. 발사 onerror EventListener 렌더링 엔진이 각을 구문 분석 할 때<img src />
  4. 문서에서 동적으로 생성 된 것을 실행 Callback 하고 제거합니다.<img src />

작업 예 :

// 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>


첫번째 시도

나는 @JohnWilliams' 핵을 만들 수있다<img src> (2,017에서이 페이지) -이고, 지금까지 내가 가지고있는 가장 좋은 방법은 건너.

아래 예 :

  1. onerror EventListener렌더링 엔진이 구문 분석 할 때 발생<img src />
  2. 을 실행 Callback 하고 을 제거 <img src />문서에서

작업 예 :

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 />



@DavidBradshaw - 당신은 그것을 믿지 않을거야,하지만 난 생각 했다 실제로 금이. 위의 답변 맨 위에서 두 번째 시도를 참조하십시오 .
Rounin

1
@DavidBradshaw-스크래치. 나는 세 번째 시도를 생각해 냈습니다 . 이것이 확실한 해결책입니다.
Rounin

아마 버전 3에 대한 답을 줄일
데이비드 브래드쇼

6

iframe을 사용하고 숨 깁니다. iframe은 body 태그처럼 작동합니다.

<!DOCTYPE html>
<html>
<body>

<iframe style="display:none" onload="myFunction()" src="http://www.w3schools.com"></iframe>
<p id="demo"></p>

<script>
function myFunction() {
    document.getElementById("demo").innerHTML = "Iframe is loaded.";
}
</script>

</body>
</html>

6

HTML 청크 (템플릿 인스턴스)가 삽입 된 후에 초기화 코드를 실행해야했으며 템플릿을 조작하고 DOM을 수정하는 코드에 액세스 할 수 없었습니다. html 요소를 삽입하여 DOM을 부분적으로 수정하는 경우에도 동일한 아이디어가 적용됩니다.<div> 됩니다.

얼마 전에,에 <img>포함 된 거의 보이지 않는 onload 이벤트로 해킹을 수행 <div>했지만 범위가 지정된 빈 스타일도 수행한다는 것을 알았습니다 .

<div .... >
<style scoped="scoped" onload="dosomethingto(this.parentElement);" >   </style>
.....
</div>

업데이트 (2017 년 7 월 15 일)- <style>마지막 버전의 IE에서는 온로드가 지원되지 않습니다. Edge는이를 지원하지만 일부 사용자는이를 다른 브라우저로보고 IE를 사용합니다. 이 <img>요소는 모든 브라우저에서 더 잘 작동하는 것 같습니다.

<div...>
<img onLoad="dosomthing(this.parentElement);" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" />
...
</div>

이미지의 시각적 영향과 리소스 사용을 최소화하려면 이미지를 작고 투명하게 유지하는 인라인 src를 사용하십시오.

내가 a를 사용하는 것에 대해해야한다고 생각하는 한 가지 의견 은 특히 ​​템플릿이 생성하는 각 인스턴스에서 동일한 ID를 가질 수없는 템플릿에서 스크립트가 가까운 곳 <script>을 결정 하는 것이 얼마나 더 어렵다는 것입니다 <div>. 나는 대답이 document.currentScript 일 것이라고 생각했지만 이것이 보편적으로 지원되지는 않습니다. <script>요소는 확실하게 자신의 DOM 위치를 확인할 수 없습니다; 'this'에 대한 참조는 기본 창을 가리키며 도움이되지 않습니다.

나는 <img>구피에도 불구하고 요소 를 사용하기 위해 정착해야한다고 생각합니다 . 이것은 플러그를 사용할 수있는 DOM / javascript 프레임 워크의 구멍 일 수 있습니다.


3

때문에 onload이벤트가 몇 요소에서 지원됩니다, 당신은 다른 방법을 사용해야합니다.

이를 위해 MutationObserver 를 사용할 수 있습니다 .

const trackElement = element => {
  let present = false;
  const checkIfPresent = () => {
    if (document.body.contains(element)) {
      if (!present) {
        console.log('in DOM:', element);
      }
      present = true;
    } else if (present) {
      present = false;
      console.log('Not in DOM');
    }
  };

  const observer = new MutationObserver(checkIfPresent);
  observer.observe(document.body, { childList: true });
  checkIfPresent();

  return observer;
};

const element = document.querySelector('#element');
const add = () => document.body.appendChild(element);
const remove = () => element.remove();

trackElement(element);
<button onclick="add()">Add</button>
<button onclick="remove()">Remove</button>

<div id="element">Element</div>


2

나는 이런 종류의 일을 위해 YUI3 라이브러리를 정말로 좋아합니다.

<div id="mydiv"> ... </div>

<script>
YUI().use('node-base', function(Y) {
  Y.on("available", someFunction, '#mydiv')
})

참조 : http://developer.yahoo.com/yui/3/event/#onavailable


9
단일 바인딩을 위해 페이지에 덤프 할 JS의 꽤 큰 덩어리입니다 onload.
meagar

1
@meagar-맞습니다. 페이지에서 2 ~ 3 개의 간단한 JS 작업을하는 것이 점점 더 드문 일입니다. 크로스 브라우저 호환성에 대한 걱정은 또한 불안합니다.
mjhm

0

나는 자바 스크립트와 jquery를 배우고 모든 대답을 겪고 있었고 div 요소를로드하기 위해 javascript 함수를 호출 할 때 동일한 문제에 직면했습니다. 나는 시도했다$('<divid>').ready(function(){alert('test'}) 했고 그것은 나를 위해 일했다. jquery 선택기를 사용하는 방식으로 div 요소에서 onload 호출을 수행하는 좋은 방법입니다.

감사


0

모두 말했듯이 대신 DIV에서 onLoad 이벤트를 사용할 수 없지만 body 태그 앞에 사용할 수 있습니다.

그러나 바닥 글 파일이 하나 인 경우 여러 페이지에 포함시킬 수 있습니다. 원하는 div가 표시된 페이지에 있는지 먼저 확인하는 것이 좋습니다. 따라서 DIV가 포함되지 않은 페이지에서 코드가 실행되지 않아 더 빨리로드되고 응용 프로그램의 시간이 절약됩니다.

따라서 해당 DIV에 ID를 부여하고 다음을 수행해야합니다.

var myElem = document.getElementById('myElementId');
if (myElem !== null){ put your code here}

0

나는 같은 질문을했고 onload 또는 load를 사용하여 Div가 스크롤 스크립트를로드하도록하려고했습니다. 내가 찾은 문제는 Div가 열리기 전에 또는 작동하지 않고 항상 작동하기 때문에 항상 작동하지 않는다는 것입니다.

그런 다음이 문제를 해결했습니다.

<body>

<span onmouseover="window.scrollTo(0, document.body.scrollHeight);" 
onmouseout="window.scrollTo(0, document.body.scrollHeight);">

<div id="">
</div>

<a href="" onclick="window.scrollTo(0, document.body.scrollHeight);">Link to open Div</a>

</span>
</body>

Div를 Span 안에 넣고 Span에게 mouseover와 mouseout이라는 두 가지 이벤트를주었습니다. 그런 다음 해당 Div 아래에 Div를 열 수있는 링크를 배치하고 해당 링크에 onclick 이벤트를주었습니다. 페이지를 아래로 스크롤하기 위해 모든 이벤트가 동일합니다. 이제 Div를 여는 버튼을 클릭하면 페이지가 약간 아래로 내려 가고 Div가 버튼 위로 열리므로 마우스 오버 및 마우스 아웃 이벤트가 스크롤 다운 스크립트를 푸시하는 데 도움이됩니다. 그런 다음 해당 시점에서 마우스를 움직이면 스크립트가 마지막으로 한 번 푸시됩니다.


0

다음과 같이로드 될 때까지 간격을 사용하여 확인할 수 있습니다 : 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

먼저 귀하의 질문에 대답하십시오. 아닙니다. 직접하고 싶지 않은 것은 아닙니다. 대답하기에는 약간 늦을 수 있지만 이것은 순수한 자바 스크립트 인 jQuery가없는 내 솔루션입니다. DOM이로드되고 키업 된 후에 텍스트 영역에 크기 조정 기능을 적용하기 위해 원래 작성되었습니다.

같은 방법으로 (모든) div로 무언가를 수행하거나 지정된 경우 하나만 수행 할 수 있습니다.

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);
});

DOM 이로 드 된 후로드 된 div로 무언가를 실제로 해야하는 경우, 예를 들어 ajax 호출 후 매우 유용한 해킹을 사용할 수 있습니다.이를 이해하면 쉽게 이해할 수 있습니다 ... 준비하기 전의 요소들 ... . 그것은 "DOM이 준비되기 전에"라고 말하지만 아약스 삽입 또는 js-appendChild-div의 어떤 것이 든간에 같은 방식으로 훌륭하게 작동합니다. 내 요구에 약간의 변화가있는 코드가 있습니다.

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); }  
}

자바 스크립트

document.addEventListener("animationstart", function(event) {
    var e = event || window.event;
    if (e.animationName == "nodeReady") {
        e.target.classList.remove('loaded');
        do_something_else();
    }
}, false);

0

서버에서 HTML을로드하고 DOM 트리에 삽입하면 DOMSubtreeModified더 이상 사용되지 않지만 MutationObserverloadElement 함수 내에서 직접 새로운 내용을 사용 하거나 감지 할 수 있으므로 DOM 이벤트를 기다릴 필요가 없습니다.



-1

속성 ( <body onload="myFn()"> ...)을 통해 또는 Javascript에서 이벤트를 바인딩 하여 body.onload 이벤트를 대신 사용하십시오 . 이것은 jQuery에서 매우 일반적입니다 .

$(document).ready(function() {
    doSomething($('#myDiv'));
});

javascript 순수하고 jquery가 아닌 태그 확인;)
KingRider

-3

이 시도.

document.getElementById("div").onload = alert("This is a div.");
<div id="div">Hello World</div>

이것도 시도하십시오. 당신은 제거 할 필요 .에서 oQuickReply.swap()함수 작업을 할 수 있습니다.

document.getElementById("div").onload = oQuickReplyswap();
function oQuickReplyswap() {
alert("Hello World");
}
<div id="div"></div>


그것은 효과가있는 것처럼 보이지만 단지이 alert("This is a div.");줄이 실행되고 결과 ( undefined)가에 할당 될 때 호출됩니다 div.onload. 완전히 무의미합니다.
Frederic Leitenberger

-4

div에는 이벤트 onload를 추가 할 수 없지만 문서로드시 onkeydown을 추가하고 onkeydown 이벤트를 트리거 할 수 있습니다.

$(function ()
{
  $(".ccsdvCotentPS").trigger("onkeydown");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>

<div  onkeydown="setCss( );"> </div>`

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.