2012-06-15 74 views
1

AIM:我想设置下面的函数来每5秒调用一次。使用qtip。如何从setInterval()调用js函数

变量ALARM_POPUP通过一个shellcript改变每一分钟,shellcript替换变量上的内容。

CODE:

function popupTXT() 

     { 

       var ALARM_POPUP="Alarm Warning warning "; 

       $('#telecom_1').qtip({content:ALARM_POPUP,style: {name: 'dark', tip: 'topLeft'} }); 

     }; 

我现在用的是下面一个计时器调用。

setInterval("popupTXT()",5000); 

结果:这只会在刷新浏览器时起作用。任何建议,将不胜感激

+0

即使你打电话每5秒你打算如何更新'ALARM_POPUP'内容的功能?它似乎在服务器上生成,但一旦它被下载到浏览器,它不会改变,除非你正在做一些AJAX请求 – CodingHamster

+0

@ user628405 ALARM_POPUP的内容是通过使用sed代替当前文本的shell脚本改变的与新的文本。它总是更新,只是jquery没有刷新窗口而没有刷新它,我不能这样做,因为页面的其他部分。 – Rhys

回答

5

变量ALARM_POPUP通过shell脚本它取代了每分钟变化一次内容在变量上。

这意味着要在页面上看到该更改,必须调用服务器以获取更新的值。你没有那样做。

你可以通过ajax来实现。创建一个服务器端页面,输出ALARM_POPUP的原始文本(使用Content-Type: text/plain)或JSON(使用Content-Type: application/json)的新值并触发ajax调用以获取该页面的内容,然后使用它更新qtip。你不会想要setInterval,因为在调用时间长度不确定的情况下,事情会很快变得混乱。相反,只要在上一个周期完成后启动一个setTimeout

假设您创建一个updatealarm.xyz页面(PHP,JSP,ASP.Net,等等),输出电流ALARM_POPUP价值为纯文本,将看东西这样的:

(function() 
{ 
    var ALARM_POPUP="Alarm Warning warning "; 

    function updateQtip(popupText) 
    { 
     $('#telecom_1').qtip({content:popupText,style: {name: 'dark', tip: 'topLeft'} }); 
     setTimeout(nextUpdate, 5000); 
    } 

    function nextUpdate() 
    { 
     $.ajax({ 
      url: "updatealarm.xyz", 
      success: function(data) 
      { 
       ALARM_POPUP = data; // Although you don't actually need to update it 
       updateQtip(data); 
      }, 
      error: function() 
      { 
       // Do error handling 
      } 
     }); 
    } 

    updateQtip(); 

})(); 

关于你的原setInterval电话:最好不要将字符串传入setIntervalsetTimeout;这基本上是做一个eval,这既不必要也不是一个好主意。相反,如上所述,传入函数引用(例如,函数名称,不调用())。


重新下方的评论:

我有这个问题,我想知道,如果你提供的PHP文件将是什么样子

我有一个例子只做了一点PHP,但我相信它看起来像这样:

<?php 
    header('Content-Type: text/plain'); 
    echo 'This is the message that will end up in \'data\' in the ajax success handler.'; 
?> 

或if您喜欢使用一个变量来使它更容易为你的sed脚本:

<?php 
    header('Content-Type: text/plain'); 
    $alarm_popup = 'This is the message that will end up in \'data\' in the ajax success handler.'; 
    echo $alarm_popup; 
?> 
+0

@TJCrowder感谢您的详细回复。该变量正在通过shell脚本上的sed命令在html页面上进行更改。但是这个功能仍然没有吸收变化。如果我检查HTML,则代码已更改为新的警报内容。 – Rhys

+2

@Rhys:关键点是**客户端与服务器**页面的副本。当浏览器请求该页面时,服务器会将该页面的一个*副本*发送给它。你的'sed'脚本改变服务器上的***页面,而不是客户端。它不会(也不能)更改页面的客户端显示。这就是为什么您必须向服务器请求更新。显然你不想再向服务器请求整个页面,所以做一个单独的页面。 'sed'脚本*也*更新'updatedalarm.xyz',上面的代码应该排除,因为客户端代码从服务器请求更新的文件。 –

+0

@TJCrowder这很有道理,谢谢你。我也在这个页面上运行jquery draggable()。这不会导致问题吗? – Rhys

5

试试这个:

setInterval(popupTXT,5000); 

Just a sample

了解更多关于.setInterval()

+0

@ T.J.Crowder先生,如果我做错了,请编辑。 – thecodeparadox

+0

@ T.J.Crowder感谢Sir Sir – thecodeparadox

+0

重新阅读这个问题,虽然你说的最好是使用带有函数引用的'setInterval'而不是字符串,我不认为这是OP的问题。 –