0

私はGoogleAppEngineとPythonでシステムを開発しています。次のjQueryコードは、時刻を定期的に更新するために使用されます。content次のHTMLコードは、 jQueryAjaxによってdivに挿入されます。

HTML:

...
{{product.name}}: <br />
Bidding time is approaching: <div id="timeToBid{{product.randomNo}}">{{timeToBid}}</div>
...

$(document).ready(function() {
  function updateTime() {
    $.ajax({
      url: "/timeToBid?productId={{product.key.id}}",
      cache: false,
      success: function(returndata){
        $('#timeToBid{{product.randomNo}}').html(returndata);
      }
    });
    setTimeout(updateTime, 1000);
  }
  updateTime();
});

サーバー側プログラム:

class TimetoBid(webapp2.RequestHandler):
    def get(self):
        productId = self.request.get('productId')
        product = Product.get_by_id(productId)
        time = str(datetime.datetime.now() - product.bidTime)
        self.response.out.write(message)

ただし、ページ内の他のボタンをクリックしてcontentdivを更新すると、ページ全体を更新しない限り、updateTime()関数は実行されたままになります。また、機能が停止しないため、何度もページに入ると、1秒間に数回問題が発生します。contentdivが他のHTMLコードで更新された場合に関数を停止するにはどうすればよいですか?

4

2 に答える 2

1

setTimeoutの結果を変数に割り当てますtimer。コンテンツ div を更新するコードは、clearTimeout(timer).

アップデート

別のオプションは、updateTime()関数がコンテンツ div が変更されたかどうかを確認し、実行を停止することです。

var oldContent;
function removeTimeToBid(str) {
    return str.replace(/<div id="timeToBid.*?<\/div>/, '');
}
function updateTime() {
   var newContent = removeTimeToBid($("#content").html());
   if (newContent != oldContent) { return; }
   $.ajax({
      url: "/timeToBid?productId={{product.key.id}}",
      cache: false,
      success: function(returndata){
        $('#timeToBid{{product.randomNo}}').html(returndata);
      }
   });
   setTimeout(updateTime, 1000);
}

function startUpdatingTime() {
    oldContent = removeTimeToBid($("#content").html());
    updateTime();
}
于 2013-02-23T10:04:55.623 に答える
1

setTimeout の代わりに setInterval を使用する必要があります。

$(document).ready(function() {

  //Define variable to enable or disable the refresh function
  window.doRefresh = true;

  function updateTime() {

    //Execute AJAX request only if it is allowed
    if(!window.doRefresh)
        return;

    $.ajax({
      url: "/timeToBid?productId={{product.key.id}}",
      cache: false,
      success: function(returndata){
        $('#timeToBid{{product.randomNo}}').html(returndata);
      }
    });
  }

  //Permits to execute updateTime every seconds until clearInterval is called
  var intervalHandle = setInterval(updateTime, 1000);

  $('#myDiv').click(function(){
      //Stop definitely the interval code execution using
      clearInterval(intervalHandle);

      //Or use a variable to disable refreshing
      window.doRefresh = false;

      //Do some stuff...

      //Then enable refreshing like this
      window.doRefresh = true;
  });

});
于 2013-02-23T10:06:49.897 に答える