2013-04-12 92 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/): –

相关问题