Answers:
不,你不能。最简单的方法是将函数调用直接放在元素之后
例:
...
<div id="somid">Some content</div>
<script type="text/javascript">
oQuickReply.swap('somid');
</script>
...
或者-甚至更好-就在</body>
:
...
<script type="text/javascript">
oQuickReply.swap('somid');
</script>
</body>
...因此它不会阻止以下内容的加载。
</body>
。fe,如果您只想在<div>
启用了javascript的情况下隐藏,但要避免“闪烁”。可见时间取决于浏览器需要加载/解析所有内联/外部脚本的时间。
该onload
事件只能在document(body)
自身,框架,图像和脚本上使用。换句话说,它可以仅附加到主体和/或每个外部资源。div不是外部资源,它是作为正文的一部分加载的,因此该onload
事件不适用于此。
onload
在<script>
没有src
HTML属性的情况下也不起作用(我试图
您可以使用onerror而不使用src在IMG元素上自动触发一些js。
<img src onerror='alert()'>
试试这个!而且永远不要在div上使用两次触发器!
您可以定义要在div标签之前调用的函数。
$(function(){
$('div[onload]').trigger('onload');
});
演示:jsfiddle
onload
),然后调用这些函数。如果你改变了属性比其他的东西该脚本甚至onload
如jsfiddle.net/mrszgbxh
我只想在这里补充一下,如果有人想在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>
我们可以使用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>
十一月2019年,我寻求一种方法来创建一个(假设的)onparse
EventListener
对于<elements>
不拿onload
。
(假设的)onparse
EventListener
必须能够在解析元素时进行侦听。
我对下面的“ 第二次尝试”感到非常满意,但是这让我感到惊讶,我可以通过创建一个量身定制的事件来使代码更短,更简单:
let parseEvent = new Event('parse');
这是迄今为止最好的解决方案。
下面的例子:
parse
Event
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><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>
下面的“ 第一次尝试”(基于@JohnWilliams
'出色的Empty Image Hack)使用了硬编码<img />
并起作用。
我认为应该可以<img />
完全删除硬编码,并且仅在检测到需要触发onparse
事件的元素中的属性后才能动态插入它,例如:
data-onparse="run-oQuickReply.swap()"
事实证明,这确实很好。
下面的例子:
data-onparse
<img src />
在每个元素之后立即动态生成一个并将其附加到文档onerror
EventListener
在呈现引擎解析每个元素时触发<img src />
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><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>
我可以建立在@JohnWilliams
“ <img src>
黑客(此页上,从2017年) -这是,到目前为止,最好的办法我都碰到过。
下面的例子:
onerror
EventListener
渲染引擎解析时触发<img src />
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 />
使用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>
插入大量html(模板实例)后,我需要运行一些初始化代码,当然,我无权访问操纵模板和修改DOM的代码。对于通过插入html元素(通常是a)进行的DOM的任何部分修改,同样的想法也适用<div>
。
前段时间,我对<img>
包含在中的几乎不可见的onload事件进行了破解<div>
,但发现有作用域的空样式也可以做到:
<div .... >
<style scoped="scoped" onload="dosomethingto(this.parentElement);" > </style>
.....
</div>
更新(2017年7月15日)<style>
-IE的最新版本不支持onload。Edge确实支持它,但是一些用户将其视为不同的浏览器,并坚持使用IE。该<img>
元素似乎在所有浏览器中都能更好地工作。
<div...>
<img onLoad="dosomthing(this.parentElement);" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" />
...
</div>
为了最大程度地减少图像的视觉影响和资源使用,请使用内联src,使其保持较小且透明。
我觉得我需要使用a的注释<script>
是确定<div>
脚本附近的难度有多大,尤其是在模版模板所生成的每个实例中,模板在哪个位置不能具有相同的ID。我认为答案可能是document.currentScript,但这不是普遍支持的。甲<script>
元件不能可靠地确定其自己的DOM位置; 对“ this”的引用指向主窗口,没有帮助。
我认为尽管有些<img>
愚蠢,还是有必要适应使用元素。这可能是DOM / javascript框架中可能使用插入的漏洞。
由于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>
综上所述,您不能在DIV上使用onLoad事件,而是在body标记之前使用它。
但是如果您只有一个页脚文件,并将其包含在许多页面中。最好先检查您想要的div是否显示在该页面上,以便在不包含该DIV的页面中不执行代码,以使其加载更快并为您的应用程序节省一些时间。
因此您需要给该DIV一个ID并执行以下操作:
var myElem = document.getElementById('myElementId');
if (myElem !== null){ put your code here}
我有同样的问题,并试图让Div使用onload或load加载滚动脚本。我发现的问题是,它始终会在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将在按钮上方打开,从而导致mouseover和mouseout事件有助于推动向下滚动脚本。然后,此时鼠标的任何移动都将最后一次推送脚本。
您可以使用一个间隔来检查它,直到它像这样加载: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);
首先回答您的问题:不,您不能,不是直接像您想要的那样。回答可能有点晚,但这是我的解决方案,没有jQuery,没有纯JavaScript。最初是为了在DOM加载后和在keyup上将调整大小功能应用于textareas而编写的。
您可以使用它以相同的方式对(全部)div或仅对一个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);
});
如果您确实需要对div进行某些操作,那么在DOM加载后(例如,在ajax调用之后)加载,您可以使用一个非常有用的技巧,这一点很容易理解,您会发现它...元素-前最DOM的是准备......。它说“在DOM准备就绪之前”,但是在ajax插入或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); }
}
javascript
document.addEventListener("animationstart", function(event) {
var e = event || window.event;
if (e.animationName == "nodeReady") {
e.target.classList.remove('loaded');
do_something_else();
}
}, false);
当您从服务器加载一些html并将其插入DOM树时,可以使用DOMSubtreeModified
它,但是不建议使用 它-因此您可以MutationObserver
直接在loadElement函数中使用或检测新内容,因此您无需等待DOM事件
您可以如下附加事件监听器。每当具有选择器的div #my-id
完全加载到DOM 时,它将触发。
$(document).on('EventName', '#my-id', function() {
// do something
});
在这种情况下,EventName可能是“加载”或“点击”
试试这个。
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
。这是完全没有意义的。
您不能在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>`
body
更好div