2012-01-03 17 views
0

エラーは次のとおりです。Javascriptの機能が定義されていない

switchDivが

に定義されていない
ここ

JSFiddle例:ここでは

http://jsfiddle.net/9s5Px/11/は、HTMLマークアップです:

<div id="container"> 
    <div class="foo"> 
     <p>Div A</p> 
    </div> 

    <div class="foo"> 
     <p>Div B</p> 
    </div> 

    <div class="foo"> 
     <p>Div C</p> 
    </div> 
</div> 

そして、 JavaScript:

$('.foo').fadeOut('fast'); 

var count = $('.foo').length; 
console.log(count); 

var currentItem = 0; 

function switchDiv() { 
    $('.foo').get(currentItem).fadeOut(); 
    if (currentItem < count - 1) {    
     $('.foo').get(currentItem + 1).fadeIn(); 
    } 
    else {   
     $('.foo').get(currentItem).fadeOut(); 
     currentItem = 0; 
     $('.foo').get(0).fadeIn(); 
    }   
} 

setTimeout("switchDiv()", 5000); 

答えて

5

setTimeoutに渡すコードの文字列は、ローカルクロージャにアクセスできません。これは、グローバルにevalになっています。


setTimeout(switchDiv, 5000); 
here、エラーなし参照:

はない文字列、関数自体にそれを渡します。

+0

?それは機能として必要なのでしょうか? –

+0

関数を呼び出すには、必要な括弧が必要です。 –

+0

10K - おめでとうございます! –

2

jsfiddleにスコープの問題があります。実際のコードについてはわかりませんが、jsがどのように呼び出されているかを示していないので、私は同じ問題だと思います。

jsfiddleは、$(document).ready()ハンドラ(左上のオプションを参照)の中で指定したコードを実行するので、switchDivがそこで定義されることに注意してください。どこタイムアウトがグローバルオブジェクトにswitchDivを探して、このsetTimeout("window.switchDiv()", 5000);

ソリューションは、setTimeoutメソッドに関数参照を渡すか、thisなどのグローバルスコープでのsetTimeoutを定義するかのいずれかで効果的であるとおりです。

注:get()関数は、実際のDOMオブジェクトを返します。おそらくあなたが探しているものはeq()ですが、eqは1ベースであることに注意してください。ここ

+0

+1良い説明は、コードが別のコンテキスト '$(document).ready()'の下で実行されていることを認識しませんでした。左... – xandercoded

+0

@ Xanderきれいで紛らわしい部分は、$(document).ready()ハンドラーをjsfiddleに明示的に追加することです。これは、jQueryがスマートなので、DOMがすでに準備ができていればすぐに準備完了ハンドラを実行できます。 –

0

二つの問題:

setTimeout(switchDiv, 5000); 

の代わりに文字列を評価する1.use。

2.inside switchDiv、get関数を使用してjQueryオブジェクトのdom要素を返すため、fadeInfadeOutメソッドは適用されません。

修正SRC:括弧なしだから、

$('.foo').fadeOut('fast'); 

var count = $('.foo').length; 
console.log(count); 

var currentItem = 0; 

function switchDiv() { 
    $($('.foo').get(currentItem)).fadeOut(); 
    if (currentItem < count - 1) {    
     $($('.foo').get(currentItem + 1)).fadeIn(); 
    } 
    else {   
     $($('.foo').get(currentItem)).fadeOut(); 
     currentItem = 0; 
     $($('.foo').get(0)).fadeIn(); 
    }   
} 

setTimeout(switchDiv, 5000); 
関連する問題