Обернуть все элементы, до определённого элемента dom
Есть вот такая структура
<div id="some"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_2"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_3"> <div class="sm_level_3"> <div class="sm_level_2"> <div class="sm_level_3"> </div> Задача с помощью jquery сделать так чтоб элементы с level_1 по level_n , оборачивались в div То есть вот так <div id="some"> <div class="level_1"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_2"> </div> <div class="level_2"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_3"> <div class="sm_level_3"> <div class="sm_level_2"> <div class="sm_level_3"> </div> </div> Пробовал и так и сяк, не получается. Подскажите пожалуйста, что использовать, куда копать? :help: |
полчаса возился) заинтересовало.
почему ,интересно,не работает фича через $(el).add(i) ( читай : $.add() ) в цикле ??? хз я пробовал и так и сяк в итоге плюнул на кеш ( я собирал элементы в массив,но понял потом, " а нахрена?" ) вот код,с которым таки не (!) получилось.
<div id="some">
<div class="sm_level_1">s</div>
<div class="sm_level_2">s</div>
<div class="sm_level_3">s</div>
<div class="sm_level_4">s</div>
<div class="sm_level_5">s</div>
<div class="sm_level_6">s</div>
<div class="sm_level_7">s</div>
<div class="sm_level_8">s</div>
<div class="sm_level_9">s</div>
<div class="sm_level_10">s</div>
</div>
скрипт
var fr = 3, // FROM -> с какого
to = 5, // TO -> по какой
pr = ".sm_level_", // префикс класса
some = $( document.getElementById('some') ) // кешируем родительский элем
/*
$(pr+fr++,some) ---> some.find(pr+fr++)
pr+fr++ -----> .sm_level_3,4,5 . с инкрементиком. удобно. заюзали-увеличили
*/
do $(pr+fr++,some).css('color','red');while(fr<=to)
/*
гонялся всегда за умещением кода в одной строчке... маньяк :)
вот тот же цикл ... по-человечески
*/
for(var i = fr; i<=to;i++) {
$(pr+i,some).css('color','red');
}
// рабочее,чуть-чуть. отмечает говнюков с третьего ( sm_level_3) по пятый (sm_level_5) красным цветом
только вот "нипонять", как обернуть их делается это через $.wrap() ............ тьфу ты,етить колотить мануал
var fr = 3,
to = 5,
pr = "sm_level_",
some = $( document.getElementById('some') )
some.find('div').wrap(
function(e){
/*
как получить индекс . sm_level_{NUM} -- этот {NUM}
this ->>> html element
$(this) ->>> jQuery el
$(this).attr('class') ->>> 'sm_level_4'
$(this).attr('class').replace(pr,'') = '4' (строка)
parseInt( $(this).attr('class').replace(pr,'') ) ->>> 4 (циферка)
*/
var inrange = parseInt( $(this).attr('class').replace(pr,'') );
// просто использую её как кеш,чтобы код читался, и чтобы не создавать еще переменных
inrange = inrange >= fr && inrange <= to;
// true , если больше либо равен 3, но меньше либо равен 5.. т.е. 3,4,5
return inrange ? "<s></s>":"";
})
получилось так <div id="some"> <div class="sm_level_1">s</div> <div class="sm_level_2">s</div> <s><div class="sm_level_3">s</div></s> <s><div class="sm_level_4">s</div></s> <s><div class="sm_level_5">s</div></s> <div class="sm_level_6">s</div> <div class="sm_level_7">s</div> <div class="sm_level_8">s</div> <div class="sm_level_9">s</div> <div class="sm_level_10">s</div> </div> увы, обернуть одним дивчиком не знаю,как.. $.add() не работает. попробуй через неё ( или через селекторы :gt() и :lt() -> через них у меня тоже не получилось ). на большее у меня азарта не хватает. спать хочется :) мб мой сонный мозг чтото пропустил? буду рад увидеть , как будет решена эта проблема. спокойной ночи :) и еще, $.index() я не стал использовать не потому что не знал ( а я не знал))) , а потому что нумерация начинается с единицы ( а может начинаться с тысячи)! |
<!DOCTYPE HTML>
<html>
<head>
<style type="text/css">
div {border:1px solid #aac}
div.warp {border:0;background:#dfd}
</style>
</head>
<body>
<div id="some">
<div class="sm_level_1">s1</div>
<div class="sm_level_2">s2</div>
<div class="sm_level_3">s3</div>
<div class="sm_level_4">s4</div>
<div class="sm_level_5">s</div>
<div class="sm_level_6">s</div>
<div class="sm_level_7">s</div>
<div class="sm_level_8">s</div>
<div class="sm_level_9">s</div>
<div class="sm_level_10">s</div>
</div>
<script type="text/javascript">
function createWarp(start,end){
var e=document.getElementById('some'),
divs=e.getElementsByTagName('div'),
i=divs.length,
elements=[], n, w;
var warper=document.createElement('div'); warper.className='warp';
while(i--){
n = divs[i].className.slice(9); //срезаем sm_level_
if(n>=start&&n<=end)elements.push(divs[i]);
}
var last=elements[0].nextSibling;
this.warp=function(){
var i = elements.length;
w = w==warper?document.createDocumentFragment():warper;
while(i--) w.appendChild(elements[i]);
if(last) e.insertBefore(w,last);
else e.appendChild(w);
}
}
//ниже нужно только для демо
w=new createWarp(1,4);
function go(txt){
if(txt.defaultValue!=txt.value){
var v=txt.value.split(',');
w=new createWarp(+v[0],+v[1]);
}
txt.defaultValue=txt.value;
w.warp()
}
</script>
<input type = "button" value = "(un)warp" onclick = "go(nextSibling)"/><input type="text" value="1,4"/>
</body>
</html>
Вот простейший примерчик, на коленке. |
Всем спасибо, сделал по свойму =)
<div id="some"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_2"> <div class="sm_level_1"> <div class="sm_level_2"> <div class="sm_level_3"> <div class="sm_level_3"> <div class="sm_level_2"> <div class="sm_level_3"> </div>
jQuery("#some").html(""+jQuery("#some").html().replace(/<div class=\"sm_level_1\">/g,"</div><div class='col'><div class='sm_level_1'>").slice(6)+"</div>");
То есть преобразуем в строку, заменяем <div class='sm_level_1'> на </div><div class='col'><div class='sm_level_1'> регулярным выражением) потом удаляем первые 6 символов (то есть первый </div>) и добавляю закрывающий тег в конец "</div>") и вставляем всё это обратно как html . :dance: |
Какой ужас. А то что это будет работать раз в 20 медленней и сбросит все обработчики событий буде такие появятся - похрен.
Впрочем, сам сделал - молодец.) |
Aetae ещё до кучи в ие не работает .replace , сразу не проверил ( Работает, но не ищет /<div class=\"sm_level_1\"> / , пробовал всё комментировать и вообще по разному, не хочет и всё... Попробую использовать твой код, спасибо =)
|
Скорей всего дело в том, что код <div class="sm_level_1"> обработанный движком IE выглядит примерно так: <DIV class=sm_level_1> не зависимо от того как написан изначально.(кстати для других браузеров по большей части верно обратное)
|
| Часовой пояс GMT +3, время: 01:33. |