Почему параметр функции JavaScript возвращает значение undefined? - PullRequest
0 голосов
/ 11 января 2010

Я пытаюсь написать простую функцию JS, которая случайным образом поворачивает фоновое изображение блока CSS в 1 секунду.Я хочу добавить название блока и количество изображений от параметров, чтобы функция была максимально гибкой, и я могу вызывать несколько ее экземпляров на одной странице.Проблема в том, что я получаю ' nameofparamter undefined' Error.

Вот скрипт с 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 Backgroundimage 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>

Я не совсем понимаю, потому что есть итерированныйзначение обоих параметров в обработчике события onload тела, где я вызываю функцию?Так почему же undefined ?Ваша помощь очень приветствуется!:)

Ответы [ 4 ]

5 голосов
/ 11 января 2010

Есть куча вещей, которые не соответствуют твоему коду. Во-первых, ваша нулевая проверка только проверяет, что переменная не имеет строкового значения, равного 'null'. Если вы устанавливаете свойство backgroundImage, строка, которую вы назначаете, содержит несоответствующие скобки.

Но больше всего setTimeout выполняется в контексте window, где ваши переменные недоступны (и вы не должны этого хотеть). Вместо этого измените свой звонок на

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

Таким образом, полное исправление будет

if(el){
    el.style.backgroundImage='url(images/bg_image'+randomImageNum+'.jpg);';
    var timer = setTimeout(function() { changeBgImage(num, el) }, 1000);
}
1 голос
/ 11 января 2010

Это предположение, но, во-первых, потому что, вызывая функцию в кавычках, она вызывает ее в глобальном контексте, а num и el определяются не в глобальном контексте, а в вашей функции. Попробуйте использовать литерал функции, например,

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

PS, вы должны использовать != null, а не строку null.

1 голос
/ 11 января 2010

изменить

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

на

setTimeout(function() { changeBgImage(num, el) }, 1000);
0 голосов
/ 12 января 2010

Когда вы вызываете функцию с setTimeout, вы не можете передавать объекты в качестве параметров. Поэтому я рекомендую вам подойти к проблеме по-другому. Вы можете иметь общие переменные для передачи аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...