Я пытаюсь создать массив объектов для сохранения состояния меню в cookie, но он не обновляется, потому что он не находит нужный индекс, содержащий объект, который мне нужен для обновления видимости. Что я делаю неправильно и/или могу указать мне в правильном направлении?
$(document).ready(function() {
var menu = new Array();
$("#vertical-nav .head").click(function() {
var c = $(this).next().attr('name');
$(this).next().slideToggle("slow", function() {
if ( $(this).next().is(':visible') ) {
menu.push({
name: c,
visible: true,
});
} else {
var index = $.inArray(c, menu);
console.log("INDEX: " + index);
menu[index] = { name: c, visible:false };
}
});
console.log(menu);
});
});
Это то, с чем я столкнулся:
$(document).ready(function() {
var menu = new Array();
if ( $.cookie('menu') ) {
var items = JSON.parse($.cookie('menu'));
for ( var item in items ) {
if ( items[item].visible ) {
$("div[name='" + items[item].name + "']").show();
}
menu.push(items[item]);
}
}
$("#vertical-nav .head").click(function() {
var c = $(this).next().attr('name');
if ( $(this).next().is(":visible") ) {
hide(this, c);
} else {
show(this, c);
}
});
function show(obj, c) {
$(obj).next().slideDown('slow', function() {
var elementExists = false;
if ( menu.length > 0 ) {
for ( var item in menu ) {
if ( menu[item].name == c ) {
elementExists = true;
menu[item].visible = true;
}
}
}
if ( !elementExists ) {
menu.push({
name: c,
visible: true,
});
}
$.cookie('menu', JSON.stringify(menu));
});
}
function hide(obj, c) {
$(obj).next().slideUp('slow', function() {
if ( menu.length > 0 ) {
for ( var item in menu ) {
if ( menu[item].name == c ) {
menu[item].visible = false;
}
}
}
$.cookie('menu', JSON.stringify(menu));
});
}
});
Вы можете легко сделать это:
if (menu.length > 0) {
for (var item in menu) {
if (menu[item].name=="some text") alert("Found it!");
}
}
Я бы рассмотрел вместо [{name: "item"; visible: true}]
[{name: "item"; visible: true}]
переключается на пару ключ/значение. Затем вы можете использовать {"item": true}
, но это ограничивается только хранением видимого значения, и никакая дополнительная информация не может быть сохранена в ключе. Чтобы решить эту проблему, попробуйте {"item": {visible: true}}. Здесь пример обнаружения в JS с использованием этого подхода:
if (menu.length > 0) {
for (var item in menu) {
var strVisible="hidden";
if (menu[item].visible==true) strVisible="visible";
alert(item+" is "+strVisible);
}
}
console.log(menu)
в конце происходит перед вашим оператором if, который изменяетmenu
. Вставьте его в setTimeout с 5-секундной задержкой, и вы поймете, что я имею в виду.