Показать сообщение отдельно
  #1 (permalink)  
Старый 22.03.2012, 22:36
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Удаление элемента в "жидком" листе.
Для начала обьясню, под чем я понимаю "текучий" (или "жидкий") лист.
( лист от слова 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>


Вот-с. Итак, как удалить правило-то ?

Последний раз редактировалось melky, 22.03.2012 в 22:38.
Ответить с цитированием