2012-11-23 47 views
0

我正在开一家网上商店,客户可以通过下拉列表选择要购买的商品数量。每个项目有一个点价值,我计算出通过jQuery(onChange事件)总他们的购买:在下拉列表中选择新值,同时记住Jquery中的旧值

function showPoints(itemPointValue, ddlAmount){ 
    var customerPoints = parseInt($('p#points').html()); 
    currentPoints = customerPoints - (ddlAmount * itemPointValue); 
    $('p#points').html(currentPoints); 
}//showPoints  

这里唯一的问题是,如果他们改变比如从5比4的量,另外4 *点值取消他们的“总分”。他们的总分最终变得完全不准确,甚至可能低于0.我想用jquery.data设置“oldValue”变量,但IE不支持这一点。有什么建议么?

+0

我没有发现jQuery文档中的任何地方.data()在IE中不起作用,你试过了吗?它应该工作.. – Nelson

+0

Netbeans IDE告诉我: 以下目标浏览器不支持此功能: Internet Explorer 5.5 我知道这似乎有点可笑,我担心5.5但我想它可以在所有浏览器中工作 – JeremyS

+0

IE6支持'jQuery.data'(尽管'IE'属性在IE6上不支持 - >它们是通过一些内部数组来模拟的)。看[这个答案](http://stackoverflow.com/a/7846668/1127669)。 –

回答

0

我通过在我的下拉列表中使用两个事件解决了这个问题。 onClick使用jquery.data和onChange保存旧数据以检查旧值与新值。如果新值较小,则旧值相应地调整点总数。

HTML:

<select name="dropdown onClick="saveOld(this.value, this.name)" onchange="showPoints(points, this.value,this.name)"> 

JS/jQuery的

function showPoints(pointCategory, ddlAmount, name){ 
    old = jQuery.data(document.body,name); 
    var Points = parseInt($('p#points').html()); 
    if(old > ddlAmount){ 
     diff = old - ddlAmount; 
     currentPoints = Points + (diff * pointCategory); 
    }else{ 
     currentPoints = Points - (ddlAmount * pointCategory); 
    } 
    $('p#points').html(currentPoints); 
}//showPoints 

function saveOld(oldAmount, name){ 
    $(document.body).data(name,oldAmount); 
}//saveOld 

谢谢大家对你的答案!

0

为什么不重新计算任何时候任何下拉改变时的总积分成本,并通过从customerPoints中减去新的总数来重新计算currentPoints?这对我来说,好像不是加法和减法值

+0

我有multipe下降,并不是所有的使用。我将不得不做一个遍历所有下拉列表的函数(它们具有涉及产品ID的唯一动态名称),并检查它们是否为0。更不用说不同的下拉式产品有不同的点类别。 – JeremyS

0

一个更清洁的解决方案如何,在元素上创建自定义属性:

$('p#points').attr('old-value',5);

并检索它像这样:

$('p#points').attr('old-value');

+0

这似乎是一个好主意,但由于我正在使用onchange事件,当保存旧值的事件触发时,select是否已经更改为4? – JeremyS

+0

你可以在选择元素的鼠标悬停事件上添加处理程序,以保存旧值(我知道它不是优雅的),所以就在值更改之前旧的将保存 – djakapm

2

如上所述,您可以将以前的值存储在自定义属性中,并且您可以使用焦点事件来设置旧值,这应该起作用:

$('p#points').on('focus', function() { 
    $(this).attr('old-value', $(this).val(); 
}); 
+0

这很可能是一个可行的答案,所以+ 1。尽管如此,我还是选择了另一种方法。 – JeremyS

+0

为了让它在这里出现,你能指定一下那个方法吗? –

+0

@Alexenadru Bularca我的解决方案发布在下面。谢谢你的帮助 – JeremyS