Javascript 异步图像加载
我正在为一个项目制作一个刽子手游戏。我有我需要的大部分功能,但是我有一个问题。当最后一次猜测不正确时,在加载图像之前,它会显示警告框,告知您已丢失。我希望先加载图像,然后加载警报框 我意识到问题在于DOM加载元素的方式,我应该在jQuery中创建一个回调函数 这是我的代码中更改图像的那一行,它工作正常,直到到达最后一行Javascript 异步图像加载,javascript,jquery,html,Javascript,Jquery,Html,我正在为一个项目制作一个刽子手游戏。我有我需要的大部分功能,但是我有一个问题。当最后一次猜测不正确时,在加载图像之前,它会显示警告框,告知您已丢失。我希望先加载图像,然后加载警报框 我意识到问题在于DOM加载元素的方式,我应该在jQuery中创建一个回调函数 这是我的代码中更改图像的那一行,它工作正常,直到到达最后一行 document.getElementById("gallows").src = displayGallows[incorrectGuesses - 1]; 我曾尝试使用Jqu
document.getElementById("gallows").src = displayGallows[incorrectGuesses - 1];
我曾尝试使用Jquery函数来实现这一点,但我对Jquery的了解几乎不存在
var img = $("gallows");
img.load(function() {
alert("Unlucky, you lost. Better luck next time!");
});
img.src = displayGallows[incorrectGuesses - 1];
我把它和我在网上找到的许多帖子进行了比较,在我未经训练的眼中,它看起来还不错。当我进行故障排除时,我确实意识到img.src被分配了正确的值,但是图像没有出现在我的页面上,或者没有触发警报框
这让我相信链接到jquery.js文件可能会有问题。我有一个HTML页面,在它的head标记中引用jQuery文件
<head>
<title>Hangman</title>
<link rel="stylesheet" href="base.css"/>
<script src="jquery.js"></script>
<script src="hangman.js"></script>
<script src="home.js"></script>
</head>
但是没有用,尽管我并不真正理解第二个,因为我在互联网上找到了这些例子
注意,在我的home.js文件中,我有一个简单的jQuery函数,当你将鼠标移到按钮上时,它可以将按钮上的文本加粗,这样就可以了
如果有人能帮我或者给我指出正确的方向,那就太好了。你在这里最好的选择可能是根本不用
警报
;相反,使用现代技术,如绝对定位、风格优美的div
来显示您的信息。显示这一点不会妨碍浏览器在图像到达后显示图像,而alert
基本上会使浏览器突然停止,直到用户点击警报为止
但如果要使用警报
:
等待图像中的load
事件的概念很好,但您可能希望在之后很短的时间内返回浏览器,让它有机会显示图像
不使用jQuery,因为您似乎没有使用它:
var img = document.getElementById("gallows");
img.onload = img.onerror = function() {
setTimeout(function() {
alert(/*...*/);
}, 30); // 30ms = virtually imperceptible to humans
};
img.src = displayGallows[incorrectGuesses - 1];
等待图像中的加载
或错误
事件,然后返回浏览器30毫秒,然后显示警报
但是,如果预缓存图像,则可以使加载
事件几乎在瞬间触发。大多数浏览器都会下载图像,即使它没有显示,所以如果你添加
<img src="/path/to/incorrect/guess.png" style="display: none">
…为每个不正确的猜测图像添加到您的页面,然后当您将相同的URL分配给您的
#gallows
图像时,由于浏览器缓存中有该图像,它几乎会立即加载。下面是一个使用gravatar和加载后30毫秒延迟的示例:首先,要在jQuery中按ID获取对象,必须使用
不能直接在jQuery对象上使用src
或其他“普通”属性。但是,您可以执行以下任一操作:
- 从jQuery对象获取实际元素
var img = $("#gallows"); img.load(function() { ... } img[0].src = "image.jpg"; // First element in jQuery object
- 使用jQuery方法
(推荐)attr
- 像现在一样获取元素
var img = document.getElementById("gallows"); img.onload = function() { ... } img.src = "image.jpg";
$(document).ready(函数(){…您的jQuery在这里…})代码>
更多信息:
您的问题:“我是否还需要从hangman.js文件中引用jquery.js文件?”
否,但在引用jQuery文件后,在标题中放置
标记:
<head>
<script src="jquery_version_that_you_are_using.js"></script>
<script src="hangman.js"></script>
<script>
$( document ).ready(function() {
//Your jQuery code here
});
</script>
</head>
$(文档).ready(函数(){
//这里是您的jQuery代码
});
如果图像加载时间超过100毫秒,他也会遇到同样的问题。在这种情况下,预加载图像会有所帮助。另一种选择是从一开始就加载图像,但只是将其隐藏。一旦用户丢失图像,只需显示图像。@Aust:“如果图像加载时间超过100毫秒,他也会遇到同样的问题。”不会,因为在图像加载或加载失败之前,我们不会启动超时。“预加载图像在这种情况下会有帮助”是的,同意。啊,我的错误,我认为一旦图像开始加载,onload就会触发。
var img = $("#gallows");
img.load(function() { ... }
img[0].src = "image.jpg"; // First element in jQuery object
var img = $("#gallows");
img.load(function() { ... }
img.attr("src", "image.jpg");
var img = document.getElementById("gallows");
img.onload = function() { ... }
img.src = "image.jpg";
<head>
<script src="jquery_version_that_you_are_using.js"></script>
<script src="hangman.js"></script>
<script>
$( document ).ready(function() {
//Your jQuery code here
});
</script>
</head>