我遇到了似乎鸡和蛋的问题,并且我认为这是一个合乎逻辑的解决方案.然而,在我看来,其他人肯定遇到过类似的东西,所以我想我会把它漂到那里为群众.
情况是我想使用dojo的addOnLoad函数来排队一些回调,这些回调应该在DOM完成客户端渲染之后执行.所以我正在做的如下:
<html>
<head>
<script type="text/javascript" src="dojo.xd.js"></script>
...
</head>
<body>
...
<script type="text/javascript">
dojo.addOnLoad( ... );
dojo.addOnLoad( ... );
...
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在,问题是我似乎在整个Dojo库下载浏览器之前调用了dojo.addOnLoad.这在某种程度上是有道理的,因为内联SCRIPT内容应该在加载整个DOM 之前执行(并且触发正常的主体onload回调).
我的问题是 - 这是我的方法声音,或者更有意义的是注册普通/标准正文onload JavaScript回调来调用一个函数,它执行与每个dojo.addOnLoads在SCRIPT块中所做的相同的工作.当然,这就引出了一个问题,如果您不能保证在使用库之前加载Dojo库,为什么还要使用dojo.addOnLoad呢?
希望这种情况对我以外的人有意义.好像其他人可能遇到过这种情况.
思考?
最诚挚的问候,Adam Rice
假设我们有以下HTML文件:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Test iframe download</title>
<script type="text/javascript">
var init = 0;
function download() {
document.getElementById("dload_frame").src = "http://example.com/dload.py";
}
function alert() {
if (init == 0) {
init = 1;
}
else {
document.getElementById("alert_span").innerHTML = "Got it!";
}
}
</script>
</head>
<body>
<span id="alert_span">Main content.</span><br/>
<input type="button" value="Download" id="btn" onclick="download()" />
<iframe id="dload_frame" src="http://404.com/404" onload="alert()"> </iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
现在,如果iframe的src被重写到的URL(在这种情况下 - " http://example.com/dload.py ")返回HTML,没问题:onload事件触发,span的内容被替换,每个人的快乐.
但是,如果URL返回的文件的内容类型设置为强制浏览器打开保存文件对话框的内容,则iframe的onload事件永远不会触发.
有没有解决方法?不需要使用iframe,所需的行为是在浏览器开始下载提供的文件后启动回调.
我使用PhantomJS作为我的webdriver.有时加载网页需要很长时间,但我不知道为什么
import time
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36'
driver = webdriver.PhantomJS(service_args=['--load-images=no'], desired_capabilities=dcap)
t=time.time()
driver.get('http://www.tibetculture.net/2012zyzy/zx/201509/t20150915_3939844.html')
print 'Time consuming:', time.time() - t
Run Code Online (Sandbox Code Playgroud)
加载页面花了大约86秒.在浏览器中,网页可以在几秒钟内加载,我不知道为什么webdriver PhantomJS花了这么长时间.它出什么问题了?
如此线程中所述:window.onload vs $(document).ready().本window.onload应在随后发生的比$(document).ready(),但在这个简单的代码,日志会表明,onload事件发生ready事件之前执行?我在这里想念的是什么?
<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<h1>A Simple Site</h1>
<script>
$(document).ready(function() {
console.log("ready event fired");
})
window.onload = function() {
console.log("onload event fired");
}
</script>
</body>
</html>Run Code Online (Sandbox Code Playgroud)
我遇到window.onload和document.onload事件的问题.我读到的所有内容都告诉我,在DOM完全加载其所有资源之前,这些内容不会触发,似乎这对我来说不会发生:
我在Chrome 4.1.249.1036(41514)和IE 8.0.7600.16385中尝试了以下简单页面,结果相同:两者都显示消息"It failed!",表示myParagraph未加载(因此DOM似乎不完整).
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<script type="text/javascript">
window.onload = doThis();
// document.onload gives the same result
function doThis() {
if (document.getElementById("myParagraph")) {
alert("It worked!");
} else {
alert("It failed!");
}
}
</script>
</head>
<body>
<p id="myParagraph">Nothing is here.</p>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
我在外部.js文件中使用比这更复杂的脚本,但这说明了问题.我可以让window.onload设置一个计时器半秒来运行doThis(),但这似乎是一个不优雅的解决方案,并没有回答为什么window.onload似乎没有做什么的问题每个人都这样说.另一个解决方案是设置一个定时器,用于检查DOM是否已加载,如果不是,它将在半秒后调用自身(因此它将继续检查,直到加载DOM),但这对我来说似乎过于复杂.是否有更合适的事件要使用?
我正在使用html5的画布功能.我在画布上画了一些图像,我需要检查它们是否已经全部加载才能使用它们.
我已经在一个数组中声明了它们,我需要一种方法来检查它们是否同时加载但我不知道如何做到这一点.
这是我的代码:
var color = new Array();
color[0] = new Image();
color[0].src = "green.png";
color[1] = new Image();
color[1].src = "blue.png";
Run Code Online (Sandbox Code Playgroud)
目前要检查图像是否已加载,我将不得不一个接一个地这样做:
color[0].onload = function(){
//code here
}
color[1].onload = function(){
//code here
}
Run Code Online (Sandbox Code Playgroud)
如果我有更多的图像,我将在后面开发,这将是一个非常低效的方式来检查它们.
我该如何同时检查它们?
关于此的很多帖子,但不完全符合我的情况.我的页面具有灵活的尺寸设置为100%宽度和100%高度,因此典型的有载滚动功能不起作用.任何想法或其他解决方案?
谢谢!
CSS:
* {
margin:0;
padding:0;
}
html, body {
width:100%;
height:100%;
min-width:960px;
overflow:hidden;
}
Run Code Online (Sandbox Code Playgroud)
使用Javascript:
/mobile/i.test(navigator.userAgent) && !pageYOffset && !location.hash && setTimeout(function () {
window.scrollTo(0, 1);
}, 1000);?
Run Code Online (Sandbox Code Playgroud) 在IE 8中运行以下代码时出错,但在其他浏览器中没有:
'document.head'为null或不是对象
这是我的代码:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<script type="text/javascript" src="respond.min.js"></script>
<script>
function load() {
document.getElementsByID("myFrame");
}
</script>
</head>
<body>
<iframe src="http://instagram.com/p/bTlK6CRNcL/embed/" width="300" height="400" frameborder="0" scrolling="no" allowtransparency="true" id="myFrame" onload="load()"></iframe>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我正在开发Firefox扩展并具有以下代码:
function initialize() {
// For accessing browser window from sidebar code.
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
var gBrowser = mainWindow.gBrowser;
gBrowser.onload = function() {
alert('loaded');
};
}
Run Code Online (Sandbox Code Playgroud)
我使用.onload而不是DOMContentLoaded或readystatechange,因为我需要等到所有其他javascript在我运行之前已经完成加载页面.
关于为什么触发多个事件的原因(以及不应该触发事件的事情)的任何想法?
解
根据MatrixFrog的建议,这是我遇到的解决方案:
function initialize() {
// For accessing browser window from sidebar code.
var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIWebNavigation)
.QueryInterface(Components.interfaces.nsIDocShellTreeItem)
.rootTreeItem
.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindow);
var gBrowser = mainWindow.gBrowser;
if (gBrowser.addEventListener) {
gBrowser.addEventListener("load",pageLoaded,true);
}
}
function pageLoaded(aEvent) {
if ((aEvent.originalTarget.nodeName == …Run Code Online (Sandbox Code Playgroud) 我正在使用网页加载屏幕,我使用window.onload功能.
除了在Mozilla Firefox浏览器中,一切都很好用.当我们首次使用ctrl + F5组合访问或刷新页面时,加载屏幕永远不会消失.如果我们只用F5刷新页面,那么它可以工作.
我使用下面的代码
$(window).load(function(e) {
$("#body-mask").fadeOut(1000,function(){
$(this).remove();
});
});
Run Code Online (Sandbox Code Playgroud)
我也试过下面的代码,但没有改变.
window.onload = function () {
$("#body-mask").fadeOut(1000,function(){
$(this).remove();
});
}
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
请帮忙.
提前致谢.