gpt4 book ai didi

javascript for循环获取订单详细信息

转载 作者:行者123 更新时间:2023-11-30 18:01:35 25 4
gpt4 key购买 nike

我想在这个 nopcart.js 文件中放置一个 for 循环,这样我就可以将订单的详细信息保存为一个字符串。目前,它正在将订单的所有详细信息输出到表格中以显示结帐页面。我只想要数组信息

fields = new Array;
fields[0] = database.substring( 0, Token0 ); // Product ID
fields[1] = database.substring( Token0+1, Token1 ); // Quantity
fields[2] = database.substring( Token1+1, Token2 ); // Price
fields[3] = database.substring( Token2+1, Token3 ); // Product Name/Description
fields[4] = database.substring( Token3+1, Token4 ); // Shipping Cost
fields[5] = database.substring( Token4+1, database.length ); //Additional Information

循环并保存为一个字符串。然后将所有订单详细信息放在一个字符串上,然后我可以将其保存到 php 中的文本文件中。 (我们目前不使用 SQL。

到目前为止,我的尝试只获得了购物车中的最后一项,或者循环也在编写 html 表格代码。这是针对大学作业的,我们不打算编辑基本的购物车功能,但我认为将客户和订单详细信息保存到文本文件会更有用。

//---------------------------------------------------------------------||
// FUNCTION: CheckoutCart ||
// PARAMETERS: Null ||
// RETURNS: Product Table Written to Document ||
// PURPOSE: Draws current cart product table on HTML page for ||
// checkout. ||
//---------------------------------------------------------------------||
function CheckoutCart( ) {
var iNumberOrdered = 0; //Number of products ordered
var fTotal = 0; //Total cost of order
var fTax = 0; //Tax amount
var fShipping = 0; //Shipping amount
var strTotal = ""; //Total cost formatted as money
var strTax = ""; //Total tax formatted as money
var strShipping = ""; //Total shipping formatted as money
var strOutput = ""; //String to be written to page
var bDisplay = true; //Whether to write string to the page (here for programmers)
var strPP = ""; //Payment Processor Description Field

iNumberOrdered = GetCookie("NumberOrdered");
if ( iNumberOrdered == null )
iNumberOrdered = 0;

if ( TaxByRegion ) {
QueryString_Parse();
fTax = parseFloat( QueryString( OutputOrderTax ) );
strTax = moneyFormat(fTax);
}

if ( bDisplay )
strOutput = "<TABLE CLASS=\"nopcart\"><TR>" +
"<TD CLASS=\"nopheader\"><B>"+strILabel+"</B></TD>" +
"<TD CLASS=\"nopheader\"><B>"+strDLabel+"</B></TD>" +
"<TD CLASS=\"nopheader\"><B>"+strQLabel+"</B></TD>" +
"<TD CLASS=\"nopheader\"><B>"+strPLabel+"</B></TD>" +
(DisplayShippingColumn?"<TD CLASS=\"nopheader\"><B>"+strSLabel+"</B></TD>":"") +
"</TR>";

for ( i = 1; i <= iNumberOrdered; i++ ) {
NewOrder = "Order." + i;
database = "";
database = GetCookie(NewOrder);

Token0 = database.indexOf("|", 0);
Token1 = database.indexOf("|", Token0+1);
Token2 = database.indexOf("|", Token1+1);
Token3 = database.indexOf("|", Token2+1);
Token4 = database.indexOf("|", Token3+1);

fields = new Array;
fields[0] = database.substring( 0, Token0 ); // Product ID
fields[1] = database.substring( Token0+1, Token1 ); // Quantity
fields[2] = database.substring( Token1+1, Token2 ); // Price
fields[3] = database.substring( Token2+1, Token3 ); // Product Name/Description
fields[4] = database.substring( Token3+1, Token4 ); // Shipping Cost
fields[5] = database.substring( Token4+1, database.length ); //Additional Information



fTotal += (parseInt(fields[1]) * parseFloat(fields[2]) );
fShipping += (parseInt(fields[1]) * parseFloat(fields[4]) );
if ( !TaxByRegion ) fTax = (fTotal * TaxRate);
strTotal = moneyFormat(fTotal);
if ( !TaxByRegion ) strTax = moneyFormat(fTax);
strShipping = moneyFormat(fShipping);

if ( bDisplay ) {
strOutput += "<TR><TD CLASS=\"nopentry\">" + fields[0] + "</TD>";

if ( fields[5] == "" )
strOutput += "<TD CLASS=\"nopentry\">" + fields[3] + "</TD>";
else
strOutput += "<TD CLASS=\"nopentry\">" + fields[3] + " - <I>"+ fields[5] + "</I></TD>";

strOutput += "<TD CLASS=\"nopentry\">" + fields[1] + "</TD>";
strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[2]) + "/ea</TD>";

if ( DisplayShippingColumn ) {
if ( parseFloat(fields[4]) > 0 )
strOutput += "<TD CLASS=\"nopentry\">"+ MonetarySymbol + moneyFormat(fields[4]) + "/ea</TD>";
else
strOutput += "<TD CLASS=\"nopentry\">N/A</TD>";
}

strOutput += "</TR>";
}

if ( AppendItemNumToOutput ) {
strFooter = i;
} else {
strFooter = "";
}
if ( PaymentProcessor != '' ) {
//Process description field for payment processors instead of hidden values.
//Format Description of product as:
// ID, Name, Qty X
strPP += fields[0] + ", " + fields[3];
if ( fields[5] != "" )
strPP += " - " + fields[5];
strPP += ", Qty. " + fields[1] + "\n";
} else {
strOutput += "<input type=hidden name=\"" + OutputItemId + strFooter + "\" value=\"" + fields[0] + "\">";
strOutput += "<input type=hidden name=\"" + OutputItemQuantity + strFooter + "\" value=\"" + fields[1] + "\">";
strOutput += "<input type=hidden name=\"" + OutputItemPrice + strFooter + "\" value=\"" + fields[2] + "\">";
strOutput += "<input type=hidden name=\"" + OutputItemName + strFooter + "\" value=\"" + fields[3] + "\">";
strOutput += "<input type=hidden name=\"" + OutputItemShipping + strFooter + "\" value=\"" + fields[4] + "\">";
strOutput += "<input type=hidden name=\"" + OutputItemAddtlInfo + strFooter + "\" value=\"" + fields[5] + "\">";

}

}

if ( bDisplay ) {
strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSUB+"</B></TD>";
strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTotal + "</B></TD>";
strOutput += "</TR>";

if ( DisplayShippingRow ) {
strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSHIP+"</B></TD>";
strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strShipping + "</B></TD>";
strOutput += "</TR>";
}

if ( DisplayTaxRow || TaxByRegion ) {
strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strTAX+"</B></TD>";
strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTax + "</B></TD>";
strOutput += "</TR>";
}

strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strTOT+"</B></TD>";
strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + moneyFormat((fTotal + fShipping + fTax)) + "</B></TD>";
strOutput += "</TR>";

strOutput += "</TABLE>";


if ( PaymentProcessor == 'an') {
//Process this for Authorize.net WebConnect
strOutput += "<input type=hidden name=\"x_Version\" value=\"3.0\">";
strOutput += "<input type=hidden name=\"x_Show_Form\" value=\"PAYMENT_FORM\">";
strOutput += "<input type=hidden name=\"x_Description\" value=\""+ strPP + "\">";
strOutput += "<input type=hidden name=\"x_Amount\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
} else if ( PaymentProcessor == 'wp') {
//Process this for WorldPay
strOutput += "<input type=hidden name=\"desc\" value=\""+ strPP + "\">";
strOutput += "<input type=hidden name=\"amount\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
} else if ( PaymentProcessor == 'lp') {
//Process this for LinkPoint
strOutput += "<input type=hidden name=\"mode\" value=\"fullpay\">";
strOutput += "<input type=hidden name=\"chargetotal\" value=\""+ moneyFormat((fTotal + fShipping + fTax)) + "\">";
strOutput += "<input type=hidden name=\"tax\" value=\""+ MonetarySymbol + strTax + "\">";
strOutput += "<input type=hidden name=\"subtotal\" value=\""+ MonetarySymbol + strTotal + "\">";
strOutput += "<input type=hidden name=\"shipping\" value=\""+ MonetarySymbol + strShipping + "\">";
strOutput += "<input type=hidden name=\"desc\" value=\""+ strPP + "\">";
} else {
strOutput += "<input type=hidden name=\""+OutputOrderSubtotal+"\" value=\""+ MonetarySymbol + strTotal + "\">";
strOutput += "<input type=hidden name=\""+OutputOrderShipping+"\" value=\""+ MonetarySymbol + strShipping + "\">";
strOutput += "<input type=hidden name=\""+OutputOrderTax+"\" value=\""+ MonetarySymbol + strTax + "\">";
strOutput += "<input type=hidden name=\""+OutputOrderTotal+"\" value=\""+ MonetarySymbol + moneyFormat((fTotal + fShipping + fTax)) + "\">";
}
}

document.write(strOutput);


document.close();
}

谢谢你们的帮助,你们已经帮了我不少忙了。我迫不及待地想等到我对编程更加熟悉并且可以立即解决这些问题。

最佳答案

更新

根据我们的讨论,这是您正在寻找的代码(或类似的代码)吗?

// Return a string containing all of the items in the cart,
// one line per item with a newline character after each line,
// and the fields in each line separated by | characters.
function getCartString() {
var result = '',
count = GetCookie('NumberOrdered') || 0;
for( var i = 1; i <= count; i++ ) {
result += GetCookie( 'Order.' + i ) + '\n';
}
return result;
}

这段代码有什么不明白的地方吗?我很乐意解释。它生成的格式是您正在寻找的格式吗?如果不是,请详细描述您想要的格式,生成它应该是微不足道的 - 现在来自 nopcart.js 的糟糕代码fine 已经消失了,所以它不会让我们所有人感到困惑。

原始答案

你写的代码太多了!当你有这么多重复时,很难遵循,而且很容易出错。

编辑: 我开的玩笑!这不是你写的代码,也不是你的教授或任何类似的人写的代码,它是“动态 HTML”时代遗留下来的一些可怕的脚本。尽管如此,对于确实必须处理这样的脚本的任何人来说,以下内容可能会提供一两个有用的提示。 :-)

您现在最需要关注的是如何简化您的代码。两个领域特别突出:

  1. 尽可能使用内置的 JavaScript 功能而不是手动编码。
  2. 每当你发现自己在重复一段代码时,就把它变成一个函数。

这是一个例子:

database = "";
database = GetCookie(NewOrder);

Token0 = database.indexOf("|", 0);
Token1 = database.indexOf("|", Token0+1);
Token2 = database.indexOf("|", Token1+1);
Token3 = database.indexOf("|", Token2+1);
Token4 = database.indexOf("|", Token3+1);

fields = new Array;
fields[0] = database.substring( 0, Token0 ); // Product ID
fields[1] = database.substring( Token0+1, Token1 ); // Quantity
fields[2] = database.substring( Token1+1, Token2 ); // Price
fields[3] = database.substring( Token2+1, Token3 ); // Product Name/Description
fields[4] = database.substring( Token3+1, Token4 ); // Shipping Cost
fields[5] = database.substring( Token4+1, database.length ); //Additional Information

该代码可以替换为:

var database = GetCookie(NewOrder);
var fields = database.split('|');

是的,真的!这做完全一样的事情。 (好吧,不完全是。如您所见,它不会创建所有 Token0Token1 等变量,但这些变量无论如何都不会在其他任何地方使用。)

此外,而不是所有描述 fields[0] 的评论, fields[1]等意味着,您应该完全删除这些注释,而是为所有这些字段创建命名变量:

var database = GetCookie(NewOrder);
var fields = database.split('|'),
productID = fields[0],
quantity = parseInt( fields[1], 10 ),
price = +fields[2],
description = fields[3],
shipping = +fields[4],
moreInfo = fields[5];

然后在您的其余代码中,您可以替换所有 fields[n]引用这些名称。例如,这段代码:

 fTotal += ( parseInt(fields[1]) * parseFloat(fields[2]) );

可以替换为:

 fTotal += quantity * price;

那样可读性更好一些,不是吗?

相关说明:

  1. 如果您使用 parseInt()总是在第二个参数中提供一个明确的基础。否则,如果用户恰好输入“010”,它将被转换为 8这可能不是预期的。
  2. 您可以使用 +someString而不是 parseFloat(someString)为简单起见。

现在我将留给您作为练习。查看您将此类代码重复多次并稍作改动的所有地方:

strOutput += "<TR><TD CLASS=\"noptotal\" COLSPAN=3><B>"+strSUB+"</B></TD>";
strOutput += "<TD CLASS=\"noptotal\" COLSPAN=2 ALIGN=RIGHT><B>" + MonetarySymbol + strTotal + "</B></TD>";
strOutput += "</TR>";

您能想出一种方法可以编写该代码一次 并多次调用它,并传入针对每个实例更改的项吗?例如,在这段代码的重复中,除了你输入 strSUB 的地方外,每次都是一样的。和 Symbol + strTotal .代码重复的下一个地方是strSHIP。和 MonetarySymbol + strShipping在那些地方,但在其他地方是相同的。等等。

在 JavaScript 中有没有一种方法可以编写可重用的代码片段,您可以在其中传递这样的参数,这样大部分代码只出现一次,您可以为每个单独的实例提供参数?

最后,一个小的文体注释。你的一些 HTML 有 <lowercasetags>有些有<UPPERCASETAGS> .无论大小写,浏览器都以相同的方式对待它们,但最好保持一致,现代 JavaScript/HTML 代码使用 <lowercasetags> .

关于javascript for循环获取订单详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16849539/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com