我是一个新手所以请原谅我的无知。
我有一个带有php购物车的网站,当有东西被添加到购物车时,它会刷新到购物车页面。我想修改它,以便在添加产品时,购物车在后台更新,产品页面不会刷新,但会更新具有唯一ID的各种div中的html。
我已经成功实现了这个目标,但我确信必须有一个更简单的方法,因为我的解决方案涉及一个遍历产品页面上所有表单的循环,而不仅仅是从提交的表单中更新div。
这是我的JavaScript,它位于产品页面的<head>
标记内:
<script>
$(document).ready(function(){
$("[id^=ectform]").ajaxForm({ // any form id beginning with ectform
success:function(){
$.ajaxSetup({ cache: false });
$("#div1").load("jsrefresh.php"); // update html in div in minicart
for (i = 0; i < count; i++) { // count holds the number of forms on the page
var d = "#glc" + i; // div id to update
var f ="#gld" + i; // another div id to update
var e = eval("z" + i); // product id
$(f).html('loading...').load("jsrefreshincart.php",{ prodynum: e, divno: d});
};
}
});
});
</script>
该脚本使用ajaxForm等待成功提交任何具有以ectform开头的Id的表单。成功后,表单将提交到购物车脚本,更新购物车内容,然后使用ajax .load调用jsrefresh.php,它将更新后的html回显到显示在屏幕顶部的迷你购物车中的div 。然后(这是需要正确执行的位)jsrefreshincart.php在循环中调用(变量count保存页面上的表单总数),它更新页面上所有表单内所有div中的html以及有关如何购物车中有很多物品,价格是多少 有没有办法在没有循环的情况下执行此操作,因为只需要更新提交的表单中的div?
答案 0 :(得分:1)
这里的主要问题不是你有一个循环,而是你有一个服务器调用。处理这个的最好方法是改变{{1}的方式处理来自服务器的调用。而不是在循环中多次调用 循环,收集所有数据并在循环外部进行单次调用。
我不认为这是jQuery Form插件可以处理的东西;相反,你可能不得不写一些自定义代码(如下所示):
jsrefreshincart.php
您的<script>
$(document).ready(function() {
$("[id^=ectform]").on('submit', function(e) {
e.preventDefault();
$('[id^=gld]').html('loading...'); // Trigger all loading messages simultaneously
var formNums = [];
for (i = 0; i < count; i++) {
formNums.push(i);
}
$.post({
$(this).attr('action'), // Where to send the form action
formNums: formNums, // The data to send when submitting the Ajax call
refreshCartData // The callback used to refresh the page
});
});
});
// Called automatically when the server responds with data
function refreshCartData(data) {
// Loop through all forms and update them
for (var i = 0; i < data.length; i++) {
// Update HTML
$('#gld' + data[i].formNum).html(data[i].cartHTML);
}
}
</script>
应该返回所有这些的数据。例如:
jsrefreshincart.php
其他一些建议:
<?php
// Used to load the cart data - I'm sure you have something similar
require_once('cart.php');
// Send everything back as JSON
header('Content-type: application/json');
// Initialize the data to send back
$data = array();
// Iterate over all data send to the server
foreach ($_POST['formNums'] as $formNum) {
$data[] = array(
// The unique ID for the form number
'formNum' => $formNum,
// Again, however you get the view data for your cart line items works fine
'cartHTML' => Cart::getCartHTML($formNum)
);
}
// Spit out the JSON data
echo json_encode($data);
表单&#34;之外,请考虑使用不同的方式来跟踪数据。 - 课程也可以工作count
开头的任何内容都是捕获此功能的表单;如果不是这种情况,上述解决方案的某些部分可能没有意义答案 1 :(得分:0)
在看了Dykotomee(谢谢)的建议之后,它让我知道如何在没有循环的情况下修改我的脚本:
<script>
$(document).ready(function(){ // when DOM is ready
$("[id^=ectform]").on('submit', function(e) { // on submission of any form with id beginning "ectform"
e.preventDefault(); // prevent the form itself submitting the data
var subformid = $(this).attr('id'); // set variable with the id of the submitted form
$(this).ajaxSubmit({ // submit the form via ajax which will add the product to the cart
success:function(){ //on successful submission of the form
$.ajaxSetup({ cache: false }); // turn off cache so the updates will refresh on all browsers
$("#div1").load("jsrefresh.php"); // load div in mini cart with new updated cart quantity
var str = subformid.replace("ectform", ""); // trim subformid to leave just the end digits and call this variable str
var d = "#glc" + str; // not important for purposes of explanation
var f ="#gld" + str; // f is the id of the div in the submitted form to be updated
var e = eval("z" + str); // e is the product number
$(f).html('Adding item to Cart...').load("jsrefreshincart.php",{ prodynum: e, divno: d}); // send data to jsrereshincart.php and load updated html into div f.
}
});
});
});
</script>
我使用了ajaxSubmit而不是ajaxForm,这允许我使用$("[id^=ectform]").on('submit', function(e) {.......
触发表单的提交
然后,我能够捕获用var subformid = $(this).attr('id');
提交的表单的ID
现在我有了提交表单的id,我能够使用ajax .load将更新的购物车HTML以特定形式提供给div,而不是循环遍历所有表单并逐个更新。
该脚本现在每个表单提交总共只有2个服务器调用。当产品页面上最多显示25个产品/表单时,我之前的脚本最多可拨打50个电话。
我可以修改这个脚本和php脚本,只需一次调用即可完成所有操作,但网站上的其他页面没有产品,只有迷你购物车,因此更容易将脚本分开。