Для начала обьясню, под чем я понимаю "текучий" (или "жидкий") лист.
( лист от слова List )
это такой объект, имеющий свои свойства и методы, как все объекты, но вдобавок и пронумерованные свойства и свойство length, равное длине пронумерованных элементов.
представить его можно как-то так :
var fluid = {
myProp : "okay",
myMethod : function(){ alert('myMethod!') },
"0" : "null",
"1" : "one",
"2" : "two",
"3" : "three",
length : 4
};
Отличается он от массива тем, что при удалении пронумерованного свойства его длина автоматически уменьшается на 1, а пронумерованные элементы, идущие за удаленным элементом, уменьшают свои индексы на 1.
delete fluid["1"];
/*
fluid is
{
myProp : "okay",
myMethod : function(){ alert('myMethod!') },
"0" : "null",
"1" : "two",
"2" : "three",
length : 3
};
*/
delete fluid["1"];
/*
fluid is
{
myProp : "okay",
myMethod : function(){ alert('myMethod!') },
"0" : "null",
"1" : "three",
length : 2
};
*/
Проблема состоит в том, чтобы запоминать индексы определённых пронумерованных элементов и удалять их при необходимости.
Конечно, это было бы легко, если бы они не смещались вверх. Так вот, мне нужен алгоритм, при котором можно будет удалить
такой-то пронумерованный элемент.
Думаю, вы могли догадаться, что я говорю про правила с каскадных таблицах стилей - там правила ведут себя именно так.
Вот запускаемый пример
Пример: не успевает. откройте на локале
<div>Hello World !</div>
<script>
var dummy = document.querySelector('div');
var stylesheet = document.head.appendChild(document.createElement('style')).sheet;
var rules = stylesheet.cssRules; // <- тот самый жидкий массив
// вставляем правила, запоминаем индексы...
var first = stylesheet.insertRule("div { border:1px red solid; }", rules.length);
var second = stylesheet.insertRule("div { padding:10px; }", rules.length);
var thirst = stylesheet.insertRule("div { color:green; }", rules.length);
// отображаем результаты в консоли
console.dir(rules);
// запомненные индексы
console.log(first, second, thirst);
// пережидаем ленивую отрисовку.
setTimeout(function(){
// убираем первое правило.
stylesheet.deleteRule(first);
// и смотрим на правила
console.dir(rules);
}, 3000);
</script>
Вот-с. Итак, как удалить правило-то ?