2013-04-14 105 views
0

這有點讓代碼混淆(我認爲),但我希望你能理解它,(是的,我知道我的Mysql API是不是最好的,但我會改變當我有時間(這是一個大腳本))PHP/JQuery - PHP腳本每5秒運行一次,但jquery函數只運行一次

嗯,我有一個PHP腳本,每5秒運行一次,在JQuery中做一個通知,如果存在任何行帶有用戶user_id的friend_requests表,並且如果存在,則運行jquery通知(類似於facebook),表示用戶已經向他發送了朋友請求。

但問題是,PHP腳本每5秒運行一次,但腳本中的說明在屏幕中打開通知框的Jquery函數只運行一次..如果我有一行user_id用戶,如果是第一次運行php代碼,就運行通知(如果前5秒已經過去,如果該行在5秒之後纔出現,則通知框不會出現),只要該行進入前5秒。 (但是,PHP代碼的其餘部分完美地運行)

friend_request_notification.php

<?php include_once("includes/head.php"); ?> 
<?php require_once("includes/connect/connect.php"); ?> 
<?php require_once("includes/functions.php"); ?> 
<?php require_once("includes/jquery.php"); ?> 
<?php login_validation(); 

function friend_request_notification() 
{ 
    global $db; 
    global $userid; 

    $query_id_see = "SELECT user_id FROM friend_requests WHERE user_id={$userid}"; 
    $result_set3 = mysql_query($query_id_see, $db) or die(mysql_error()); 

    if ($id_requests = mysql_fetch_array($result_set3)) 
    { 
     $select_requester_id = "SELECT user_id_requester FROM friend_requests WHERE user_id={$userid}"; 
     $result1=mysql_query($select_requester_id); 

     $row = mysql_fetch_assoc($result1); 
     $requester_id = $row['user_id_requester']; 

     $select_requester_name = "SELECT * FROM members WHERE id={$requester_id}"; 
     $result2=mysql_query($select_requester_name); 

     $row = mysql_fetch_assoc($result2); 
     $requester_fname = $row['first_name']; 
     $requester_lname = $row['last_name']; 

     echo ' 
     <html> 
     <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js" type="text/javascript"></script> 

     <link rel="stylesheet" type="text/css" href="style2.css" /> 
     <script src="jquery.facebookBeeper.js" type="text/javascript"></script> 
     </head> 
     <body> 

     <div id="BeeperBox" class="UIBeeper"> 
     <div class="UIBeeper_Full"> 
      <div class="Beeps"> 
       <div class="UIBeep UIBeep_Top UIBeep_Bottom UIBeep_Selected" style="opacity: 1; "> 
        <a class="UIBeep_NonIntentional" href="#"> 
        <div class="UIBeep_Icon"> 
         <i class="beeper_icon image2"></i> 
        </div> 
        <span class="beeper_x">&nbsp;</span> 
        <div class="UIBeep_Title"> 
         <span class="blueName"> ' . $requester_fname . ' ' . $requester_lname . '</span> has send you a friend request <span class="blueName">coise</span>. 
        </div> 
        </a> 
       </div> 
      </div> 
     </div> 
     </div> 

     </body> 
     </html>'; 

     $insert_table = "INSERT INTO friend_requests_notificated SELECT * FROM friend_requests WHERE user_id={$userid} "; 
$delete_table = "DELETE FROM friend_requests WHERE user_id={$userid}"; 
$change_table1 = mysql_query($insert_table) or die(mysql_error()); 
$change_table2 = mysql_query($delete_table) or die(mysql_error()); 

    } 
    else 
    { 

    } 
} 

friend_request_notification(); 
?> 

jquery.facebookBeeper.js

$(document).ready(function() { 
// set the time for the beeper to be displayed as 5000 milli seconds (5 seconds) 
var timerId, delay = 5000; 
var a = $("#BeeperBox"), 
    b = $("a.control");; 
//function to destroy the timeout 


function stopHide() { 
    clearTimeout(timerId); 
} 
//function to display the beeper and hide it after 5 seconds 


function showTip() { 
    a.show(); 
    timerId = setTimeout(function() { 
     a.hide(); 
    }, delay); 

} 
    showTip(); 
//function to hide the beeper after five seconds 


function startHide() { 
    timerId = setTimeout(function() { 
     a.hide(); 
    }, delay); 
} 
//display the beeper on cliking the "show beeper" button 
b.click(showTip); 
//Clear timeout to hide beeper on mouseover 
//start timeout to hide beeper on mouseout 
a.mouseenter(stopHide).mouseleave(startHide); 

$('.beeper_x').click(function() { 
    //hide the beeper when the close button on the beeper is clicked 
    $("#BeeperBox").hide(); 
}); 

showTip(); 
}); 

通知s.js

window.setInterval(function(){ 
    $('#notifications').load('friend_request_notification.php'); 


}, 5000); 

回答

2

看起來不錯,但我想有一個緩存的問題,比如JavaScript正從緩存中的同一個文件。添加時間戳,以便每次請求新文件。

window.setInterval(function(){ 
    $('#notifications').load('friend_request_notification.php?' + (new Date()).getMilliseconds()); 
}, 5000); 

這將強制瀏覽器在每次發送請求時都下載一個新文件。

+0

我試過了,現在腳本甚至不運行o_o –

+0

Omg !!!你有任何要求和迴應嗎? –

+0

@DavideGonçalves這是我的錯誤。它應該是'.getMilliseconds()'而不是'getMilliseconds'。謝謝。 '()'犯了錯誤。 –

0

我還沒有測試過這個,但我猜測它只加載一次,因爲它第一次加載它並緩存文件。所以,它本身並不是第二次運行。

這是有道理的,否則該人的緩存將有一百個副本的相同文件,這是沒有用的。

使間隔運行時,它運行JavaScript文件中的函數。

window.setInterval(function(){ 
    $('#notifications').load('friend_request_notification.php'); 

    showTip() 
}, 5000); 

或類似的。你不應該試圖一次又一次地在這樣的腳本中加載一個JavaScript文件。該JS應該在首頁。

+0

我無法做到這一點,因爲我想showTip()只是如果表中的新行存在.. –

+0

所以,然後做一個在showTip檢查。或者加載通知,以便在正文結尾處有。 –

+0

'load'是不同步的,'showTip()'將在新數據加載之前運行 – charlietfl

0

重要的是要認識到document.ready已經發生在您正在加載新內容的主頁面中。

這意味着當您加載新腳本時,它將立即觸發,並且在這種情況下將在它所引用的html存在之前觸發。

friend_request_notification.php中的HTML之後放置腳本將確保在腳本觸發之前將html加載到DOM中。

結構上可以考慮只是包裝的所有代碼jquery.facebookBeeper.js到包含在notifications.js函數和,而不是使該腳本文件每5秒,load完整回調的內部運行功能的新的要求。

window.setInterval(function(){ 
    $('#notifications').load('friend_request_notification.php',function(){ 
      /* new content now exists in page, run code here*/ 
    }); 

    showTip() 
}, 5000); 

也應該知道,當你在頁面加載declre var a = $("#BeeperBox"),,然後更換新的HTML元素,var a不會對eleemnt的新版本相同ID的參考。