我在更改选择选项时使用javascript函数提交包含选择框的表单。如果所选的值设置为某个值(在这种情况下为“new cart”,因为这是针对电子商务网站),则会触发javascript提示框。 javascript在选项更改时成功提交表单,当选择特定值时,它会显示提示框,但是,它会显示提示框两次,我不明白为什么。
以下是我的选择框的代码。它是一个类功能。它工作正常。
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']))代码,如果选择了新的购物车选项,则调用第3个代码段中的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);
}
希望这更清楚。如果我还需要进一步完善,请告诉我。