2012-03-20 3 views
2

Привет Я относительно новичок в javascript и jQuery, а при попытке создать функцию работает с интервалами в 100 миллисекунд. Я столкнулся с проблемой. Кажется, я попал в консоль firebug и error witch говорит, что clasing() не defined.This мой код:jQuery setInterval() undefined function error

$(document).ready(function() { 
    var prev = $("img.selected").prev(); 
    var curent = $("img.selected"); 
    var next = $("img.selected").next().length ? $("img.selected").next() : $("img:first"); 

    $("img").not(":first").css("display","none"); 

    function clasing() { 
     curent.removeClass("selected"); 
     next.addClass("selected"); 
    } 

    setInterval("clasing()",100); 
}); 

что я делаю неправильно здесь Спасибо

+1

возможно дубликат: http://stackoverflow.com/questions/2162267/setinterval-and-window-onload-problem – jbabey

ответ

5

У вас проблема с областью. Ваши переменные (prev, curent и next) доступны внутри диапазона .ready, например, ваша функция clasing. Но когда вы добавляете эту функцию для вызова в интервале, используя setInterval, эта функция должна находиться в глобальной области (внутри объекта window). Затем вы должны объявить эту функцию как window.clasing = function(){ ... }, но при этом переменные, объявленные в области .ready(), не будут доступны, запустив эту функцию за пределами этой области, поэтому все ваши переменные также должны быть в глобальной области. Это должно решить вашу проблему.

Однако, это не хорошая практика программирования, вы должны объявить свои переменные внутри функции clasing, тогда они будут доступны только в области функций; И ваша функция должна быть деактивирована вне функции .ready(), а затем вы объявляете интервал внутри функции .ready().

Таким образом, ваш код должен быть Лик это:

function clasing(){ 
    var prev = $("img.selected").prev(); 
    var curent = $("img.selected"); 
    var next = $("img.selected").next().length ? $("img.selected").next() : $("img:first"); 

    curent.removeClass("selected"); 
    next.addClass("selected"); 
} 
$(document).ready(function() { 
    $("img").not(":first").css("display","none"); 
    setInterval("clasing()",100); //or just setInterval(clasing,100); 
}); 
3

Изменение setInterval("clasing()",100); к setInterval(clasing,100);

+0

Ну, это хороший совет , а не ответ ... Существует «перегрузка» со строкой, которая анализируется с помощью 'eval' – gdoron

+0

@eval, передавая ссылку на функцию вместо строки, будет исправлять проблему с областью. см. [связанный вопрос] (http://stackoverflow.com/questions/2162267/setinterval-and-window-onload-problem) – jbabey

+0

это не ответ ... оба 'setInterval ('clasing()', 100) 'и' setInterval (clasing, 100) 'вызовет ошибку неопределенной функции, так как проблема связана с областью функции. –

3

Изменить

?
setInterval("clasing()",100); 

Для

setInterval(function() { 
    clasing(); 
}, 100); 

прямо сейчас ваш вызов setInterval работает в глобальном масштабе, но ваша функция определена внутри функции JQuery. Создание закрытия даст вам доступ к членам функций jquery.