В jQuery, как я могу выбрать скрытый элемент?

Вы можете использовать некоторый рекурсивный подход для реализации этого.

let str = '1.2.1';


function checkItem(arr, strArr) {
  // iterate over the array
  arr.forEach((obj) => {
    // set selected property based on matching every digit in label in same order
    // if digits would be single then you can use startsWith and no need to split string
    obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
    // if nested item is there then call recursively
    obj.items && checkItem(obj.items, strArr);
  });
  return arr;
}

checkItem(menus, str.split('.'));

var menus = [{
    label: "1",
    items: [{
        label: "1.1"
      },
      {
        label: "1.2",
        items: [{
            label: "1.2.1"
          },
          {
            label: "1.2.2"
          }
        ]
      },
      {
        label: "1.3"
      },
    ]
  },
  {
    label: "2"
  }
];



let str = '1.2.1';


function checkItem(arr, strArr) {
  arr.forEach((obj) => {
    obj.selected = obj.label.split('.').every((it, i) => it === strArr[i]);
    obj.items && checkItem(obj.items, strArr);
  });
  return arr;
}

checkItem(menus, str.split('.'));


console.log(menus);


UPADATE: Поскольку вы хотите обновить выбранное свойство полностью независимо от метки можно сделать что-то вроде следующего. Я предполагаю, что вы хотите обновить в зависимости от позиции в массиве.

let str = '1.2.1';


function checkItem(arr, prefixArray, strArr) {
  // iterate over the array
  arr.forEach((obj, i) => {
    // generate new prefix array for checking
    let pa = [...prefixArray, i + 1];
    // compare prefix array with the string array to check matches
    obj.selected = pa.every((it, i) => it == strArr[i]);
    // if items defined do it recursively
    obj.items && checkItem(obj.items, pa, strArr);
  });
  return arr;
}

checkItem(menus,[], str.split('.'));

var menus = [{
    label: "1",
    items: [{
        label: "1.1"
      },
      {
        label: "1.2",
        items: [{
            label: "1.2.1"
          },
          {
            label: "1.2.2"
          }
        ]
      },
      {
        label: "1.3"
      },
    ]
  },
  {
    label: "2"
  }
];



let str = '1.2.1';


function checkItem(arr, prefixArray, strArr) {
  arr.forEach((obj, i) => {
    let pa = [...prefixArray, i + 1];
    obj.selected = pa.every((it, i) => it == strArr[i]);
    obj.items && checkItem(obj.items, pa, strArr);
  });
  return arr;
}

checkItem(menus,[], str.split('.'));


console.log(menus);

28
задан Grimthorr 22 April 2014 в 10:52
поделиться

1 ответ

Вы ищете :hidden селектор

Обратите внимание на то, что надлежащий способ выбрать элемент идентификатором просто:

$("#test1");

При выполнении его способ, которым Вы делаете, заставляет jQuery сделать ненужный парсинг и намного медленнее.

Если Вы хотите выбрать #test1 только если это скрыто, Вы делаете это:

$("#test1:hidden");

Если Вы хотели выбрать все <span> элементы, которые скрыты под #p1, Вы делаете это:

$("span:hidden", "#p1");

Как отмечено в комментариях, противоположность этого селектора :visible селектор:

$("span:visible", "#p1");

Затем выбрал бы любого видимого <span> элементы в элементе #p1.

47
ответ дан Paolo Bergantino 28 November 2019 в 03:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: