2013-04-12 93 views
2

我想這個功能添加到我的PHP購物車更改如何頁面內容從另一頁

讓我們假設我們有兩頁:catalog.php和cart.php

我想do是:

用戶單擊catalog.php 上的「添加到購物車」按鈕,並通過jQuery向cart.php發送ajax請求,向其發送關於添加了哪個產品的信息(這一切都按預期工作)並使cart.php頁面通過包含剛剛添加的產品而不刷新頁面來更新自己(這是我無法工作的部分)。

如果我並排放置兩頁並單擊「添加到購物車」,則不會發生任何反應,只有在頁面刷新(cart.php)時,我看到新產品已添加。

有沒有辦法實現這個?

編輯:我還不夠我很清楚對不起我的壞 該頁面以標準的方式呈現,沒有幀沒有彈出 的「應用」就可以工作,這將不會是用戶 問題「並排」的事情是因爲我想知道一種獲得這種功能的方式,因爲我可以看到自己在未來使用它的幾乎任何東西(pageA,CSS等的pageB的DOM操作)

+0

catalog.php和cart.php如何呈現給用戶?不同的框架,彈出窗口或什麼? – Havenard

+0

也許你可以分享一些代碼。 – RicardoGonzales

回答

0

可以通過在Cart.php上進行AJAX調用來模擬此操作,該操作檢查(session/db)以查看是否添加了新內容。

我建議像...

  • Cart.php使得AJAX調用每隔10-60秒,並要求產品在購物車的完整列表。
  • 根據情況將任何新項目添加到表格中(通過檢查產品ID或訂購項ID)。你也應該更新數量/等。

這樣,無論用什麼機制添加物品,購物車都會在太久之前看到它們。

很顯然,您投票的次數越多,購物車更新的速度越快,但系統上的負載也會越大。

現在,它不是直接可能的原因是,AJAX請求始終由客戶端,而不是服務器啓動。

還有一種可能的解決方法是忽略頻繁輪詢並提供近乎即時的更新,但實施起來稍微複雜一些。

它被稱爲長輪詢(見this answer)和有效的地方在於...

  • 客戶端發送AJAX(「A」)的請求到服務器進行車信息。
  • 服務器接受請求,但什麼都不做當通過AJAX(「B」)接收到一個新的購物車項目(就好象一個長期運行的腳本進行處理)
  • ,服務器響應請求與詳細信息和購物車頁面適當地更新表格。
  • 如果在合理的超時時間(30-120秒)內未檢測到購物車活動,服務器會迴應「無操作」響應並關閉連接。
  • 無論客戶收到什麼響應,它立即打開一個新的AJAX請求並重新開始。

實際上,你的PHP腳本然後檢查數據庫/會話/等更新交易和客戶端只等待「慢」的服務器上。這就是Twitter如何通過API實現各種訂閱源 - 每生成一條新的推文都會在新行中返回。

請注意,這可能是一個很痛苦的實現,因爲您只是將輪詢從客戶端轉移到PHP,但它確實使它從JavaScript的角度來看更優雅,消除了延遲並減少了浪費的網絡開銷。

+0

非常感謝您的回答! 我使用數據輪詢嘗試在今天早些時候找到解決方案,但我仍然不滿意。 你能想出一種在cart.php中設置事件監聽器的方式,它可以讓「自動更新」成爲可能嗎? Catalog.php通過AJAX發送產品ID來cart.php - >在cart.php事件監聽器觸發 - 通過PHP購物車內容>請求 - >包含所有產品(cart.php) – sdrubish

+0

酷我喜歡它,你 基本上更新DIV回答了我的問題。非常感謝,我希望這個鏈接可以幫助別人 [鏈接到長輪詢郵報](http://stackoverflow.com/questions/333664/simple-long-polling-example-code) – sdrubish

+0

很高興我能幫忙。如果您認爲我的回答涵蓋了您的所有觀點,請將其標記爲已接受(請點擊左側的打勾)並考慮對其進行上調(向上箭頭)。如果沒有,請讓我知道你需要的更多信息。實際上我已經在我的答案中找到了該頁面的鏈接,但也許我應該更清楚一點? (*做*) – Basic

0

最後我檢查了,只有用window.open打開的頁面(或用<a target="_blank">鏈接打開)纔可以相互交談。

所以在catalog.php通話cart = window.open('cart.php')cart包含打開它的頁面的窗口對象,所以你可以這樣做:

cart.document.getElementById('whatever').innerHTML = '<p> new content</p>'; 

獲取Windows交談彼此並排呈W/o一個打開另一個可以使用HTML5本地存儲,但這需要一些更高級的巫術。

+0

非常感謝您的回答。 使用HTML5是我的愛,我用服務器的想法發送的事件今天早些時候放棄和尋求幫助 我認爲本地存儲可以代替我的PHP代碼,基本上給用戶,我的車有相同的功能之前,但我可以」我想到了一種使用它的方式,可以獲得我正在尋找的東西。 你呢? – sdrubish

+0

您需要執行'setTimeout'並每隔1/2秒輪詢本地存儲對象以獲取新數據。然後將新數據添加到localstorage。 –

+0

這些傢伙做了它的[整篇文章(http://blog.fastmail.fm/2012/11/26/inter-tab-communication-using-local-storage/): –

相關問題