Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用AJAX调用函数_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 用AJAX调用函数

Javascript 用AJAX调用函数,javascript,jquery,ajax,Javascript,Jquery,Ajax,我不知道如何完全解释这一点,但我希望这会有意义 我做了一个函数,当篮子价值总额在某个阈值范围内时,该函数计算出符合免费交付条件的剩余支出金额 每次向篮子中添加产品时,篮子值都会使用AJAX进行更新 addtobasket按钮出现在AJAX生成的模式中 我需要在每次页面刷新时调用我的函数,也需要在每次单击AJAX生成的“添加到篮子”按钮时将产品添加到篮子中时调用我的函数。我试图用下面的代码来完成所有这些,但它似乎不能正常工作。其中一个问题是,当单击“添加到篮子”按钮时,事件会多次激发,另一个问题是

我不知道如何完全解释这一点,但我希望这会有意义

我做了一个函数,当篮子价值总额在某个阈值范围内时,该函数计算出符合免费交付条件的剩余支出金额

每次向篮子中添加产品时,篮子值都会使用AJAX进行更新

addtobasket按钮出现在AJAX生成的模式中


我需要在每次页面刷新时调用我的函数,也需要在每次单击AJAX生成的“添加到篮子”按钮时将产品添加到篮子中时调用我的函数。我试图用下面的代码来完成所有这些,但它似乎不能正常工作。其中一个问题是,当单击“添加到篮子”按钮时,事件会多次激发,另一个问题是篮子总数在事件发生后会更新,因此无法正确计算总数

谁能解释一下我该怎么收拾这一切

function totalBag() {
   var standardDeliveryLow = 49.99;
   var standardDeliveryHigh = 64.99;
   var expressDeliveryLow = 65.00;
   var expressDeliveryHigh = 99.99;
   var bagValue = $('#basket-value').text();
   var bagTotal = Number(bagValue.replace(/[^0-9\.-]+/g,""));

   if (bagTotal >= standardDeliveryLow && bagTotal <= standardDeliveryHigh) {
       var standardDifference = parseFloat(Math.round((standardDeliveryHigh - bagTotal) * 100) / 100).toFixed(2);
       $('<div class="delivery-message"><p>£'+ standardDifference +' from standar delivery</p></div>').insertAfter('.breadcrumbs');
   } else if (bagTotal >= expressDeliveryLow && bagTotal <= expressDeliveryHigh) {
      var expressDifference = parseFloat(Math.round((expressDeliveryHigh - bagTotal) * 100) / 100).toFixed(2); 
      $('<div class="delivery-message"><p>£'+ expressDifference + ' from express delivery</p></div>').insertAfter('.breadcrumbs');
   } else {
     return false;
   }
}

$(document).on('ajaxSuccess', function(e) { 
  $('[name="AddItemToBasket"]').on('click', function() {
    $('body').bind('ajaxSuccess.custom', function() {
     totalBag();
     //alert('this works');
     $(this).unbind('ajaxSuccess');
  });
 });
});


totalBag();
函数totalBag(){
var standardDeliveryLow=49.99;
var standardDeliveryHigh=64.99;
var expressDeliveryLow=65.00;
var expressDeliveryHigh=99.99;
var bagValue=$(“#篮值”).text();
var bagTotal=编号(bagValue.replace(/[^0-9\.-]+/g,”);

如果(bagTotal>=standardDeliveryLow&&bagTotal=expressDeliveryLow&&bagTotal编辑:修复了文本重复的问题。还添加了注释以便于进一步理解


在指定的链接上进行了检查,并尝试了以下修改的代码

根据@ADyson,我们已经删除了click事件,它正在修复多事件触发

关于您的另一个问题,总计在事件后更新,是的,HTML在触发ajaxSuccess后更新。因此,我们使用ajaxSuccess事件本身获取篮子金额,并在totalBag fn中使用它

它似乎正在工作。请确认:

//Adding empty div so that we can just update the value later
$(document).on('ready', function(){
    $('<div class="delivery-message"></div>').insertAfter('.breadcrumbs');
})

function totalBag(bagTotal) {
   var standardDeliveryLow = 49.99;
   var standardDeliveryHigh = 64.99;
   var expressDeliveryLow = 65.00;
   var expressDeliveryHigh = 99.99;
   //var bagValue = $('#basket-value').text();
   //var bagTotal = Number(bagValue.replace(/[^0-9\.-]+/g,""));

   //Using a variable to store the calculated amount with text
   var innerHTML = "";
   if (bagTotal >= standardDeliveryLow && bagTotal <= standardDeliveryHigh) {
       var standardDifference = parseFloat(Math.round((standardDeliveryHigh - bagTotal) * 100) / 100).toFixed(2);
       innerHTML= "<p>£"+ standardDifference +" from standar delivery</p>";
   } else if (bagTotal >= expressDeliveryLow && bagTotal <= expressDeliveryHigh) {
      var expressDifference = parseFloat(Math.round((expressDeliveryHigh - bagTotal) * 100) / 100).toFixed(2); 
      innerHTML= "<p>£"+ expressDifference +" from express delivery</p>";
   } else {
     return false;
   }
   //Updating the placeholder with new contents
   $(".delivery-message").html(innerHTML);
}

//Gets triggered after every Ajax Success.
//e -> event object, xhr -> The Ajax object which has request and response details, 
//settings -> The settings we used to trigger Ajax, including the request URL
$(document).on('ajaxSuccess', function(e, xhr, settings) { 
    //Checking if the request is of Adding Item to Basket
    if(settings.url.indexOf("AddItemToBasket") !== -1){
        //Getting the response and parsing it
        var resp = xhr.responseText;
        var respObj = JSON.parse(resp);
        //Checking if response is success i.e., item added to cart successfully
        if(respObj.success){
            //Getting the updated Basket value and calling totalBag
            var bagTotal = respObj.basket.subTotal;
            totalBag(bagTotal); 
        }       
    }

});
totalBag(0);
//添加空div以便我们以后可以更新该值
$(文档).on('ready',function(){
$('').insertAfter('.breadcrumbs');
})
功能totalBag(bagTotal){
var standardDeliveryLow=49.99;
var standardDeliveryHigh=64.99;
var expressDeliveryLow=65.00;
var expressDeliveryHigh=99.99;
//var bagValue=$(“#篮值”).text();
//var bagTotal=编号(bagValue.replace(/[^0-9\.-]+/g,”);
//使用变量以文本形式存储计算的金额
var innerHTML=“”;
如果(bagTotal>=standardDeliveryLow&&bagTotal=expressDeliveryLow&&bagTotal事件对象,xhr->具有请求和响应详细信息的Ajax对象,
//设置->我们用来触发Ajax的设置,包括请求URL
$(文档).on('ajaxSuccess',函数(e,xhr,settings){
//检查请求是否为将项目添加到购物篮
if(settings.url.indexOf(“AddItemToBasket”)!=-1){
//获取响应并对其进行解析
var resp=xhr.responseText;
var respObj=JSON.parse(resp);
//检查响应是否成功,即项目是否成功添加到购物车
如果(响应成功){
//获取更新的篮子值并调用totalBag
var bagTotal=respObj.basket.subTotal;
totalBag(bagTotal);
}       
}
});
总袋(0);

“其中一个问题是,当单击“添加到篮子”按钮时,事件会多次触发”。这是因为,
$(文档)。在('click',函数(e){
表示每次有人单击页面上的任何位置时,都会添加另一个“click”通过再次运行该代码,将事件处理程序添加到AddItemToBasket元素。因此,如果不小心,您可能会有几十个处理程序。在元素上设置事件处理程序不会删除以前定义的处理程序,它只会继续添加更多处理程序。您是指
$(document).ready(function(){
(即,在加载DOM时运行此代码一次)?而且.bind()在几年前的jQuery 1.7中被.on()取代(您在其他地方使用过),在3.0中被弃用。实际上,没有很好的理由使用它。它位于一个文档就绪函数中,尽管我没有包含它,但对于混淆表示歉意。在这种情况下,您可以删除
$(文档).on('click',函数(e){
我想完全是这样。单击add按钮,是否有Ajax调用?或者唯一的Ajax调用是显示模式?此解决方案工作得非常好。非常感谢!我看到ajaxSuccess回调是这样工作的,但我无法理解它或如何将其应用到我的站点。如果您能解释,我将非常感谢。再次感谢!Alth尽管如此,它在每次添加项时都会执行该事件,这意味着每次都会将jquery插入DOM。有没有办法让它在每次被激发时只更新相同的总数?是的。这应该是可能的。在文档准备就绪时,添加传递消息div。在totalBag调用时,单独更新内容。如果遇到问题,请尝试告诉我ny问题。@决心学习已修复了文本复制的问题。还添加了注释以加深理解。同样,这非常有效,注释对理解它有很大帮助。感谢您的所有工作!