我一直在使用购物车,用户可以随意添加/删除订单商品,并使用jQuery $ .ajax
通过网络服务返回更新的小计以下是我如何调用网络服务并使用响应设置小计。
//perform the ajax call
$.ajax({
url: p,
data: '{' + s + '}',
success: function(sTotal) {
//order was updated: set span to new sub-total
$("#cartRow" + orderID).find(".subTotal").text(sTotal);
},
failure: function() {
//if the orer was not saved
//console.log('Error: Order not deleted');
}
});
我得到的回应似乎很好:
{"d":"128.00"}
当我在页面上显示总数时,它显示为128而不是128.00
我完全相信这是非常简单和愚蠢的事情,但我现在非常深入,我需要一个有新脑的人来帮助我!
干杯:)
修改
我也使用$ .ajaxSetup来设置正确的contentType:
$.ajaxSetup({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
dataFilter: function(data) {
var msg;
if (typeof (JSON) !== 'undefined' &&
typeof (JSON.parse) === 'function')
msg = JSON.parse(data);
else
msg = eval('(' + data + ')');
if (msg.hasOwnProperty('d'))
return msg.d;
else
return msg;
}
});
答案 0 :(得分:2)
这是因为该值被视为一个数字,而您希望将其视为一个字符串。 当您使用'..text(sTotal)'时,实际上是在包装原语sTotal的Number对象上调用.toString()方法。由于这是一个整数,它显示没有小数。 在调用.text(foo)之前,您需要使用数字格式作为字符串,以便格式化数字。
这将给你两位小数
var a=1/3;
a = a.toString();
switch(a.lastIndexOf(".")){
case -1:
a+=".00";
break;
case a.length-2:
a+="0";
break;
default:
a=a.substring(0, a.indexOf(".") + 3);
}
alert(a);
答案 1 :(得分:1)
我没有在此代码中看到您访问响应的 d
属性的任何位置。
也许你的意思是这样做?
$("#cartRow" + orderID).find(".subTotal").text(sTotal.d);
// --------------------------------------------------^^
击> <击> 撞击>
好的,我看到了问题。您正在返回JSON,但未在$.ajax()
调用中定义 dataType 。这意味着jQuery会看到您的application/json
mimetype并将响应解释为JSON。 JSON中的128.00
是Number,而不是String。但是,"128.00"
将是一个字符串。
为了保持此功能,您需要在打印之前格式化响应(正如其他人建议的那样),或者调整端点以返回有效的JSON 字符串。
这是我证明解决方案的测试
<div id="test">
Subtotal <span class="subTotal"></span>
</div>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript" charset="utf-8">
google.load("jquery", "1.4.2");
</script>
<script type="text/javascript" charset="utf-8">
$.ajax({
url: 'test.php',
data: {},
success: function(sTotal) {
//order was updated: set span to new sub-total
$("#test").find(".subTotal").text(sTotal);
}
});
</script>
和test.php
<?php
header( 'Content-type: application/json' );
echo '128.00';
输出
小计128
但是当我将 test.php 改为
时<?php
header( 'Content-type: application/json' );
echo '"128.00"';
生成预期输出
小计128.00
或者,您也可以通过指定 dataType 参数告诉jQuery将响应视为文本,例如
$.ajax({
url: 'test.php',
data: {},
dataType: 'text', // <---- here
success: function(sTotal) {
//order was updated: set span to new sub-total
$("#test").find(".subTotal").text(sTotal);
}
});
好的,在弄乱了这个之后,我看到发生了什么。您定义的 dataFilter 处理程序将响应转换为JSON本身,在这种情况下,返回字符串128.00
。 但是,jQuery 仍然将智能猜测的dataType(即JSON)应用于此值,然后再将其发送给成功处理程序。
有很多方法可以解决这个问题,所有这些方法都取决于您的应用程序依赖于此设置的其他AJAX调用。我在测试中应用的快速修复是
$.ajaxSetup({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
// define the text data type so that we return data.d, jQuery doesn't parse it as JSON again
dataType: 'text',
dataFilter: function(data) {
data = $.parseJSON( data ); // Use jQuery's parsing
if (data.hasOwnProperty('d'))
{
return data.d;
}else{
return data;
}
}
});
但这可能无法全面适用于你
答案 2 :(得分:1)
请试试这个:
$("#cartRow" + orderID).find(".subTotal").text(sTotal.toFixed(2));
HTH