onload
Bir öğeye nasıl etkinlik eklersiniz ?
Kullanabilirmiyim:
<div onload="oQuickReply.swap();" ></div>
bunun için?
div
elemanlar "yüklenmez".
onload
Bir öğeye nasıl etkinlik eklersiniz ?
Kullanabilirmiyim:
<div onload="oQuickReply.swap();" ></div>
bunun için?
div
elemanlar "yüklenmez".
Yanıtlar:
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.
</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.
onload
onload
Olay 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 onload
etkinlik orada geçerli değildir.
onload
herhangi <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ı
Bazı js'leri, imerror kullanarak ve src kullanmadan IMG öğesinde otomatik olarak tetikleyebilirsiniz.
<img src onerror='alert()'>
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
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
onload
) olan öğeleri aramak için jquery kullanır ve sonra bu işlevleri çağırır. Öznitelik, onload
örneğin jsfiddle.net/mrszgbxh
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>
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>
Kasım 2019 yılında, bir (varsayımsal) oluşturmak için bir yol arıyorum onparse
EventListener
için <elements>
yapmayız onload
.
Bir öğe ayrıştırıldığında (varsayımsal) onparse
EventListener
dinleyebilmelidir .
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:
parse
Event
window.onload
herhangi bir zamanda veya herhangi bir zamanda :
data-onparse
parse
EventListener
Bu öğelerin her birineparse
Event
bu öğ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><div></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>
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 onparse
olayı 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:
data-onparse
<img src />
ve bu öğelerin her birinden hemen sonra belgeye ekleronerror
EventListener
render motoru her ayrıştırır zaman<img src />
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><div></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>
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:
onerror
EventListener
zaman render motoru ayrıştırır<img src />
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 />
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>
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.
Yana onload
olay 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>
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')
})
onload
.
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
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}
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.
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);
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);
Sunucudan bazı html yüklediğinizde ve DOM ağacına eklediğinizde DOMSubtreeModified
, kullanımdan kaldırılmış olarak kullanabilirsiniz - böylece MutationObserver
DOM olaylarını beklemenize gerek kalmadan doğrudan loadElement işlevi içindeki yeni içeriği kullanabilir veya tespit edebilirsiniz.
Bir olay dinleyicisini aşağıdaki gibi ekleyebilirsiniz. Seçiciye sahip div her #my-id
DOM'a yüklendiğinde tetiklenir .
$(document).on('EventName', '#my-id', function() {
// do something
});
Bu durumda EventName 'load' veya 'click' olabilir
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>
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.
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>`
body
iyidiv