我正在一家电子商店工作,其中插入到购物篮中的物品被插入到名为BasketItemNumber_I
的jStorage钥匙中[其中我是一个int并且其他所有物品都以i ++的名义获得]。此jStorage对象以何种方式不同,为什么?
例如:BasketItemNumber_1,BasketItemNumber_2等。
现在,我的客户问我要添加一个输入,其中一个项目的件数将是,让客户端可以修改int无需使用+ 1和-1功能。
假设我在篮子里有一件物品。当我回响在控制台这个项目,它看起来像这样:
现在,我们的目标是到对象的一块值更改为一个用户写入输入,因此该项目具有onfocusout功能,看起来像这样:
function onFocusOutFunction(jStorageItemName, i) {
console.log(jStorageItemName + " Focus Out");
var jStorageFocusedOutBasketPiece = $.jStorage.get(jStorageItemName);
console.log("jStorageFocusedOutBasketPiece: " + jStorageFocusedOutBasketPiece[0].piece);
var inputFocusedOutBasketPiece = document.getElementById('pieceInput_' + i).value;
inputFocusedOutBasketPiece = inputFocusedOutBasketPiece.replace(/\D/g,'');
console.log("inputFocusedOutBasketPiece: " + inputFocusedOutBasketPiece);
function isNumber(obj) { return !isNaN(parseFloat(obj)) }
console.log(isNumber(inputFocusedOutBasketPiece));
if (inputFocusedOutBasketPiece == jStorageFocusedOutBasketPiece[0].piece){
console.log("Values are the same");
}else {
console.log("Values are not the same, therefore piece value will be changed");
console.log("Before change");
console.log(jStorageFocusedOutBasketPiece);
jStorageFocusedOutBasketPiece[0].piece = parseInt(inputFocusedOutBasketPiece);
$.jStorage.set(jStorageItemName, jStorageFocusedOutBasketPiece[0]);
$.jStorage.setTTL(jStorageItemName, 604800000);
console.log("After the change");
console.log(jStorageFocusedOutBasketPiece);
console.log("After jStorage set");
console.log(jStorageItemName);
console.log($.jStorage.get(jStorageItemName));
window.location.assign('basket.php');
}
}
但是,每当我改变的值(以便这个功能可以做它的东西)。该BasketItemNumber_1的输出是这样的:
该项目未在篮下上市了,因为我与这部分代码来检查:(我知道我用eval,这是一个不好的做法,我打算稍后改变它,现在我需要完成概念验证,而不是实际的产品)。
for (var i = 1, len = jStorageIndex.length; i < len; i++){
jStorageItemContents = eval("$.jStorage.get('BasketItemNumber_" + i + "')");
jStorageItemName = "BasketItemNumber_" + i
if (typeof jStorageItemContents == "undefined" || ! (jStorageItemContents instanceof Array)) {
console.log("An array is empty, skipping.");
}else {
if(jStorageItemContents[0].active == "true"){
...等等。
基本上,我没有看到一个项目,但我看到“一个数组是空的,跳过”在控制台中。
我必须使用上面的逻辑,因为有时候BasketItems是空的(在用户删除它们之后,它们的空数组有时会留在缓存中),因此我只想显示那些实际包含了某些内容的东西。
因此,我必须问:为什么改变对象的表现方式?
我看到的区别在于它们都在控制台中outputed的方式,更特别是在[]和{},但我不明白,是什么使这种变化可能与如何进行:
我宁愿改变一个对象所代表的方式来改变它的值,以匹配它曾经有过的格式,这样我就不必去混淆上面的类型逻辑了,因为还有其他东西依赖于它作为好。
注意:还有一个+和 - 按钮,分别改变件的值。
这些功能是:
$(document).on('click', '#addPieceButton', function(){
var variable = $(this).attr('itemname');
var variable = variable.toString();
var basketItem = $.jStorage.get(variable);
basketItem[0].piece = parseInt(basketItem[0].piece) + 1;
console.log(basketItem[0].piece);
$.jStorage.set(variable, basketItem);
$.jStorage.setTTL(variable, 604800000);
console.log($.jStorage.get(variable));
location.reload(true);
});
$(document).on('click', '#removePieceButton', function(){
var variable = $(this).attr('itemname');
var variable = variable.toString();
var basketItem = $.jStorage.get(variable);
basketItem[0].piece = parseInt(basketItem[0].piece) - 1;
if(basketItem[0].piece == 0){ //If there is 0, we will show the warning
if (window.confirm("By changing the pieces to 0 the item will disappear? Do you want to continue?")) {
//This will change the active to false, thanks to which it will be no longer displayed
for (var i in basketItem) {
if (basketItem[i].active == "true") {
basketItem[i].active = "false";
break; //Stop this loop, we've found it!
}
}
$.jStorage.set(variable, basketItem);
$.jStorage.setTTL(variable, 604800000);
console.log($.jStorage.get(variable));
location.reload(true);
}
else {
console.log("User answered NO");
location.reload(true);
}
}else {
console.log(basketItem[0].piece);
$.jStorage.set(variable, basketItem);
$.jStorage.setTTL(variable, 604800000);
console.log($.jStorage.get(variable));
location.reload(true);
}
});
和他们很好地工作。通过写下来,我以某种方式感觉到原因将在某个地方,我不使用jQuery的功能,我有问题。
谢谢!我需要一个人从盒子外面看它。我沉浸在其中,我根本没有看到! :)并感谢您的评估解决方案! – MathewG