0

我正在使用JavaScript函数在更改选择选项时提交包含选择框的表单。如果所选值设置为某个值(在本例中为“新购物车”,因为这是针对电子商务网站),这将触发一个 javascript 提示框。The javascript is successfully submitting the form upon option change, and when the specific value is selected, it does display the prompt box, however, it displays the prompt box twice, and I have no idea why.

这是我的选择框的代码。它在一个类函数中。它工作正常。

public function printCartsList($id = null, $mini = "true"){ 

    print '<form method="POST" name="cartSelectForm" action="home.php">';

        print '<select name="cartList" id="' . $id . '" data-mini="' . $mini . '" onchange="submitCartForm()" data-icon="false">';

            print '<option value="newuniquecartid1234567890">*** New Cart ***</option>';

            for($i = 0; $i < sizeof($this->savedCarts); $i++){
                if(isset($_SESSION['activeCart']) && $_SESSION['activeCart'] != "new cart"){
                    $cart = new Cart();
                    $cart = unserialize($_SESSION['activeCart']);
                    if($cart->GetCartName() == $this->savedCarts[$i]->GetCartName()){
                        print '<option value="' . $this->savedCarts[$i]->GetCartName() . '" selected>' . $this->savedCarts[$i]->GetCartName() . '</option>';
                    }
                    else{
                        print '<option value="' . $this->savedCarts[$i]->GetCartName() . '">' . $this->savedCarts[$i]->GetCartName() . '</option>';
                    }
                }
                else{
                    print '<option value="' . $this->savedCarts[$i]->GetCartName() . '">' . $this->savedCarts[$i]->GetCartName() . '</option>';
                }
            }

        print '</select>';

    print '</form>';

}

这是我在不同文件中的javascript。

//Display input box
function DisplayInputBox(){
    var today = new Date();
    var dd = today.getDate();
    var mm = today.getMonth()+1; //January is 0!

    var yyyy = today.getFullYear();
    if(dd<10){
        dd='0'+dd;
    } 
    if(mm<10){
        mm='0'+mm;
    } 
    today = mm+'/'+dd+'/'+yyyy;

    var name = prompt("Enter a name for this cart", today);

    if(name != null){

        // Set a cookie containing the name of the new cart
        setCookie("newCartName",name,1);

    }
}


function submitCartForm(){
    var cookie = getCookie("newCartName");
    if(cookie == null){
        document.cartSelectForm.submit();
    }
}   


// Create a cookie object
function setCookie(c_name,value,exdays)
{
    var exdate=new Date();
    exdate.setDate(exdate.getDate() + exdays);
    var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
    document.cookie=c_name + "=" + c_value;
}

// Get a cookie object
function getCookie(c_name)
{
    var c_value = document.cookie;
    var c_start = c_value.indexOf(" " + c_name + "=");
    if (c_start == -1)
    {
        c_start = c_value.indexOf(c_name + "=");
    }
    if (c_start == -1)
    {
        c_value = null;
    }
    else
    {
        c_start = c_value.indexOf("=", c_start) + 1;
        var c_end = c_value.indexOf(";", c_start);
        if (c_end == -1)
        {
            c_end = c_value.length;
        }
        c_value = unescape(c_value.substring(c_start,c_end));
    }
    return c_value;
}

在这里,我有 2 个功能。newCart 函数是调用显示提示框的 javascript 函数的地方。我包含了另一个函数 addToCart(),因为这个函数在不同的时间调用 newCart 函数,我想提一下,当 addToCart 函数调用 newCart() 函数时,它工作正常。提示框只显示一次,我从提示框中得到了正确的值。除了指出这一点,您可以忽略该函数,因为它不会以任何其他方式与 newCart 交互。

function newCart(){
    $cart = new Cart();
    $customer = new Customer();

/************could this be the problem?*************/
    echo "<script>DisplayInputBox();</script>";

    if(isset($_SESSION['customer'])){
        $customer = unserialize($_SESSION['customer']);
    }

    $cart->SetCartName("newCart");

    $customer->AddCart($cart);

    $_SESSION['customer'] = serialize($customer);
    $_SESSION['activeCart'] = serialize($cart);

    //echo '<meta http-equiv="refresh" content="0">';
}

function addToCart($item){

    $cart = new Cart();
    $customer = new Customer();
    $newCart = false;

    if(!isset($_SESSION['activeCart'])){
        $_SESSION['activeCart'] = "new cart";
        newCart();
        $newCart = true;
    }
    elseif($_SESSION['activeCart'] != "new cart"){
        $cart = unserialize($_SESSION['activeCart']);
    }
    else{
        newCart();
        $newCart = true;
    }

    $cart->AddToItems($item);

    if(isset($_SESSION['customer'])){
        $customer = unserialize($_SESSION['customer']);
    }

    if($_SESSION['activeCart'] != "new cart"){
        $customer->UpdateCart($cart);
    }
    else{
        $customer->AddCart($cart);
    }

    if($customer->GetLoggedInStatus() > 0){
        //$customer->SaveCarts();
    }

    $_SESSION['activeCart'] = serialize($cart);
    $_SESSION['customer'] = serialize($customer);

    if($newCart == true){
        echo '<meta http-equiv="refresh" content="0">';
    }

}

这是我最后剪掉的代码。这是我在使用 javascript 提交表单后处理逻辑的地方,也是我在 newCart 函数完成时处理逻辑的地方。在这段代码片段的底部,在 if(isset($_SESSION['customer'])) 内部是我打印出我的选择框的地方。然后转到我的第一个代码片段,其中 onchange() 我在第二个代码片段中调用 submitCartForm() javascript 函数。之后,执行下面的 if(isset($_POST['cartList'])) 代码,如果选择了新的购物车选项,则在第三个代码片段中调用 newCart 函数。然后在第二个代码片段中调用 DisplayInputBox() javascript 函数。从这一点开始,该函数设置了一个 cookie,在下面的代码片段中进行了检查。在此过程中,提示框显示两次,

                       <?php

                            if(isset($_COOKIE['newCartName'])){
                                $customer = new Customer();
                                $cart = new Cart();
                                if(isset($_SESSION['customer'])){
                                    $customer = unserialize($_SESSION['customer']);
                                }
                                else{
                                    $customer->SetLoggedInStatus = 0;
                                }
                                if(isset($_SESSION['activeCart'])){
                                    if($_SESSION['activeCart'] != "new cart"){
                                        $cart = unserialize($_SESSION['activeCart']);
                                        $cart->SetCartName($_COOKIE['newCartName']);
                                    }
                                }

                                $success = $customer->UpdateCart($cart);

                                if($success == false){
                                    $customer->AddCart($cart);
                                }

                                $_SESSION['activeCart'] = serialize($cart);
                                $_SESSION['customer'] = serialize($customer);

                                setcookie('newCartName',"",time()-3600);

                            }

                            if(isset($_POST['cartList'])){
                                $customer = new Customer();
                                if(isset($_SESSION['customer'])){
                                    $customer = unserialize($_SESSION['customer']);
                                }
                                $cartArray = array();
                                $cartArray = $customer->GetSavedCarts();

                                if($_POST['cartList'] == "newuniquecartid1234567890"){
                                    unset($_POST['cartList']);
                                    newCart();
                                }
                                else{   
                                    for($i = 0; $i < sizeof($cartArray); $i++){
                                        if($cartArray[$i]->GetCartID() == $_POST['cartList']){
                                            $_SESSION['activeCart'] = serialize($cartArray[$i]);
                                        }
                                    }
                                }
                            }


                            if(isset($_SESSION['customer'])){
                                $customer = new Customer();
                                $customer = unserialize($_SESSION['customer']);
                                $customer->printCartsList("select-cart","true");
                            }
                            else{
                                $customer = new Customer();
                                $customer->printCartsList("select-cart","true");
                            }
                        ?>

我不知道为什么会这样。就像我说的,当 addToCart 函数调用 newCart 时不会发生这种情况,只有在我提交选择框表单时才会发生。我将不胜感激您能提供的任何帮助。我试着彻底,但这里有很多东西。如果我能澄清任何事情,请告诉我。谢谢!

编辑

这条线以下的所有内容都是上面内容的浓缩版本。我将保留上面的内容以供参考,但下面是流线型逻辑。

这是我的选择框。

    print '<form method="POST" name="cartSelectForm" action="home.php">';

        print '<select name="cartList" id="' . $id . '" data-mini="' . $mini . '" onchange="submitCartForm()" data-icon="false">';

            print '<option value="newuniquecartid1234567890">*** New Cart ***</option>';


        print '</select>';

    print '</form>';

当它的值被改变时,它会触发这个 javascript 函数:

function submitCartForm(){
    var cookie = getCookie("newCartName");
    if(cookie == null){
        document.cartSelectForm.submit();
    }
}   

此 if 语句捕获它(已删除不必要的代码):

if(isset($_POST['cartList'])){
    if($_POST['cartList'] == "newuniquecartid1234567890"){
        unset($_POST['cartList']);
        newCart();
    }
}

这会调用 newCart 函数(删除了不必要的代码,上面的完整函数)

function newCart(){

    echo "<script>DisplayInputBox();</script>"; 

}

这将调用 DisplayInputBox javascript 函数(删除了不必要的代码)。这是显示提示的地方。

function DisplayInputBox(){

    // today is defined in the full version of this code (see above if needed)
    var name = prompt("Enter a name for this cart", today);

    if(name != null){

        // Set a cookie containing the name of the new cart
        setCookie("newCartName",name,1);

    }
}

上面的 DisplayInputBox javascript 函数设置了一个在此处检查的 cookie(代码已被删除)(基本上,这里唯一相关的是我取消了先前设置的 cookie。可能不太重要。

if(isset($_COOKIE['newCartName'])){

    $success = $customer->UpdateCart($cart);

    if($success == false){
        $customer->AddCart($cart);
    }

    setcookie('newCartName',"",time()-3600);

}

希望这更清楚。如果我还需要进一步完善,请告诉我。

4

0 回答 0