开发者

Why does a parameter of a JavaScript function return 'undefined'?

开发者 https://www.devze.com 2022-12-16 13:47 出处:网络
I\'m trying to write a simple a JS function which randomly rotates the background-image of a CSS block per 1 second.

I'm trying to write a simple a JS function which randomly rotates the background-image of a CSS block per 1 second. I want to add the name of the block and the number of images from paramaters, so the function can be as flexible as possible and a I can call multiple instances of it on one page. The problem is that I get 'nameofparamter undefined' Error.

Here's the script with the HTML

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="hu-HU" lang="hu">
<head>
<meta name="http-equiv" content="text/html; charset="utf-8"">
<meta name="description" content="leiras"><meta name="keywords" content="kulcsszavak"/>
<style type="text/css"> 
div#mycontainer{
background-image: url(images/bg_image1.jpg);
width: 800px;
height: 600px; 
}
</style>
<script type="text/javascript" charset="utf-8">
function changeBgImage(num, el){
    var imageNum = num;
    var randomImageNum = Math.ceil(Math.random()*imageNum);

    if(el!=='null'){
        el.style.backgroundImage='url(images/bg_image'+randomImageNum+'.jpg';
            var timer = setTimeout("changeBgImage(num, el)", 1000);
    }
}

</script>  
</head>
<title>Dynamic Backgroundimag开发者_运维技巧e changer</title>
<body onload="changeBgImage(4, document.getElementById('mycontainer'));">
<div id="mycontainer">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut felis purus, dictum quis pellentesque ut, venenatis et tellus. Phasellus gravida cursus urna, quis hendrerit risus rutrum vel. Suspendisse dictum lobortis molestie. Sed quis lacus nec ante dignissim sollicitudin. Curabitur tristique facilisis turpis.
</div>  
</body>
</html>

I don't really understand 'cause there's the iterated value of both parameters in the body's onload event handler where I call the function? So why undefined? Your help is very much welcomed! :)


There's a bunch of things that ain't right about your code. For one thing, your null check only checks that the variable does not have a string value that is exactly 'null'. Where you're setting backgroundImage property, the string you're assigning has unmatching parentheses.

But most of all, setTimeout executes on the window context, where your variables are not available (nor should you want them to be). Instead, change your call to

setTimeout(function() { changeBgImage(num, el) }, 1000);

So a complete fix would be

if(el){
    el.style.backgroundImage='url(images/bg_image'+randomImageNum+'.jpg);';
    var timer = setTimeout(function() { changeBgImage(num, el) }, 1000);
}


change

setTimeout("changeBgImage(num, el)", 1000);

to

setTimeout(function() { changeBgImage(num, el) }, 1000);


This is a guess but firstly because your invoking the function in quotes it invokes it in the global context, and num and el are not defined in global context, but within your function. Try using a function literal eg

setTimeout( function() { changeBgImage( num, el ) }, 1000 );

PS, you should be using != null not the string null.


When you call a function with setTimeout you cannot pass objects as parameters. So I recommend you to approach the problem in other way. You can have shared variables to pass the arguments.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号