2012-02-22 2 views
0

Я написал сценарий, который запускает 2 URL-адреса, основанных на некоторой логике случайных чисел, и я пытаюсь установить задержку, прежде чем один из них будет запущен (полсекунды), но я не думаю, что он работает правильно. Правильно ли я делаю это? Код ниже:Неправильное использование setTimeout?

var clicks = "http://www.urlone.com"; 
var impressions = "http://www.urltwo.com"; 
var randomNumber = (Math.random()*100); 

function callOut() { 
for (var i = 0; i < lengthVal; i++){ 
    if (randomNumber < 75) { 
     var randomCounter = (Math.random()*100); 
      if (randomCounter < 50) { 
       setTimeout("image1.src = clicks;",500); 

      } 
      else if (randomCounter > 50) { 
       setTimeout("image1.src = impressions;",500);      
      } 
    } 
    } 
} 
+7

Да, это неправильно. Используйте 'function() {...}' вместо '" ... "'. И, не используйте цикл, а функцию + счетчик (в настоящее время все ваши методы срабатывают вместе через полсекунды). –

+1

что такое клики и показы? используйте setTimeout (function() {image1.src = clicks;}, 500); – silly

+0

@RobW Я должен был «ответить на свой вопрос», но, конечно, используя все эти прекрасные советы. Спасибо всем за ответы/комментарии, хотя – zik

ответ

0

Обязательно описал использование setTimeout со строкой. Вот как я это сделал. Это лучший способ сделать это?

var clicks = "http://www.urlone.com"; 
var impressions = "http://www.urltwo.com"; 
var conversions = "http://www.urlthree"; 
var lengthVal = (Math.random() * 20 + 20); 
var image1 = new Image(); 
var image2 = new Image(); 
var globalCounter = -1; 



function callOut() { 
    var ord = (Math.random() * 9999999999999) + ""; 

    var randomNumber = (Math.random() * 100); // Random value for each call 
    if (randomNumber < 75) { 
     var randomCounter = Math.random() * 100; 
     alert(randomCounter); 
     if (randomCounter < 50) { 
      image1.src = clicks + ord + "?"; 
     } 
     if (randomCounter > 50) { 
      image2.src = impressions + ord + "?"; 
     } 
    } 
    if (globalCounter++ < lengthVal) { 
     setTimeout(callOut, 1000); // Call itself after another second 
    } 
} 
1

setTimeout первый параметр должен быть функцией. Не строка кода.

код в альтернативном синтаксисе - это строка кода, которую вы хотите выполнить после задержки миллисекунд. (Используя этот синтаксис не рекомендуется по тем же причинам, как с помощью Eval())

MDN

setTimeout(function(){...}, 500); 
+0

Строка, содержащая код, тоже работает и действует в соответствии со стандартами. Почему вы говорите, что это должно быть имя функции (я полагаю, вы имеете в виду ссылку на функцию)? – MMM

+0

@MMM. Потому что он использует злые 'eval' ... – gdoron

+0

Это действительно и полностью законно. Кроме того, 'eval' является злом только при использовании со строками, конкатенированными с переменными (например,' eval ("myvar =" + number) '). – MMM

1

Взято отсюда: http://www.codescream.com/?p=18 прочитать это должно помочь :)

Если вы хотите сделать задержку с SetTimeout вы должны сделать именно это:

setTimeout(function() { 
     doThings() 
}, 1000); 

и никогда этого:

setTimeout("doThings()", 1000); 
0
setTimeout("image1.src = clicks;",500); 

Для этого image1 должны быть объявлены в глобальном контексте, например:

var image1 = document.getElementById('image1'); 

Но лучше использовать функцию здесь.

function setImageSrcClicks(){ 
    document.getElementById('image1').src = 'http://clicks_url'; 
} 
setTimeout(setImageSrcClicks,500); 
+0

Извините, я оставил это - это уже было объявлено, я только что оставил его по какой-то причине: S – zik

+0

Если он не работает, 'image1' или' clicks' не объявляется. Для отладки попробуйте 'setTimeout (« console.log (image1, clicks); ", 500);' – PiTheNumber

Смежные вопросы