我正在开发一款小游戏,按下按钮会出现一个新图像。每次你要求显示新图像时都会出现故障,而且我发现我应该预先加载必要的图像。但是,由于我没有使用变量来显示图像,因此我不确定如何有效地执行此操作。 This是我正在努力的方向。有什么建议吗?
HTML:
<body onLoad="setup()">
<div id="wrapper">
<div id="jajo"></div><!--this is where jajo will be displayed-->
<div id="directions"></div><!--directions for how to interact with jajo-->
</div><!--wrapper-->
</body>
JavaScript的:
// Calls the loadJajo function and passes the image URL
// Initiates directionSlide function
function setup() {
loadJajo('jajo.png');
elem = document.getElementById('directions');
directionSlide();
}
//Creates a new image object (Jajo) and writes it to the page.
function loadJajo(jajoSRC) {
var main = document.getElementById('jajo'); // Creates an variable to represent the "main" division
var defaultJajo = document.createElement('img'); // Creates a new image object (default Jajo image)
defaultJajo.src = jajoSRC; // adds the source file name to the defaultJajo image object
main.appendChild(defaultJajo); //puts the defaultJajo object inside the "main" division
}
// Listen for key pressed events.
document.onkeydown = function(event) {
var keyPress = String.fromCharCode(event.keyCode); // Assigns value of key pressed to variable.
if(keyPress == "W") { // If 'W' is pressed, display Jajo waving.
document.getElementById("jajo").innerHTML= "<img alt='car' src='jajo_wave.png'>";
document.onkeyup = function(event) { // If 'W' is released, display default Jajo.
document.getElementById("jajo").innerHTML= "<img alt='Jajo' src='jajo.png'>";
}
} else if(keyPress == "A") { // If 'A' is pressed, display Jajo winking.
document.getElementById("jajo").innerHTML= "<img alt='car' src='jajo_wink.png'>";
document.onkeyup = function(event) { // If 'A' is released, display default Jajo.
document.getElementById("jajo").innerHTML= "<img alt='Jajo' src='jajo.png'>";
}
} else if(keyPress == "S") { // If 'S' is pressed, display transparent Jajo.
document.getElementById("jajo").innerHTML= "<img alt='car' src='jajo_invisible.png'>";
document.onkeyup = function(event) { // If 'S' is released, display default Jajo.
document.getElementById("jajo").innerHTML= "<img alt='Jajo' src='jajo.png'>";
}
} else if(keyPress == "D") { // If 'D' is pressed, display purple Jajo.
document.getElementById("jajo").innerHTML= "<img alt='car' src='jajo_purple.png'>";
document.onkeyup = function(event) { // If 'D' is released, display default Jajo.
document.getElementById("jajo").innerHTML= "<img alt='Jajo' src='jajo.png'>";
}
} else if(keyPress == "E") { // If 'E' is pressed, display Jajo eating a carrot.
document.getElementById("jajo").innerHTML= "<img alt='car' src='jajo_carrot.png'>";
document.onkeyup = function(event) { // If 'E' is released, display default Jajo.
document.getElementById("jajo").innerHTML= "<img alt='Jajo' src='jajo.png'>";
}
}
}
var elem;
var i = 0; // Counter variable.
// Array with directions for interacting with Jajo.
var directionArray = ["This is Jajo, your new pet monster!",
"Jajo wants to say 'Hi!'<br>Press and hold 'W'",
"Jajo has some special skills.<br>Press and hold 'D' to see one!",
"Jajo is hungry for a healthy snack.<br>Press and hold 'E'",
"Jajo wants to show you his secret power.<br>Press and hold 'S'",
"That secret is just between you and Jajo!<br>Press and hold 'A'"];
// Transitions one direction to the next.
function nextDirection() {
i++; // Continuously add 1 to i.
elem.style.opacity = 0; // Directions opacity at 0%.
if(i > (directionArray.length - 1)) { // Resets counter to 0 when it reaches the end of the array.
i = 0;
}
setTimeout(directionSlide,1000); // Set time delay for transition between directions.
}
// Displays direction one at a time.
// http://www.developphp.com/view.php?tid=1380
function directionSlide() {
elem.innerHTML = directionArray[i]; // Displays direction based on position of counter variable.
elem.style.opacity = 1; // Direction opacity at 100%.
setTimeout(nextDirection,5000); // Set time delay for display of directions.
}
答案 0 :(得分:1)
将图像路径放在一个数组中,并迭代该数组:
(function () {
// All image paths go in this array
var images = [ "jajo_wave.png", "jajo_wink.png" ];
// Cycle over the array, pre-loading each image
for ( var i = 0; i < images.length; i++ ) {
// Create new image object
var image = document.createElement( "img" );
// For debugging, output successful preloading msg
image.onload = function () {
console.log( "Loaded: " + this.src );
}
// Set image source
image.src = images[ i ];
}
}());
正如comment above中所述,您的代码应该重构一下。请在https://codereview.stackexchange.com/处使用代码审核。
您想要解决的一个非常突出的问题是不断向DOM查找同一元素。存储对您的元素的引用,这样您就不需要一直四处寻找它们。
答案 1 :(得分:0)
我在那里回答了类似的问题:
https://stackoverflow.com/a/46121439/1951947
在你的情况下,它将是:
<link rel="preload" href="bg-image-narrow.png" as="image" media="(max-width: 600px)">
然后你可以在任何你喜欢的地方使用你的图像,它已经被缓存(预加载)