JavaScript中带前导零的数字会发生变化

5

我正在使用 print 语句从 PHP 调用 JavaScript 函数来打印 HTML 代码,并传递一个整数。但是,当在 PHP 中传递值时,它与 JavaScript 函数接收到的数字不匹配,而我不知道原因。

这是调用 JavaScript 函数的 PHP 代码:

$upc = $items[$i]->GetUPC();
print "upc: " . $upc . "<br/>";

$delete = "<a href='#' onclick='removeFromCart(". $upc .")' ><img src='".$redx."' height='17' width='17' /></a>";

打印语句将输出值: 0011110416605

在页面上,使用查看源代码,可以找到此标签:

<a href='#' onclick='removeFromCart(0011110416605)' >

这是被调用的JavaScript函数:

function removeFromCart(itemID){
    var option = document.getElementById("select_cart");
    var selected = option.options[option.selectedIndex].value;

    alert(itemID);

    loadCart(itemID,selected,"","remove");
}

警告框打印出数字:1226972549。
如果它只是删除前导0,我可以理解,但这个数字完全不同。有人知道可能是为什么吗?

1
将引号放在这里。removeFromCart("0011110416605") - jszobody
4个回答

11

由于前导零和缺少大于7的数字,JavaScript认为它是一个八进制值。 八进制0011110416605的十进制值为1226972549。例如:

> var value = 010; //10 in octal
> console.log(value);
> 8  //is 8 in decimal

使用字符串代替:

removeFromCart("0011110416605")

好的,当我尝试这样做时,JavaScript甚至不再运行。我认为我做得没错:这是我的控制台结果:<a href="#" onclick="removeFromCart("0011110421111")" >,这是我的实际代码:'<a href="#" onclick="removeFromCart("' . $upc . '")" >'。我是不是打错了什么? - Jason247
你需要使用单引号或转义双引号。如果属性值本身被双引号包围,就不能在 onclick 中使用双引号。顺便说一下,使用 DOM API 或 jQuery 附加事件会更容易些。 - Vivin Paliath
我刚意识到这是因为我不能使用相同类型的引号,对吧?考虑到我已经在整个<a>标签周围使用了单引号,并在函数调用周围使用了双引号,那么我如何在内部值周围获取引号而不破坏它呢? - Jason247
好的,我会尝试一下。 - Jason247

0

你可以直接在引号中调用

例如 onchange="updateLineTotal{$id,'{$po101}')";

只需将其包含在引号中,这样它就会被视为字符串而不是整数


0
通过创建一个名为“tempcart”的隐藏文本,并使用HTML或PHP为其赋值,可以解决此问题。这将保留前导零作为文本字符串。确保在通过PHP传递它时将其转换为字符串。
HTML:
<input type='hidden' id='tempcart' value='0011110416605'>

PHP:

$itemID = '0011110416605';
$itemID = strval( $itemID );
echo "<input type='hidden' id='tempcart' value=$itemID >";

脚本:

function removeFromCart() {
var itemID = document.getElementById('tempcart').value;
alert(itemID);
//do whatever...
}

这只是样例编程,你需要将其适配到你的程序中。我猜Javascript不能通过转换为八进制值(因为前导零和没有大于7的数字)而导致失败,正如@Vivid之前提到的。


-2

我发现了这个问题,并通过使用parseInt进行了修复:

itemID = parseInt('0011110416605',10);

1
这是不同的 - 它将给你数字11110416605,而不是字符串“0011110416605”。 - AKX
问题并未提及是否需要一个字符串。 - Faliorn
一个数字不能有前导零。 - AKX
不知道这与任何事情有什么关系。该方法根据接收到的字符串返回一个有效的数字。 - Faliorn
但是原帖作者不想要一个数字,他想要前导零保持不变(因为没有前导零,该序列就不是有效的UPC)。 - AKX
这应该在问题中是明确的。除非您使用UPC(我不是),否则您可能不了解该限制,因为它没有指定。甚至没有“我需要使用UPC”,upc只是一个变量名。问题是关于数字,而不是字符串,前导0或格式的。请注意,“如果它是删除前导0,我可以理解”。 - Faliorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接