我在使用jquery加载功能时遇到问题


I am having an issue with jquery load function

我有一个购物车,可以通过ajax调整或删除数量或购物车项目,因此页面不必刷新即可反映更改等。

我有一个外部shopping_cart.js来处理所有购物车js方面的事情。当我调整购物车项目数量时,我在 ajax 成功函数上使用 DOM innerHTML 来反映对用户的更改,但为了完全删除购物车项目,我使用 jquery load 函数将update_cart.php文件加载到容器div 元素中,当用户单击删除/添加/减去购物车项目时,该元素在鼠标悬停购物车快速链接中显示更新的购物车内容。

由于我使用 jquery.load 加载cart_update.php脚本,我必须在cart_update.php脚本中包含外部shopping_cart.js,以便在加载脚本时所有 JS 正常工作,但我遇到的问题是,当我将 js 文件包含在cart_update.php并使用 jquery 加载它时,当我单击任何添加/减去/删除每个产品的按钮,并在每次单击时复合每个循环。

例如,当我第一次单击添加数量时,

购物车数量将添加一件额外的项目,当我再次单击时,它将循环浏览 2 个附加项目,然后是 4、8、16 等。但是,如果我将外部 js 文件放在主 php 页面文件中而不是放在 cart_update 脚本中,它在页面刷新后正常工作并且不会循环,尽管当我尝试删除购物车项目时,显然 javascript 不起作用 jquery.load,因为它无法访问 js 文件,因为它不包含在cart_update.php

真的不确定我在这里哪里出错了。我只是一个新手程序员

cart_update.php

<!-- Display cart contents -->
<script src="js/shopping_cart.js"></script>
<?php 
// Call session start when the script is loaded via jquery.load
if (isset($_SESSION)){
} else {
    session_start();
}
require_once "config.php";
$session_id = session_id();
$sql = "SELECT * FROM shopping_cart WHERE session_id='$session_id'";
$stmt = $PDOconnection->prepare($sql);
$stmt->execute();
$rowCount = $stmt->rowCount();
if($rowCount < 1 ){
    echo "Your cart is empty.";
} else {
    $points = 0;
    while($result = $stmt->fetch(PDO::FETCH_ASSOC)){
        $ui          = $result['ui'];
        $item_points = $result['item_points'];
        // Display cart item name, price, quantity and amount of points earned
        echo "<br>" . $result['item_name'] . " $" . number_format($result['item_price'],2) . " Qty: " . $result['item_quantity'] . " <a href='#' class='remove_item' data-ui='$ui'> X </a><br>";  
        $points = $points + number_format($item_points, 1);
    }
    echo "<hr />";
    if (isset($_SESSION['user_name'])){
        echo "You have earned $points points with this purchase!";
    } else {
        echo "Sign up to recieve $points points with this purchase! <a href'#'>What's this?</a>";
    }
    echo "<hr />";
    echo "<a href='cart.php'>Check Out</a>";
}
?>

shopping_cart.js

function cart_data(cartData) {
    // Get data values
    var $item_stock_type  = cartData.getAttribute('data-stock-type');
    var $item_ui          = cartData.getAttribute('data-stock-ui');
    // Set value as one. As it's signle qty when adding to cart from the product list   
    var $item_qty = 1;
    $(document).ready(function(e){
        // Send data for processing in shopping_cart.php
        $.ajax({
            url: "php/shopping_cart.php",
            data: { item_stock_type: $item_stock_type, item_ui: $item_ui, item_qty: $item_qty },
            dataType: "json",
            type: "post",
            success: function(data, response){
                document.getElementById("cart_total").innerHTML = data.cart_total;
                document.getElementById("shoppingcart_link_quantity").innerHTML = data.cart_qty + '<br />';
                switch (data.success)
                {
                case 0:
                    modal({
                        type: 'error',
                        title: 'Ooops',
                        text: data.error_message,
                        center: true,
                        animate: true,                  
                    });
                    break;
                case 1:
                    modal({
                        type: 'alert',
                        title: '',
                        text: data.user_message,
                        center: true,
                        animate: true,
                        autoclose: true,
                    });  
                    break;
                case 2:
                    modal({
                        type: 'alert',
                        title: '',
                        text: data.user_message,
                        center: true,
                        animate: true,
                    });   
                    break;
                }
                // Update Shopping cart contents
                $("#shopping_cart_container").load("php/update_cart.php");              
            },
            error: function(jqXHR, status, error){
                var $jxr = jqXHR;
                var $status = status;
                var $error = error;
                // Display error message to user
                modal({
                 type: 'error',
                 title: 'Ooops!',
                 text: 'An Error has occured: <br><br>' + jqXHR + ": " + status + "; " + error,
                 center: true,
                 animate: true,
                });
                // Log error message
            }
        });
    });
}
// Remove item from shopping cart quick link 
$(document).ready( function(){
    // Remove item from cart
    $(".remove_item").click( function(e){
        e.preventDefault();
        var $ui = $(this).attr("data-ui");
        $.ajax({
            url: 'php/ajax.php',
            data: { remove_cart_item: $ui },
            dataType: "json",
            type: "post",
            success: function(data, response){
                document.getElementById("cart_total").innerHTML = data.cart_total;
                document.getElementById("shoppingcart_link_quantity").innerHTML = data.cart_qty + '<br />';
                switch (data.success)
                {
                case 0:
                    modal({
                        type: 'error',
                        title: 'Ooops',
                        text: data.error_message,
                        center: true,
                        animate: true,              
                    });
                }
                // Update Shopping cart quick link contents
                $("#shopping_cart_container").load("php/update_cart.php");              
            },
            error: function(jqXHR, status, error){
                var $jxr = jqXHR;
                var $status = status;
                var $error = error;
                // Display error message to user
                modal({
                 type: 'error',
                 title: 'Ooops!',
                 text: 'An Error has occured: <br><br>' + jqXHR + ": " + status + "; " + error,
                 center: true,
                 animate: true,
                });
                // Log error message
            }
        });
    });
});
// Add qty to shopping cart main page 
$(document).ready( function(){
    $(".add_item").click( function(e){
        e.preventDefault();
        var $ui = $(this).attr("data-ui");
        $.ajax({
            url: 'php/ajax.php',
            data: { add_cart_item: $ui },
            dataType: "json",
            type: "post",
            success: function(data, response){
                switch (data.success)
                {
                case 0:
                    // No more stock. Notify user
                    modal({
                        type: 'error',
                        title: 'Sorry',
                        text: data.error_message,
                        center: true,
                        animate: true,
                    });
                break;
                case 1:
                    // Update item qty
                    var $id = data.element_id;
                    document.getElementById("cart_total").innerHTML = data.cart_total;
                    document.getElementById("shoppingcart_link_quantity").innerHTML = data.cart_qty + '<br />';
                    document.getElementById($id).innerHTML = data.item_qty;
                    // Update Shopping cart quick link contents
                    $("#shopping_cart_container").load("php/update_cart.php");
                break;
                }           
            },
            error: function(jqXHR, status, error){
                var $jxr = jqXHR;
                var $status = status;
                var $error = error;
                // Display error message to user
                modal({
                 type: 'error',
                 title: 'Ooops!',
                 text: 'An Error has occured: <br><br>' + jqXHR + ": " + status + "; " + error,
                 center: true,
                 animate: true,
                });
                // Log error message
            }
        });
    });
});
// Minus qty to shopping cart main page 
$(document).ready( function(){
    $(".minus_item").click( function(e){
        e.preventDefault();
        var $ui = $(this).attr("data-ui");
        $.ajax({
            url: 'php/ajax.php',
            data: { minus_cart_item: $ui },
            dataType: "json",
            type: "post",
            success: function(data, response){

                switch (data.success)
                {
                case 0:
                break;
                case 1:
                    // Update item qty
                    var $id = data.element_id;
                    document.getElementById("cart_total").innerHTML = data.cart_total;
                    document.getElementById("shoppingcart_link_quantity").innerHTML = data.cart_qty + '<br />';
                    document.getElementById($id).innerHTML = data.item_qty;
                    // Update Shopping cart quick link contents
                    $("#shopping_cart_container").load("php/update_cart.php");
                break;
                }           
            },
            error: function(jqXHR, status, error){
                var $jxr = jqXHR;
                var $status = status;
                var $error = error;
                // Display error message to user
                modal({
                 type: 'error',
                 title: 'Ooops!',
                 text: 'An Error has occured: <br><br>' + jqXHR + ": " + status + "; " + error,
                 center: true,
                 animate: true,
                });
                // Log error message
            }
        });
    });
});

您将事件侦听器附加到 dom 元素,当您用 load 覆盖它们时,这些元素会被删除。

若要修复,请使用事件委派附加到不会被删除的父元素。

例如,替换:

 $(".remove_item").click( function(e){...

跟:

 $("#shopping_cart_container").on('click','.remove_item', function(e){...

更多信息: http://api.jquery.com/on/

  1. 只将你的javascript添加到页面一次,不要在每个ajax响应时发送它。这样,您就不会将多个事件处理程序附加到添加按钮。

  2. 在脚本中更改将删除项处理程序添加到$(document).on ("click", ".minus_item", function(e){...})的方式,否则每次从 ajax 响应替换篮子内容时都会丢失事件处理程序。

每次定义cart_data函数时,您最终都会在相同的元素上发生多个事件。一种解决方案是简单地重新分配它(如果存在(。

所以取而代之的是这个

function cart_data(cartData) {
     ...
}

你可以这样做

var cart_data = cart_data || function(cartData) {
    ...
}