2011-07-23 32 views
1

我正在嘗試爲其中有許多章的書籍製作「幻燈片」查看器。 「幻燈片」是存儲在數據庫中的HTML數據塊。一章可以包含50-100張幻燈片,但它們非常小(每個1-2 kB,圖片中有一些)。我希望用戶有按鈕來點擊上一張和下一張幻燈片,並最小化加載時間。jQuery多個get()從數據庫到數組 - 好主意?

我現在有一個名爲ContentFetcher.php的PHP頁面,它只查詢數據庫以獲取一張幻燈片(節)的內容。

<?php 
require_once 'Database.php'; 
echo Database::getInstance()->getSectionText($_GET["bookID"], $_GET["chapter"], $_GET["section"]); 
?> 

我的JavaScript運行一個循環,並獲取與$.get()每個章節當前章節:

 $(function() {         
      <? $db = Database::getInstance(); ?> 

      var chapterSize = <?= $db->getChapterSize($this->bookID, $this->chapter) ?>; 
      var chapterContent = []; // this is where I want to store the contents 
      var currentSection = <?=$this->section;?>; 

      for (var i = 1; i <= chapterSize; i++) { 
       $.get("ContentFetcher.php", { 
        bookID : <?= $this->bookID ?>, 
        chapter : <?= $this->chapter ?>, 
        section : i 
       }, function(data) { 
       chapterContent.push(data); 
      }); 
      } 

     $("#slides").html(chapterContent[currentSection]); // show the current slide 

    }); 

所以這是一個好主意性能明智?如果是這樣,我對JS閉包的理解還不是很好 - 我如何在閉包內部訪問相同的chapterContent

回答

2

這個想法意味着你會做50到100個HTTP請求來加載一個章節;而這些都將在幾乎同一時間完成。

所以,每次有人試圖加載一個章節,你的web服務器將在幾秒鐘內得到100個請求 - 可能不是一個好主意。


在這種情況下,我可能會嘗試實現這樣的:

  • 當用戶打開一章中,做一個HTTP請求,這將返回第10張幻燈片
  • 當用戶到達幻燈片8時,執行單個HTTP請求,將幻燈片11加載到20
  • 當用戶到達幻燈片18時,執行單個HTTP請求,將幻燈片21加載到30
  • 等等在

當然:

  • 如果用戶通過鍵入URL(如果可能的話),或使用一些「轉到幻燈片X」功能到達幻燈片56,你必須做一個HTTP請求載片51到60.
  • 這意味着如果用戶從幻燈片滑動過快,用戶可能需要等一會兒。


它將使雙方的客戶端和服務器端代碼稍微複雜一些,但它可能是最好的解決辦法之一:

  • 你不會在同一時間加載太多的數據,
  • 你不會預先加載了太多的數據,
  • 你,你也不會做太多的HTTP請求,
  • 而那些會做提前了一點,因此用戶不必等待看到新的幻燈片我有。
+0

我第二。 HTTP請求會產生巨大的開銷(對於服務器和客戶端)。如果一頁實際上大約爲1-2 kB,那麼您可以一次加載整個章節(並且在您接近特定頁面時動態顯示圖片)。 – RamboNo5

0

不,這絕對不是一個好主意。我建議你只做一個$ .get()請求來接收JSON數組中的所有記錄。

關於關閉,你必須觀看優秀的道格拉斯克羅克福德的視頻"The JavaScript Programming Language" (4 parts)。是的,關閉可以這樣使用,它們很棒。

相關問題