Разброс блоков в рандом порядке.
Вложений: 1
Всем привет, это снова я, с бесконемным числом вопросов :D
Сейчас вот что требуется: Разбросать блоки в рандом порядке. снова работаю над плейером... например парент у нас id='music' а каждый в нем tr - это трек. http://javascript.ru/forum/attachmen...d=132600723 3 например иходный текст: <table id='music'> <tr id='1'>...</tr> <tr id='2'>...</tr> <tr id='3'>...</tr> <tr id='4'>...</tr> <tr id='5'>...</tr> <tr id='6'>...</tr> <tr id='7'>...</tr> </table> а что должно получится: <table id='music'> <tr id='2'>...</tr> <tr id='5'>...</tr> <tr id='7'>...</tr> <tr id='1'>...</tr> <tr id='3'>...</tr> <tr id='4'>...</tr> <tr id='6'>...</tr> </table> тоесть порядок рандомный. и желательно чтобы innerHTML у этих tr не трогался, дабы не портить содержим ///////////////////////////////////////// и еще вот попрос. по этой же теме, но другой. как получить рандомный блок, например для его редактирования, если есть парент, например id='music' как выше. ///////// PS сразу говорю - о гет запросе с построением в рандом порядке уже думал, не подходит. Заранее благодарен за поддержку, благодарен не на словах |
<table id='music'> <tr id='1'><td>1</td></tr> <tr id='2'><td>2</td></tr> <tr id='3'><td>3</td></tr> <tr id='4'><td>4</td></tr> <tr id='5'><td>5</td></tr> <tr id='6'><td>6</td></tr> <tr id='7'><td>7</td></tr> </table> <script> var table=document.getElementById('music'), tr=table.getElementsByTagName('tr'), i=tr.length; table=tr[0].parentNode; //ибо tbody итп while(i--) Math.random()<.5 ? table.appendChild(tr[i]) : table.insertBefore( tr[i], table.firstChild ); </script> |
;) отлично, давай wmr кошелек
|
а что если усложнить задачу, и список постраивается у меня вот так:
<table id='music'> <tr id='1'><td>1</td></tr> <tr id='p1'><td>1</td></tr> <tr id='2'><td>2</td></tr> <tr id='p2'><td>2</td></tr> <tr id='3'><td>3</td></tr> <tr id='p3'><td>3</td></tr> <tr id='4'><td>4</td></tr> <tr id='p4'><td>4</td></tr> <tr id='5'><td>5</td></tr> <tr id='p5'><td>5</td></tr> <tr id='6'><td>6</td></tr> <tr id='p6'><td>6</td></tr> <tr id='7'><td>7</td></tr> <tr id='p7'><td>7</td></tr> </table> и список надо построить вот так: <table id='music'> <tr id='6'><td>6</td></tr> <tr id='p6'><td>6</td></tr> <tr id='4'><td>4</td></tr> <tr id='p4'><td>4</td></tr> <tr id='2'><td>2</td></tr> <tr id='p2'><td>2</td></tr> <tr id='3'><td>3</td></tr> <tr id='p3'><td>3</td></tr> <tr id='5'><td>5</td></tr> <tr id='p5'><td>5</td></tr> <tr id='7'><td>7</td></tr> <tr id='p7'><td>7</td></tr> <tr id='1'><td>1</td></tr> <tr id='p1'><td>1</td></tr> </table> (в рандомном порядке, но рядом с ним должен быть блок p[число] |
imposible?
|
Да нет, я просто на работе какбэ)
<table id='music'> <tr><td>1</td></tr> <tr><td>к1</td></tr> <tr><td>2</td></tr> <tr><td>к2</td></tr> <tr><td>3</td></tr> <tr><td>к3</td></tr> <tr><td>4</td></tr> <tr><td>к4</td></tr> <tr><td>5</td></tr> <tr><td>к5</td></tr> <tr><td>6</td></tr> <tr><td>к6</td></tr> <tr><td>7</td></tr> <tr><td>к7</td></tr> </table> <script> (function(){ var rand, table=document.getElementById('music'), tr=[].slice.call(table.getElementsByTagName('tr')), i=tr.length; table=tr[0].parentNode; //ибо tbody итп while(i--){ if(i%2) rand = Math.random()<.5; table.insertBefore( tr[i], rand ? table.firstChild : i%2 ? null : table.lastChild ) } })() </script> R117571207359 |
очень благодарен. скидываю бонусик 300 вмр, надеюсь не мало :)
буду признателен если аську оставишь, у меня много работы есть для профи =3 |
эх, только всеравно рано или позно глюк происходит. наверно надо обнулять переменную. сейчас попробую
|
тоесть если функцию выполнять раз 5-6 то они не ровно стоят. тоесть например
1 к1 2 к3 |
аа, кстати как еще сделать чтобы абсолютно весь список рандомно перевернулся?
|
странно, уже такой ошибке в тесте выше нету, а вот у меня на сайте осталась)
|
Клик. <table id='music'> <tr><td>1</td></tr> <tr><td>к1</td></tr> <tr><td>2</td></tr> <tr><td>к2</td></tr> <tr><td>3</td></tr> <tr><td>к3</td></tr> <tr><td>4</td></tr> <tr><td>к4</td></tr> <tr><td>5</td></tr> <tr><td>к5</td></tr> <tr><td>6</td></tr> <tr><td>к6</td></tr> <tr><td>7</td></tr> <tr><td>к7</td></tr> </table> <script> (function(){ var table=document.getElementById('music'), tr=table.getElementsByTagName('tr'), i=tr.length; table=tr[0].parentNode; //ибо tbody итп randomize = function(){ var arr=[].slice.call(tr), j=i, rand; while(j--){ if(j%2) rand = Math.random()<.5; table.insertBefore( arr[j], rand ? tr[0] : j%2 ? null : tr[i-1] ) } } })() window.onclick=randomize; </script> Попробуй так, если не поможет нужен код. |
Цитата:
Как в первом варианте?) |
RazZzeR,
Вариант для всех браузеров ... <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <meta http-equiv="content-type" content="text/html; charset=windows-1251" /> </head> <body> Клик. <table id='music'> <tr><td>1</td></tr> <tr><td>к1</td></tr> <tr><td>2</td></tr> <tr><td>к2</td></tr> <tr><td>3</td></tr> <tr><td>к3</td></tr> <tr><td>4</td></tr> <tr><td>к4</td></tr> <tr><td>5</td></tr> <tr><td>к5</td></tr> <tr><td>6</td></tr> <tr><td>к6</td></tr> <tr><td>7</td></tr> <tr><td>к7</td></tr> </table> <script> function randomize() { for (var b = document.getElementById("music"), a = b.rows, c = a.length, b = a[0].parentNode; 2 < c--;)c % 2 && (0.5 > Math.random() ? (b.appendChild(a[c - 1]), b.appendChild(a[c - 1])) : (b.insertBefore(a[c], a[0]), b.insertBefore(a[c], a[0]))) }; window.document.onclick=randomize; </script> </body> </html> |
угу, тут все работает, у меня на странице выходит в перемешку.
1й раз - все идеально. 2й раз уже как захочет. может типа переменные какие то надо обнулить и построить список с нуля при вызове функции? |
или если реально готов помочь - скину адрес на сайт =)
|
хотя вы и так уже помогли, просто именно у меня чето не так :D
|
Лучше скинь готовый кусок html с сайта сюда.
|
ну, впринципе разбить рендом 1 раз хватит =)
братюни, спасибо :yes: |
хорошо, сейчас скину
|
когда ты сказал скинуть я начал копировать, и увидел - <tr id="0"></tr>.
это фикс от бага плейера :-E вобщем из за этого блока было нечетное число - а потом и все криво. спасибо огроменное :D |
убрал его и все работает четко :)
|
Вложений: 1
аа, ксттати есть такой косяк в браузерах, когда кликаешь 2 или 3 раза на одно и тоже место - выделяется текст рядом. вот как выходит у меня
http://javascript.ru/forum/attachmen...d=132603455 3 :( бесит |
кстати придумал как усовершенствовать...
нужно tr с id="play"+переменная[NOWplaying] и tr корорый рядом с ним(снизу от него, это тулбар типа громкость, время, и т.д.) помещались в самый верх, а потом все остальные разбросались в рандомном порядке. Aetae, если сделаешь, еще денежку кину, это ко всем относится =) |
<html> <body> Клик. <table id='music'> <tr><td>1</td></tr> <tr><td>2</td></tr> <tr id="play"><td>play</td></tr> <tr><td>кplay</td></tr> <tr><td>3</td></tr> <tr><td>4</td></tr> <tr><td>5</td></tr> <tr><td>6</td></tr> <tr><td>7</td></tr> <tr><td>8</td></tr> <tr><td>9</td></tr> <tr><td>10</td></tr> <tr><td>11</td></tr> <tr><td>12</td></tr> </table> <script> window.onclick = function(){ var d = document, table = d.getElementById('music'), fragment = d.createDocumentFragment(), tr = table.rows, arr = [], i , j; table=tr[0].parentNode; //ибо tbody итп i=d.getElementById('play').rowIndex; fragment.appendChild(tr[i]); fragment.appendChild(tr[i]); i=j=tr.length; if('v'=='\v') while(i--) arr.push(tr[i]); //ie<9 else arr=arr.slice.call(tr); table.insertBefore( fragment, tr[0] ) return function(){ i=j; arr.sort(function(){return .5-Math.random()}) while(i--) table.appendChild( arr[i] ) } }(); </script> </body> </html> Если я правильно понял. Вообще подгонять скрипт под вёрстку нехорошо. Надо работать сразу над тем и над другим, только тогда будет и красиво и быстро. |
все верно, но у меня мнов все наперекосяк =)
вобщем вверх подняло тр с заданным id. перемешала порядка 5 треков, и все. повторно выполнять функцию не удается. они отсортировались по tr id и прилежащий к нему рядом блок. значит мы друг друга не поняли)) вот как устроена таблица у нас: <table id='music'> <tr id="play2"><td>1</td></tr> <tr><td>1k</td></tr> <tr id="play2"><td>play</td></tr> <tr><td>2k</td></tr> <tr id="play3"><td>3</td></tr> <tr><td>3k</td></tr> .... </table> нам надо чтобы tr getElementById('play'+NOWplaying) поднималась вверх, а остальные разбрасывались в раномном порядке. тоесть типа разбрасывать все блоки с прилежащими к ним, кроме getElementById('play'+NOWplaying) NOWplaying - переменная не должна задаваться функцией, это у нас в скрипте id текушего трека (который вопроизводится) |
<html> <body> Клик. <table id='music'> <tr id="play1"><td>1</td></tr> <tr><td>1k</td></tr> <tr id="play2"><td>play</td></tr> <tr><td>play2k</td></tr> <tr id="play3"><td>3</td></tr> <tr><td>3k</td></tr> <tr id="play4"><td>4</td></tr> <tr><td>4k</td></tr> <tr id="play5"><td>5</td></tr> <tr><td>5k</td></tr> </table> <script> NOWplaying=2; window.onclick = function(){ var table = document.getElementById('music'), tr = table.rows, i=tr.length, j=i/2, arr = []; table=tr[0].parentNode; //ибо tbody итп while(i--) arr.push([tr[i],tr[--i]]); return function(){ i=j; arr.sort(function(){return .5-Math.random()}); while(i--) { if(arr[i][1].id==='play'+NOWplaying){ table.insertBefore( arr[i][0], tr[0] ); table.insertBefore( arr[i][1], tr[0] ); }else{ table.appendChild( arr[i][1] ); table.appendChild( arr[i][0] ); } } } }(); </script> </body> </html> Ток количество tr должно быть четным иначе плохо будет.)) |
тоесть? в какой строке его задавать?
i=j; arr.sort(function(){return .5-Math.random()}); ?? |
Не надо ничего задавать.)
Хорошо: <tr></tr> <tr></tr>Плохо: <tr></tr> <tr></tr> <tr></tr> В принципе у вас так и есть, просто малоли лишняя tr попадётся и всё поломает.) Кстати, взглянув <html> <body> Клик. <table id='music'> <tr id="play1"><td>1</td></tr> <tr><td>1k</td></tr> <tr id="play2"><td>play</td></tr> <tr><td>play2k</td></tr> <tr id="play3"><td>3</td></tr> <tr><td>3k</td></tr> <tr id="play4"><td>4</td></tr> <tr><td>4k</td></tr> <tr id="play5"><td>5</td></tr> <tr><td>5k</td></tr> </table> <script> NOWplaying=2; window.onclick = function(){ var table = document.getElementById('music'), tr = table.rows, i=tr.length, j=i/2, arr = []; table=tr[0].parentNode; //ибо tbody итп while(i--) arr.push([tr[i],tr[--i]]); return function(){ i=j; arr.sort(function(){return .5-Math.random()}); while(i--) if(arr[i][1].id!=='play'+NOWplaying){ table.appendChild( arr[i][1] ); table.appendChild( arr[i][0] ); } } }(); </script> </body> </html> |
хмм, поставил, ни ошибок, ни раскидывания.... ищю в этом связь...
нашел. переменная table и tr уже используется... исправляю. |
попробовал так, неполучилось =)
var tablei = document.getElementById('musiс'), tri = tablei.rows, i=tri.length, j=i/2, arr = []; tablei=tri[0].parentNode; //ибо tbody итп while(i--) arr.push([tri[i],tri[--i]]); return function(){ i=j; arr.sort(function(){return .5-Math.random()}); while(i--) if(arr[i][1].id!=='play'+NOWplaying){ tablei.appendChild( arr[i][1] ); tablei.appendChild( arr[i][0] ); } } ааа, переменная "i" тоже используется, причем обновляется приблизительно каждую миллисекунду |
сделал так:
function inzrb() { // старая, рабочая, недоработанная версия //for (var b = $(scnpp), a = b.rows, c = a.length, b = a[0].parentNode; scnt < c--;) //c % scnt && (sppen > Math.random() ? (b.appendChild(a[c - 1]), b.appendChild(a[c - 1])) : //(b.insertBefore(a[c], a[0]), b.insertBefore(a[c], a[0]))); var tablei = document.getElementById('music'), tri = tablei.rows, ind=tri.length, j=ind/2, arr = []; tablei=tri[0].parentNode; //ибо tbody итп while(ind--) arr.push([tri[ind],tri[--ind]]); return function(){ ind=j; arr.sort(function(){return .5-Math.random()}); while(ind--) if(arr[ind][1].id!=='play'+NOWplaying){ tablei.appendChild( arr[ind][1] ); tablei.appendChild( arr[ind][0] ); } } } в итоге мертвая тишина. ошибок нет, но и прогресса нет |
хмм, давай в асе или еще гденить договоримся, и об оплате заодно
|
Часовой пояс GMT +3, время: 00:47. |