2012-04-10 14 views
3

が発生します。

var id_atual 
var temp_id 
var tempo_flash = 50 
var $slide_atual = $('#slider .atual') 
var $slide_prox = $('#slider .ocultar') 
setInterval(function(){ 
    id_atual = $slide_atual.attr('alt') 
    $.post('get_banner.php', {atual: id_atual}, function(proximo){ 
     temp_id = proximo.split(';;') 
     $slide_prox.attr('src', temp_id[0]).load(function(){ 
      $slide_atual.hide('fade', tempo_flash, function(){ 
       $slide_atual.attr('alt', temp_id[1]).attr('src', temp_id[0]).load(function(){ 
        $slide_atual.show('fade', tempo_flash) 
       }) 
      }) 
     }) 
    }) 
}, 4000) 

そして、次のHTMLコード:クラス.ocultarが

display: none; 
を持って

<div id="slider"> 
    <img src="imagens/slider/imagen-slider.jpg" alt="1" class="atual"/> 
    <img src="" alt="" class="ocultar" /> 
</div> 

varsのtempo_flashはアニメーションの時間のみで、get_banner.phpファイルはmysqlデータベースから次のバナーを取得するためのものです。それはテストされ、正常に動作します。 私が持っている問題は少し(4または5のバナーの変更)ブラウザがFirefox ChromeとOperaの場合は応答を停止し、IEの場合はアラートが表示され、Stack overflow at line: 3のページ全体のjavascriptが機能しなくなることです。

+0

デバッガでコードをステップ実行しようとしましたか? –

+15

セミコロンキーを固定するにはお金を使うべきです:-) – Pointy

+1

'$ .post()'を '$ .ajax()'に変更し、 'timeout'パラメータを含めてみてください。私は、AJAXリクエストが完了し、スタックしてブラウザのリソースを食べるまでに時間がかかると思います。 –

答えて

3

setInterval()関数の各繰り返しで、画像プレースホルダーに​​イベントを割り当てます。オブジェクトにイベントを割り当てるは既存のものを削除しません

2番目の反復では、画像プレースホルダには2つの​​イベントハンドラがあり、その後3つのイベントハンドラがあります。イメージがロードされるたびに、​​イベントにアタッチされたすべてのイベントハンドラが起動します。おそらく​​イベントハンドラを1回だけ割り当て(そしてセミコロンを使用する)ことによって、おそらくコードを再作成する必要があります。

+0

すべてのthe.load()イベントを取り除き、 "スタックオーバーフロー"エラーが発生するのを止め、解決された!!!!! Salmanさん、ありがとうございます "src"を変更した後、画像Finnishの読み込み時にのみイベントをトリガーする良い方法はありますか? –

+1

'.load()'イベントを要素にアタッチすると、イメージのロードが終了するたびに起動します。コールバック関数の中で '$(this).attr(" src ")'をチェックして、どのイメージがロードされたかを調べることができます。 –

0

あなたは、あなたが関数内でのsetTimeoutを使用して、および$ .postのコールバックにそれを実行する必要がありするsetIntervalを使うべきではない、何かのように:

var id_atual 
var temp_id 
var tempo_flash = 50 
var $slide_atual = $('#slider .atual') 
var $slide_prox = $('#slider .ocultar') 
function tictac(){ 
    setTimeout(function(){ 
     id_atual = $slide_atual.attr('alt') 
     $.post('get_banner.php', {atual: id_atual}, function(proximo){ 
      temp_id = proximo.split(';;') 
      $slide_prox.attr('src', temp_id[0]).load(function(){ 
       $slide_atual.hide('fade', tempo_flash, function(){ 
        $slide_atual.attr('alt', temp_id[1]).attr('src', temp_id[0]).load(function(){ 
         $slide_atual.show('fade', tempo_flash) 
        }) 
       }) 
      }) 
     }) 
     ticktac(); 
    }, 4000); 
} 

このようにして、4秒のみ開始サーバーからの応答が完了したら、オーバーフローの問題は発生しません。

+0

この試みと同じエラーを持っ... そのtarcisiofotografia.com.br/site上で実行されている –

+0

i'veは のsetTimeout(関数(){... }、4000のように、外側のsetTimeout再帰を使用しようとしました); tictac() と何も... –

+0

書き換えに手間がかかる場合は、セミコロンを含めないでください。 ;) – Matthematics

関連する問題