2010-06-11 5 views
8

मेरे पास वर्तमान में एक अजाक्स-आधारित चैट है, जिसे मैं अपडेट होने पर केवल चैट स्क्रिप्ट लोड करके स्ट्रीमलाइन करने की कोशिश कर रहा हूं। इस प्रकार, डेटाबेस में कुछ भी नहीं बदला है, तो लोडिंग को रखने की जरूरत नहीं है।अजाक्स चैट - अगर कोई परिवर्तन होता है तो केवल अपडेट करें

मेरे वर्तमान तर्क का कहना है:

  • जावास्क्रिप्ट समारोह हर 1/2 दूसरा आग चैट लॉग (setInterval())

कुछ भी नहीं बदला गया है, हालांकि, यह काफी बुला रखने के लिए अक्षम लगता है पाने के लिए यह। इसके बजाय, मैं क्या करना चाहते हैं:

  1. JavaScript फ़ंक्शन जांच करता है कि वहाँ डेटाबेस
  2. हाँ, तो किसी भी नई लॉग कर रहे हैं - लोड नया लॉग, अगर नहीं - छोड़ वर्तमान में प्रदर्शित लॉग अकेला।

मैं इसके बारे में कैसे जाऊं? समारोह मैं वर्तमान में उपयोग कर रहा हूँ है:

function updateShouts() { 
    $('#chatArea').load('chat.php'); // load chat logs 
} 
setInterval("updateShouts()", 500); // call function every half a second 

उत्तर

0

जैसा कि आप जानते .load समारोह उत्पादन अपने chat.php फ़ाइल द्वारा दिया साथ एक तत्व भरता है। यह .load फ़ंक्शन दो चरणों में करता है: यह chat.php के लिए AJAX अनुरोध करता है और फिर text.php के आउटपुट में तत्व का मान सेट करता है। आप जो करना चाहते हैं वह पहला कदम है। इस प्रयोग के chat.php फ़ाइल मैं isChatUpdated.php की तरह एक अलग लिपि बुला सुझाव है का उपयोग करने का

http://api.jquery.com/jQuery.ajax/

इसके बजाय .ajax समारोह ऐसा करने के लिए। वह स्क्रिप्ट सिर्फ नाम की तरह ही करेगी और जांच करेगी कि चैट में कोई बदलाव आया है या नहीं। इसके बाद आप यह पता लगाने के लिए उस परिणाम का उपयोग कर सकते हैं कि आपको अपना .load फ़ंक्शन कॉल करने की आवश्यकता है या नहीं।

+0

अजाक्स समारोह आप कैसे मिलता है साथ जांच php स्क्रिप्ट से लौटा मूल्य? – Dave

+0

आपको "सफलता" कॉलबैक फ़ंक्शन निर्दिष्ट करना होगा। आप देखेंगे कि यह उस पृष्ठ पर कैसे काम करता है जिसे मैंने आपको लिंक किया था। –

0

किसी भी तरह से आपको सर्वर पक्ष में डीबी से पूछताछ करने की आवश्यकता है, तो यह लगभग अप्रासंगिक है अगर यह लॉग डेटा या एकल मान देता है।
आप वापसी मूल्य के आधार पर #chatArea को अपडेट न करने का निर्णय ले सकते हैं, लेकिन आपको लॉग पुनर्प्राप्त करने के लिए एक और कॉल करना है, अन्यथा।

1

ऐसा करने का एक अपेक्षाकृत सरल तरीका AJAX का उपयोग एक पृष्ठ लाने के लिए करना है जो आपको बताता है कि कोई अपडेट किया गया है या नहीं। तो उदाहरण के लिए, आप checkForUpdate.php जैसे पृष्ठ ला सकते हैं जिसमें चैट में कुछ भी नया है या नहीं, यह इंगित करने के लिए 1 या 0 है। यदि आपको 1 बार वापस मिला है, तो आप आगे बढ़ सकते हैं और पूर्ण chat.php पृष्ठ लोड कर सकते हैं।

(इससे पहले कि आप AJAX उपयोग नहीं किया है, यह एक बहुत अच्छा ट्यूटोरियल है: http://www.tizag.com/ajaxTutorial/)

एक अन्य समाधान (और एक मुझे लगता है कि शायद बेहतर है) एक पेज केवल सबसे हाल ही में है कि लोड करने के लिए है चैट लाइनें उदाहरण के लिए, कहें कि आप वर्तमान में चैट के लाइन 1-14 प्रदर्शित कर रहे हैं। इसके बाद आप सामग्री को लाने के लिए AJAX का उपयोग कर सकते हैं, उदाहरण के लिए, getLines.php?s=14। यह पृष्ठ केवल 14 पंक्ति के बाद चैट की लाइनों को प्रदर्शित करेगा। फिर आप उन लाइनों को वर्तमान चैट विंडो के अंत में जोड़ देंगे।

+0

+1 केवल "नया" (क्लाइंट के लिए) लाइनों को लोड करने के लिए। – timdev

3

मैं timestamp एस (या message_id एस) पास करता हूं, सर्वर-साइड स्क्रिप्ट किसी क्लाइंट को भेजता है। फिर ग्राहक बस नए संदेशों के लिए पूछता है, और सर्वर केवल नया भेजता है।

तो, कल्पना करें कि प्रत्येक चैट संदेश में एक आईडी है। मैं अपने chat.php डिजाइन इतना की तरह एक पैरामीटर स्वीकार करने के लिए चाहते हैं:

chat.php?since=12345 

12345 अंतिम संदेश ग्राहक को देखा है की id होगा। chat.php अनिवार्य रूप से की तरह कुछ करता है:

SELECT * FROM chatmessages WHERE id > $since 

... और वापस एक अच्छी छोटी डेटा संरचना गुजरता (वस्तुओं की एक सरणी, JSON में इनकोडिंग, मान लें)।

तो, यदि कोई नया चैट संदेश नहीं है, तो सर्वर बस एक खाली सरणी वापस भेज रहा है।

मुझे नहीं लगता कि आप उससे अधिक कुशल हो सकते हैं।

संपादित करें:

मुझे लगता है कि यह इस तरह से कर रही है थोड़ा और क्लाइंट साइड कोडिंग की आवश्यकता है। अब आप पूरे चैट इतिहास के साथ कुछ div को अपडेट नहीं कर रहे हैं। आपको अपने AJAX कॉल पर एक हैंडलर भी होना चाहिए जो परिणामों पर पुनरावृत्त हो, और प्रत्येक संदेश के लिए, उस पंक्ति के लिए प्रोग्रामिंग रूप से div बनाएं, फिर इसे अपने चैट div पर जोड़ दें।

0

मैं पहली बार है कि कुछ इस तरह देखा एक फ़ाइल उदाहरण messages.php के लिए बुलाया बनाना होगा: क्लाइंट की तरफ

<?php header('Content-Type: application/json'); 

$messages_since = !empty($_POST['since']) 
    ? mysql_real_escape($_POST['since']) 
    : '0000-00-00 00:00:00'); 

// Get all messages from database since the $messages_since date_time 

echo json_encode($array_with_messages); 

फिर उस तरह jQuery या कुछ का उपयोग कर रहा कुछ इस तरह करना होगा:

  1. संदेशों जाओ मैं एक नया संदेश हम वापस मिल के लिए एचटीएमएल बना सकते हैं और ऐसे संलग्न करेंगे/बढ़ाएँ यह चैट कंटेनर करने के साथ ही दुकान किस समय नवीनतम एमईएस की तरह $.post('messages.php', new_messages_handler)
  2. कुछ का उपयोग कर हैंडलर में ऋषि बनाया गया था।
  3. प्रतीक्षा थोड़ी देर

की तरह $.post('messages.php', {since: latest_datetime_we_have}, new_messages_handler)

  • जाओ कुछ का उपयोग कर नए संदेश प्राप्त कम से कम यह मेरे सिर में बहुत अच्छी तरह से काम करता है: पी