Селектор - найти id элемента

194
12 января 2020, 20:00

Помогите найти значение атрибута.

Есть блок с id="block13"
Есть var fix = 12

$("#block"+fix).attr();

Число переменной fix менять нельзя.
Может есть функция которая находит ближайший id, по значению.

Answer 1

Такое себе, но работает (jQuery):

let fix = 12,  
  collection = $('div[id^="block"]'); 
 
function findClosestBlock (inFix, seeckDirection = 1, collection) { 
  if (collection) {  
    if (seeckDirection) { // если 1, происходит поиск от меньших id к большим 
      collection.each(function (i, el) { 
        if (el.id.match(/\d+/)[0] > fix) { 
          console.log(el.id); 
          return false; 
        } 
      }) 
    } else { // если 0, переворачивает массив элементов и щем от большего id к меньшему 
      $(collection.get().reverse()).each(function (i, el) { 
        if (el.id.match(/\d+/)[0] < fix) { 
          console.log(el.id); 
          return false; 
        } 
      }) 
    } 
  } 
} 
 
findClosestBlock(fix, 1, collection); // второй аргумент - направление поиска
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div id="block8"></div> 
<div id="block9"></div> 
<div id="block10"></div> 
<div id="block11"></div> 
<div id="block12"></div> 
<div id="block13"></div>

Answer 2

/** 
 * Ищет элементы с ближайшим номером в id 
 * @param {string} idBase - начало id (до числа) 
 * @param {number} n - число, "вокруг" которого искать 
 * @param {boolean} withN - включать ли в результат элемент с указанным n 
 * @return {HTMLElement[]} сортированный массив элементов, или null при ошибке параметров 
 */ 
function findByNum(idBase, n, withN) { 
  idBase = idBase.replace('#', '').trim().split(/\s+/)[0];  
  if (!isFinite(n = +n) || n < 0 || !idBase.length) return null;  
  const numRe = new RegExp(idBase + '(\\d+)', 'i');  
  const els = [];  
  for (let el of document.querySelectorAll(`[id^="${idBase}"]`)) { 
    let num = +((el.id.match(numRe) || [0, infinity])[1]);  
    if (!isFinite(num)) continue;  
    if (!withN && (num === n)) continue;  
    els.push({ el, num });  
  } 
  els.sort((a, b) => Math.abs(n - a.num) - Math.abs(n - b.num));  
  return els.map(o => o.el);  
}  
 
 
// ------------------- test ------------------- 
for (let i = 1; i <= 150; i++) 
  document.body.insertAdjacentHTML('beforeend', `<div id="block${i}">${i}</div>`);  
document.querySelector('input').addEventListener('input', e => { 
  for (let el of document.querySelectorAll('[id^="block"]')) 
    el.style.background = '#fff';  
  const els = findByNum('block', Math.abs(e.target.value), false),  
        cnt = els.length,  
        stp = 50 / cnt * 4;  
  for (let i = 0; i < cnt; i++) 
    els[i].style.background = `hsl(200deg, 100%, ${50 + i * stp}%)`;  
}); 
label { display: block; margin: 1rem 0.25rem; } 
 
div { 
  display: inline-block; width: 3em;  
  margin: 0 1px 0 0; padding: 0.3rem 0rem;  
  text-align: center; font: 0.7rem/1.8 monospace;  
  box-shadow: 0 0 0 1px #ccc; }
<label>Число в id: <input type="number"></label>

Два ближайших по id элемента, по одному "слева" и "справа" от n (индексы 0 и 1 соотв.):

findByNum('block', n, false).slice(0, 2)
READ ALSO
Получить поля объекта json

Получить поля объекта json

Вывожу в консоль объект:

174
Как сделать вывод количества страниц 1изХ в горизонтальной прокрутке контента?

Как сделать вывод количества страниц 1изХ в горизонтальной прокрутке контента?

Некоторое время назад я задавал вопросы по горизонтальной прокрутке контента, тут: Горизонтальная прокрутка работает колесиком мышкиКак...

153
Не отображается placeholder на select2

Не отображается placeholder на select2

Вот пример как инициализируется плагин

193
Не убирается блок при загрузке страницы

Не убирается блок при загрузке страницы

На сайте есть сторонний виджет или что то вроде этого, тема wp, нужно убрать блок но стилями не получается так как файл сторонний я так понимаю,...

164