0

関数に「str」を付けたまま、どのようにIntervalを設定できるかを理解するのに助けが必要です。

クライアントがオプションを選択し、関数「GET」が選択されたオプションです。しかし、setIntervalで更新すると、文字列が失われます。これを行うにはどうすればよいですか。

私はこれを試しました:

<script type="text/javascript">
function countrystats(str)
  {
  if (str=="")
  {
  document.getElementById("countrystats").innerHTML="";

  return;
  } 
  if (window.XMLHttpRequest)
  {// code for IE7+, Firefox, Chrome, Opera, Safari
  xmlhttp=new XMLHttpRequest();
  }
  else
  {// code for IE6, IE5
  xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
  }
  xmlhttp.onreadystatechange=function()
  {
  if (xmlhttp.readyState==4 && xmlhttp.status==200)
  {
  document.getElementById("countrystats").innerHTML=xmlhttp.responseText;
  }
  }
  xmlhttp.open("GET","countrystats.php?q="+str,true);
  xmlhttp.send();

 setInterval(countrystats, 5000);


  }
  </script>

うまくいけば、あなたは私がこの混乱を整理するのを手伝ってくれるでしょう:-)

私はこれがいくつかのjQueryで実行できることを知っていますが、私はそれを機能させるようです。たぶん、これら2つのことが関連している、私は知らない:-)

関数countrystatsが入力を取得する方法は次のとおりです。

script type="text/javascript">
$("#countrystats_menu > li > a").click(function (ev) {
  var str = $(this).html();
  countrystats(str);

  $('#country_span').html(str);
  });


  </script>

編集/解決策:

問題は、setIntervalを実行すると、接続されているstrが失われることでしたが、このコードはそれを保持しているようです。

setTimeout((function(strPriorToTimeout)
{//IIFE's scope preserves state of str variable
    return function()
    {
        countrystats(strPriorToTimeout);
    };
})(str),5000);
4

3 に答える 3

0

setInterval(countrystats、5000);を呼び出しています。同じ機能で。jqueryでもできます

url='countrystats.php?q='+str;

ajax calll

$.get(url, function(data) {
  $('#countrystats').html(data);

});

getが終了したら。setInterval(countrystats, 5000);コンテンツの更新を求めることができます。

于 2013-03-01T10:35:12.957 に答える
0

引数strは最後にスコープ外になり、間隔はに値を渡さstrに関数を呼び出すだけです。いくつかのコメントが示唆しているように、うまくcountrystats(str)いくように見えますが、そうではありません。理由は次のとおりです。

setInterval(countrystats(str), 500);

この行には、関数への直接呼び出しである、などの値に評価/解決される複数の式が含まれています。countrystats(str)次に、間隔が設定される前に関数が呼び出されます。
最も簡単な解決策は、無名関数を作成し、内部から関数を呼び出すことです。

setInterval(function()
{
    countrystats(str);
},5000);

クロージャを作成し、実際にの意図した値を区間関数に渡すことで、さらに安全にプレイすることもできます。strこれはオプションであり、少し混乱する(そして厄介に見える)かもしれません:

setInterval((function(strPriorToTimeout)
{//IIFE's scope preserves state of str variable
    return function()
    {
        countrystats(strPriorToTimeout);
    };
})(str),5000);

あなたのコードについて私を悩ませているのは1つだけです。setIntervalそれは、Xミリ秒ごとに同じ関数呼び出しを繰り返すを使用しているということです。関数を1回だけ呼び出す必要がある場合は、を使用する方がよい場合がありますsetTimeout
もう1つsetIntervalは、間隔のIDを返すため、必要に応じて定数関数の呼び出しを停止できます。そのIDをどこにも割り当てていないようです。そのため、ブルートフォース攻撃を行わない限り、コードは実行され続けclearIntervalます。おそらく、setIntervalアクセス可能な変数にの戻り値を割り当てることを検討してください。
間隔をクリアする唯一の方法ではない場合、AFAIKは次のようになります。

for (var i=0;i<Number.MAX_VALUE;i++)
{
    clearInterval(i);
}

今、それはひどいですよね?

コメントに照らして、ここにWebworkerに関する情報を追加したほうがいいと思いました。OPが達成したいことを収集したことから、可能な限りWebワーカーを使用することをお勧めします。ここでの基本的な設定は次のとおりです。

//client.js
var worker = new Worker('dashWorker.js');//worker script
//to kick off the worker: 
function countrystats(str)
{
    str = str || document.getElementById('countrystats').innerHTML;//get str value
    worker.postMessage(str);//that's it, the worker takes care of everything else
}
worker.onmessage = function(response)
{
    document.getElementById('countrystats').innerHTML = response.response;//cf worker code
    return countrystats(response.str);//choose when to call the countrystats function again, as soon as the worker responded... easy!
};

//the worker:
self.onmessage = function(e)
{//you could add a way of stopping the constant updates, by posting a 'stopDash' or something...
    //do ajax call using e.data --> this is the string anyhow
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function(response)
    {
        if (this.readyState === 4 && this.status === 200)
        {
            self.postMessage({str: e.data, 
                              response: response.responseText});
        }
    };
    xhr.open('GET', 'countrystats.php?q=' + e.data,true);
    xhr.send();
};

もちろん、このコードは「クリーン」にはほど遠いです。パフォーマンスを微調整することで実行できますが(DOMに常にクエリを実行しないなど)、基本的なプリンシパルは有効です...
ここにいくつかの重要なリンクがあります。

MDNJohnResigの
ワーカーに関するブログ投稿Webワーカー
の段階的な紹介

于 2013-03-01T10:47:39.093 に答える
0

jQueryを使用してコードを簡略化しました。jQuery.loadを使用して、リモートhtmlをstart要素にロードしました。

また、新しいアイテムがクリックされるたびに、前の間隔を作成する必要があります。そうしないと、複数のリクエストスレッドが実行されます。

function countrystats(str) {
    if (str == "") {
        $('#countrystats').empty();
        return;
    }

    $('#countrystats').load('countrystats.php?q=' + str)

}

var interval;
$("#countrystats_menu > li > a").click(function(ev) {
    if (interval) {
        clearInterval(interval);
    }

    var str = $(this).html();

    countrystats(str);
    interval = setInterval(function() {
                countrystats(str);
            }, 5000);

    $('#country_span').html(str);
});
于 2013-03-01T10:51:14.003 に答える