2012-06-05 48 views
0

我試圖用shebang實現AJAX - 這意味着example.com/#!/somepage.php只是example.com/somepage.php加載到AJAX網站的內容區域。將AJAX響應作爲文檔處理?

這樣做的顯而易見的方法是僅僅請求somepage.php,然後用新文檔替換documentElement的全部內容。但是,這似乎有點擊敗AJAX的目的。

相反,我想加載somepage.php,然後提取頁面的content部分,並將其放在內容區域中。

要做到這一點,我可以使用正則表達式來尋找/<div id="content">.*</div>/但是這將是一個非常糟糕的主意(最簡單的問題是「這</div>結束內容?)。相反,我希望能夠只是這樣做ajaxresponse.getElementById('content'),但我怎麼會去有關轉換ajaxresponsedocument(或documentFragment)對象?

或者這只是錯誤的方式來執行這樣的AJAX設置?我會過得更好具有服務器檢查X-Requested-With: XMLHttpRequest並只發回內容區域?

+1

是包括'jQuery'到相關難道這沒有問題嗎?使用jQuery Ajax的['.load()'](http://api.jquery.com/load/):'$('#result')。load('ajax/test.html #container');'。我知道你應該比我更清楚,shebang和jQuery有什麼問題嗎? –

+0

你的'#!'處理程序不能簡單地提出與頁面不同的請求嗎?例如,當'#!'處理'/ somepage.php'時,請求'/somepage.php?json'(返回一些方便使用的東西)。 – cheeken

+0

使用純JS,你也可以將你請求的頁面追加到一個隱藏的元素上(或者只是簡單地創建它),然後通過'getElementById'獲取你的加載的內容div。 –

回答

1

請求一個與您的#!處理程序兼容的變體,而不是逐字請求#!'d頁。

該方法需要兩個步驟。

  1. 通過JSON公開您的內容頁面。使此服務可用於滿足特定條件的請求,例如特殊的獲取參數,擴展名,標題等。例如,/somepage.php?json可能以JSON形式提供/somepage.php的內容。

  2. 編寫您的#!處理程序,以便它在處理請求時調用上面爲該頁定義的服務。例如,當加載example.com/#!/somepage.php並處理somepage.php時,請改爲請求somepage.php?json,並根據需要傳播該請求的內容。

這種方法爲您帶來許多好處。

    AJAX請求的
  • 減少響應大小
  • 減少服務器側的負載,因爲沒有HTML需要被呈現
  • 避免了HTML解析和一些昂貴的DOM操作
  • 上的瀏覽器不依賴於發送相應的AJAX相關的標頭
+0

(我發佈了這個評論,但認爲我不妨將它推廣到答案。) – cheeken

+0

感謝您的提示:) –

0

請注意,您實際上不需要使用正則表達式來從返回的數據中獲取內容。使用jQuery,例如,它只是使用$選擇的context爭論的問題(live fiddle

$.get("/", {}, function(data){ 
    $("#text").append($("#login", data)); 
});​ 

還要注意的家當導航經常與一些JavaScript框架