Помогите найти значение атрибута.
Есть блок с id="block13"
Есть var fix = 12
$("#block"+fix).attr();
Число переменной fix менять нельзя.
Может есть функция которая находит ближайший id, по значению.
Такое себе, но работает (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>
/**
* Ищет элементы с ближайшим номером в 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)
Продвижение своими сайтами как стратегия роста и независимости