Div öğesine onload olayı nasıl eklenir


Yanıtlar:


233

Hayır, yapamazsınız. Çalıştırmanın en kolay yolu, işlev çağrısını doğrudan öğeden sonra koymaktır

Misal:

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

veya - daha da iyisi - tam önünde </body>:

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

... bu nedenle aşağıdaki içeriğin yüklenmesini engellemez.


3
Kullanıma bağlı olarak, önüne koymak daha iyi değildir </body>. <div>sadece javascript etkinse gizlemek istiyorsanız, ancak "yanıp sönmekten" kaçının. Görünürlük süresi, tarayıcının tüm satır içi / harici komut dosyalarını ne kadar sürede yüklemesi / ayrıştırması gerektiğine bağlıdır.
mgutt

Bu, bir anti-desen midir, çünkü tüm j'leri kendi dosyasında tutmak daha iyidir? Belgeye belirli öğeler yüklendiğinde js'yi seçerek çalıştırmanın bir yolu var mı?
Ryan Walton

1
Bu bir anti-desen değildir, ancak genellikle DOM'un yüklenmesini bekler ve ardından tüm JS şeylerini yaparsınız.
DanMan

1
Bu bağlantıya rastlayan herkes için bu bağlantıyı buraya atın w3schools.com/tags/ev_onload.asp - Şu anda destekleyen tüm HTML öğelerionload
Brandon Benefield

Bu cevap artık geçerli değil. İşte yeni bir tane
mplungjan

74

onloadOlay sadece kullanılabilir document(body)kendisi, çerçeveler, resimler ve komut dosyaları. Başka bir deyişle, yalnızca gövdeye ve / veya her harici kaynağa eklenebilir . Div, harici bir kaynak değildir ve gövdenin bir parçası olarak yüklenir, bu nedenle onloadetkinlik orada geçerli değildir.


18
Sadece gövde öğesinde değil, örneğin görüntü ve iframe ile de kullanabilirsiniz. w3schools.com/jsref/event_onload.asp
Joe

2
Satır içi komut dosyalarının harici kaynaklar DEĞİLDİR ve bu nedenle HTML özelliği olmadan onloadherhangi <script>bir srcşey üzerinde çalışmadığını belirtmek gerekir (bu tavsiyeyi satır içi bir komut dosyasında kullanmaya çalışıyordum ve çalışmadığını
gördüm


28

onload olayı, yalnızca aşağıda listelenen gibi birkaç etiketle desteklenir.

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

İşte onload olayı için referans


17

Bunu dene! Ve asla div'de iki kez tetikleyici kullanmayın!

Div etiketinden önce çağrılacak işlevi tanımlayabilirsiniz.

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

DEMO: jsfiddle


Yukarıdaki jsfiddle bir jQuery yükleyiciye sahip değildir ve çalışmaz.
Arif Burhan

@Arif Burhan anlamadım. JQuery (edge) yüklüyorum. Tekrar kontrol edebilir misin? Mobil kullanarak bile "Merhaba Dünya" yı görebiliyorum.
Kuofp

@Kuofp Bu keman aslında hedef öğeleri yüklendiğinde işleyicilerin çağrılması gerekmez. Sadece bir nitelik (sizin durumunuzda onload) olan öğeleri aramak için jquery kullanır ve sonra bu işlevleri çağırır. Öznitelik, onloadörneğin jsfiddle.net/mrszgbxh
Trindaz

1
@Trindaz Kesinlikle! Başka bir deyişle, komut dosyaları onload olayı gibi davranır. Yorum bıraktığınız için teşekkürler!
Kuofp

10

Ben sadece herhangi biri div yük olayında bir işlevi çağırmak istiyorsanız & jQuery (benim durumumda olduğu gibi çatışma nedeniyle) kullanmak istemiyorsanız, o zaman sadece bir işlev tüm html kodu veya herhangi bir sonra çağırmak eklemek istiyorum fonksiyon kodu da dahil olmak üzere yazdığınız diğer kod ve bir fonksiyonu çağırmanız yeterlidir.

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

VEYA

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

  }

 my_func();
</script>

Bu şekilde birden fazla işlev ekleyebilir misiniz? yani html belgesinin sonunda </body> etiketinden hemen önce? Evet ise, yazılma sırası önemli midir?
Neo

Evet, birden fazla işlev ekleyebilirsiniz ve sipariş sadece düz (vanilya) javascript önemli değildir.
dev_khan

7

Aşağıdaki örnek kodu ekleyerek sorunu etkili bir şekilde çözmek için MutationObserver'ı kullanabiliriz

<!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
En son yapılan mutasyon olaylarını son kez kontrol ettim.
DanMan

7

Kasım 2019 yılında, bir (varsayımsal) oluşturmak için bir yol arıyorum onparse EventListeneriçin <elements>yapmayız onload.

Bir öğe ayrıştırıldığında (varsayımsal) onparse EventListenerdinleyebilmelidir .


Üçüncü Deneme (ve Kesin Çözüm)

Aşağıdaki İkinci Denemeden oldukça memnun kaldım , ancak özel olarak hazırlanmış bir etkinlik oluşturarak kodu daha kısa ve basit hale getirebilmem beni vurdu:

let parseEvent = new Event('parse');

Bu henüz en iyi çözüm.

Aşağıdaki örnek:

  1. Kişiye özel tasarım parse Event
  2. Bir işlevi (adresinde çalıştırılabilir) window.onload herhangi bir zamanda veya herhangi bir zamanda :
    • Belgedeki özniteliği içeren öğeleri bulur data-onparse
    • Ekler parse EventListenerBu öğelerin her birine
    • Çalıştırmak için parse Eventbu öğelerin her birineCallback

Çalışma Örneği:

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


İkinci deneme

Aşağıdaki İlk Denemede ( @JohnWilliams'parlak Boş Resim Hack'i temel alınmıştır ) sabit kod kullanıldı<img /> ve çalıştı.

Ben sabit kodlu <img />tamamen kaldırmak mümkün olduğunu düşündüm ve sadece dinamik bir şekilde bir onparseolayı tetiklemek için gereken bir öğe, tespit ettikten sonra bir özellik olarak tespit ettikten sonra eklemek :

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

Görünen o ki, bu gerçekten çok iyi çalışıyor.

Aşağıdaki örnek:

  1. Belgedeki özniteliği içeren öğeleri bulur data-onparse
  2. Dinamik olarak bir oluşturur <img src />ve bu öğelerin her birinden hemen sonra belgeye ekler
  3. Yangınlarıyla onerror EventListenerrender motoru her ayrıştırır zaman<img src />
  4. Yürütür Callback ve<img src /> belgeden dinamik olarak oluşturulanları kaldırır

Çalışma Örneği:

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


İlk girişim

Ben üzerine inşa edebilirsiniz @JohnWilliams' <img src>hack (2017 den bu sayfada,) - olduğu, şimdiye kadar, ben iyi yaklaşım rastlamak.

Aşağıdaki örnek:

  1. Yangınlarıyla onerror EventListenerzaman render motoru ayrıştırır<img src />
  2. Belgeyi yürütür Callback ve<img src /> belgeden kaldırır

Çalışma Örneği:

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 - Sen Ýnanmayacaksýnýz ama bence var aslında kırık. Bkz İkinci Girişimi yukarıdaki cevabın üstündeki.
Rounin

1
@DavidBradshaw - Kazı kazan. Üçüncü bir Deneme buldum . Kesin çözüm budur.
Rounin

Belki cevabı versiyon 3'e
David Bradshaw

6

iframe kullanın ve iframe bir gövde etiketi gibi çalışır

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

Ben html (şablon örneği) bir yığın eklendikten sonra çalıştırmak bazı başlatma kodu olması gerekiyordu ve tabii ki şablonu manipüle ve DOM değiştiren koda erişim yoktu. Aynı fikir, bir html öğesinin (genellikle a) eklenmesiyle DOM'da kısmi bir değişiklik yapılması için de geçerlidir <div>.

Bir süre önce, ben neredeyse görünmez onload olayı ile yazarlardan yaptığımız <img>bir içerdiği <div>, ancak kapsamlı, boş tarzı da yapacak keşfetti:

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

Güncelleme (15 Temmuz 2017) - Yükleme işlemi <style>IE'nin son sürümünde desteklenmiyor. Edge bunu destekliyor, ancak bazı kullanıcılar bunu farklı bir tarayıcı olarak görüyor ve IE ile bağlı kalıyor. <img>Eleman tüm tarayıcılarda daha iyi çalışıyor gibi görünüyor.

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

Görüntünün görsel etkisini ve kaynak kullanımını en aza indirmek için, görüntüyü küçük ve şeffaf tutan bir satır içi src kullanın.

Ben bir kullanmak hakkında yapmak gerektiğini hissediyorum bir yorum , özellikle şablon oluşturduğu her durumda aynı bir kimlik olamaz nerede templating, betiğin yakın <script>olduğunu belirlemek ne kadar zor olduğunu <div>. Cevabın document.currentScript olabileceğini düşündüm, ancak bu evrensel olarak desteklenmiyor. Bir <script>öğe kendi DOM konumunu güvenilir bir şekilde belirleyemez; 'this' değerine yapılan bir başvuru ana pencereye işaret eder ve hiçbir yardımı yoktur.

<img>Aptal olmasına rağmen, bir eleman kullanmak için yerleşmek gerektiğine inanıyorum . Bu, DOM / javascript çerçevesindeki tıkanmayı kullanabilen bir delik olabilir.


3

Yana onloadolay sadece birkaç elemanları desteklenir, alternatif bir yöntem kullanmak gerekir.

Bunun için bir MutationObserver kullanabilirsiniz :

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

Bu tür şeyler için YUI3 kütüphanesini gerçekten çok seviyorum.

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

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

Bkz. Http://developer.yahoo.com/yui/3/event/#onavailable


9
Bu, tek bir ciltleme uğruna sayfaya dökülecek oldukça büyük bir JS bloğu onload.
meagar

1
meagar - Doğru, ancak bir sayfada sadece iki veya üç basit JS şeyi yapmamın giderek daha nadir olduğunu düşünüyorum. Çapraz tarayıcı uyumluluğundan endişe duymak beni deli ediyor.
mjhm

0

Javascript ve jquery öğreniyorum ve tüm cevap geçiyordu, div öğesi yüklemek için javascript işlevini çağırırken aynı sorunla karşı karşıya. Denedim $('<divid>').ready(function(){alert('test'})ve benim için çalıştı. Ben jquery seçici kullanarak yaptığım şekilde div öğesi onload çağrı gerçekleştirmek için bu iyi bir yol olduğunu bilmek istiyorum.

Teşekkürler


0

Tüm söylendiği gibi, onLoad olayını bunun yerine bir DIV'de kullanamazsınız, ancak gövde etiketinden önce kullanamazsınız.

ancak bir altbilgi dosyanız varsa ve bunu birçok sayfaya dahil ederseniz. önce istediğiniz div'in görüntülenen sayfada olup olmadığını kontrol etmek daha iyidir, bu nedenle kod daha hızlı yüklenmesini sağlamak ve uygulamanız için biraz zaman kazanmak için bu DIV'yi içermeyen sayfalarda yürütülmez.

bu nedenle DIV'ye bir kimlik vermeniz ve şunları yapmanız gerekir:

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

0

Aynı soru vardı ve onload veya load kullanarak bir kaydırma komut dosyası yüklemek için Div almaya çalışıyordu. Bulduğum sorun, Div'in açılmadan önce veya sonra değil, her zaman işe yaramasıydı, bu yüzden gerçekten işe yaramayacaktı.

Sonra bunu bir çözüm olarak buldum.

<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'i bir Span'ın içine yerleştirdim ve Span'a iki olay verdim, fareyle üzerine gelme ve fareyle. Sonra bu Div'in altına Div'ı açmak için bir bağlantı yerleştirdim ve bu bağlantıya onclick için bir etkinlik verdim. Sayfanın sayfanın altına inmesini sağlamak için tüm etkinlikler aynıdır. Şimdi Div'ı açma düğmesi tıklandığında, sayfa kısmen aşağı atlar ve Div düğmenin üzerinde açılır ve fareyle üzerine gelme ve fareyle üzerine gelme olaylarının aşağı kaydırma komut dosyasının itilmesine yardımcı olur. Daha sonra farenin o noktada herhangi bir hareketi komut dosyasını son bir kez itecektir.


0

Aşağıdaki gibi yüklenene kadar kontrol etmek için bir aralık kullanabilirsiniz: 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

Sorunuzu ilk cevaplayan: Hayır, doğrudan yapmak istediğiniz gibi olamaz. Cevaplamak için biraz geç olabilir, ama bu benim çözümüm, jQuery olmadan, saf javascript. Başlangıçta DOM yüklendikten ve tuşa basıldıktan sonra textareas'a yeniden boyutlandırma işlevi uygulamak için yazılmıştır.

Aynı şekilde (tüm) div'lerle veya belirtildiyse yalnızca biriyle bir şeyler yapmak için kullanabilirsiniz:

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

Div yüklendikten sonra yüklenen bir div ile gerçekten bir şey yapmanız gerekiyorsa, örneğin bir ajax çağrısından sonra, çok yararlı bir kesmek kullanabilirsiniz, bu da onu anlayacaksınız ... elementler-öncesi-dom-is-hazır ... . "DOM hazır olmadan önce" yazıyor ama ajax yerleştirme veya js-appendChild-div ne olursa olsun aynı şekilde parlak çalışır. İşte kod, benim ihtiyaçlarına küçük değişiklikler ile.

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

Sunucudan bazı html yüklediğinizde ve DOM ağacına eklediğinizde DOMSubtreeModified, kullanımdan kaldırılmış olarak kullanabilirsiniz - böylece MutationObserverDOM olaylarını beklemenize gerek kalmadan doğrudan loadElement işlevi içindeki yeni içeriği kullanabilir veya tespit edebilirsiniz.



-1

Body.onload olayını, attribute ( <body onload="myFn()"> ...) yoluyla veya Javascript'te bir olay bağlayarak kullanın. Bu jQuery ile son derece yaygındır :

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

javascript saf ve jquery değil, etiketi kontrol edin;)
KingRider

-3

Bunu dene.

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

Bunu da deneyin. Sen kaldırmak gerekir .dan oQuickReply.swap()işlev çalışma yapmak.

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


Çalışıyor gibi görünüyor, ama sadece, alert("This is a div.");bu satır yürütüldüğünde ve sonuç (ki undefined) atandığında çağrılır div.onload. Bu tamamen anlamsız.
Frederic Leitenberger

-4

Div'de olay yüklemesi ekleyemezsiniz, ancak belge yüklemesinde onkeydown ekleyebilir ve onkeydown olayını tetikleyebilirsiniz

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

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.