Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   хочу чтобы находил случайный img, но не работает код (https://javascript.ru/forum/events/60346-khochu-chtoby-nakhodil-sluchajjnyjj-img-no-ne-rabotaet-kod.html)

orionpro 23.12.2015 17:48

хочу чтобы находил случайный img, но не работает код
 
Есть div с классом block_img в нём картинки img. (они скрыты) Я их нахожу и вставляю в другой div... но не могу вывести именно случайную картинку, ибо arrImg[rand] как описано во всех примерах не хочет взять эту случайную картинку.
var block_img = document.querySelectorAll('.block_img img');
    var block_image_show_one = document.querySelector('.block_image_show_one');

    for (var i = 0; i < block_img.length; i++) {

        var arrImg = block_img[i];
        var rand = Math.floor(Math.random() * arrImg.length);



        block_image_show_one.appendChild(arrImg);
    }

В итоге я их нахожу и вставляю в нужный мне div , но только все картинки. А надо только одну случайную... В чём проблема? Спасибо за помощь.

laimas 23.12.2015 17:52

Цитата:

Сообщение от orionpro
А надо только одну случайную... В чём проблема?

В цикле.

orionpro 23.12.2015 17:57

Цитата:

Сообщение от laimas (Сообщение 401097)
В цикле.

Не могли бы вы, милейший, более подробно объяснить. Я нахожу ведь все картинки... почему после прохождения цикла, успешно найдя все картинки, я не могу вычленить случайную картинку (.

laimas 23.12.2015 18:01

Цитата:

Сообщение от orionpro
Я нахожу ведь все картинки... почему после прохождения цикла, успешно найдя все картинки, я не могу вычленить случайную картинку

А зачем циклом находить картинки, если вам требуется только одна из них? Одна, значит зная длину массива нужно сформировать число из диапазона индексов массива изображений - от 0 до длина массива - 1.
Сформировали, получаете по этому индексу изображение (путь/имя), отображаете.

orionpro 23.12.2015 18:13

Цитата:

Сообщение от laimas (Сообщение 401100)
А зачем циклом находить картинки, если вам требуется только одна из них? Одна, значит зная длину массива нужно сформировать число из диапазона индексов массива изображений - от 0 до длина массива - 1.
Сформировали, получаете по этому индексу изображение (путь/имя), отображаете.

Так мысль же в том, чтобы случайно взять картинку из массива картинок. А циклом прохожу, чтобы проверить сколько картинок. Вдруг картинок станет больше или меньше? Просто идея в случайности. Из имеющихся картинок я буду выбирать не в одно место, а в три разных блока. Но это потом, в начале хотя бы в один, чтобы работало...

orionpro 23.12.2015 18:21

Вот пример на learn.javascript.ru
var arr = ["Яблоко", "Апельсин", "Груша", "Лимон"];

var rand = Math.floor(Math.random() * arr.length);

alert( arr[rand] );

Он же работает. Случайным образом получает значение массива ...

рони 23.12.2015 18:35

orionpro,
arrImg у вас одна картинка какую длину вы хотите получить у одной картинки в arrImg.length?

рони 23.12.2015 18:37

orionpro,
var block_img = document.querySelectorAll('.block_img img');
var block_image_show_one = document.querySelector('.block_image_show_one');
var rand = Math.floor(Math.random() * block_img.length);
var arrImg = block_img[rand];
block_image_show_one.appendChild(arrImg);

laimas 23.12.2015 18:46

Цитата:

Сообщение от orionpro
Вот пример на learn.javascript.ru

Цитата:

Сообщение от orionpro
Он же работает.


Ну так как он работает? :)

orionpro 23.12.2015 18:52

Цитата:

Сообщение от рони (Сообщение 401109)
orionpro,
var block_img = document.querySelectorAll('.block_img img');
var block_image_show_one = document.querySelector('.block_image_show_one');
var rand = Math.floor(Math.random() * block_img.length);
var arrImg = block_img[rand];
block_image_show_one.appendChild(arrImg);

Получается, что этом коде
var block_img = document.querySelectorAll('.block_img img');

я уже выбираю все картинки? Просто, как-то сталкивался с тем, что только циклом можно было успешно сделать.
var elem = document.querySelectorAll(".historyList");
        // цикл проверяет все элементы с классом historyList 
        for (var i = 0; i < elem.length; i++) {

            elem[i].remove(); // и потом удаляет их

        }

Если убираем цикл и пытаемся удалить elem.remove(); то ничего не работает.(elem.remove is not a function). Наверное из-за этого и решил применить такое и на img. Большое спасибо, Ваш код работает, как надо!

orionpro 23.12.2015 18:54

Цитата:

Сообщение от laimas (Сообщение 401111)
Ну так как он работает? :)

Я ошибался, когда думал, что циклом я получу массив из картинок... А в примере был создан именно массив.

рони 23.12.2015 18:56

Цитата:

Сообщение от orionpro
в три разных блока

var block_img = document.querySelectorAll('.block_img img');
var block_image_show_one = document.querySelectorAll('.block_image_show_one');//блоки
block_img = [].slice.call(block_img);
for (var i=0; i<block_image_show_one.length; i++)  {
var rand = Math.floor(Math.random() * block_img.length);
var arrImg = block_img.splice(rand,1)[0];
if(arrImg)block_image_show_one[i].appendChild(arrImg);
}

laimas 23.12.2015 19:02

Цитата:

Сообщение от orionpro
Я ошибался, когда думал, что циклом я получу массив из картинок

:)

var block_img = document.querySelectorAll('.block_img img'); - ну так запуская цикл именно для block_img, указывая block_img.length, понимаете же, что это коллекция. Циклом вы лишь перебираете ее, что может потребоваться для каких-то операций.

orionpro 23.12.2015 19:15

Цитата:

Сообщение от рони (Сообщение 401114)
var block_img = document.querySelectorAll('.block_img img');
var block_image_show_one = document.querySelectorAll('.block_image_show_one');//блоки
block_img = [].slice.call(block_img);
for (var i=0; i<block_image_show_one.length; i++)  {
var rand = Math.floor(Math.random() * block_img.length);
var arrImg = block_img.splice(rand,1)[0];
if(arrImg)block_image_show_one[i].appendChild(arrImg);
}

я добавил
var block_image_show_one = document.querySelectorAll('.block_image_show_one, .block_image_show_two,  .block_image_show_three'); //блоки

и всё работает ,супер (добавляет). Вот только я не совсем понял, что происходит в этом коде
var arrImg = block_img.splice(rand,1)[0];
он разделяет массив block_img с помощью rand случайно, но что такое [0]? Он оставляет один элемент в массиве, если их больше?

orionpro 23.12.2015 19:18

Или rand - случайное значение массива, т.е. в данном случае - картинка случайная?

рони 23.12.2015 19:21

orionpro,
splice возвращает "вырезку" в виде массива, поэтому [img], вырезали случайно 1 элемент из block_img, чтоб эта картинка больше не участвовала в конкурсе :) получили массив из одной картинки -- но нам нужна сама картинка а не массив, поэтому [img][0]

orionpro 23.12.2015 21:17

Цитата:

Сообщение от рони (Сообщение 401119)
orionpro,
splice возвращает "вырезку" в виде массива, поэтому [img], вырезали случайно 1 элемент из block_img, чтоб эта картинка больше не участвовала в конкурсе :) получили массив из одной картинки -- но нам нужна сама картинка а не массив, поэтому [img][0]

Большое спасибо, я ещё поэкспериментирую с этим, чтобы лучше понять.

orionpro 23.12.2015 21:29

Особенно эту строчку
block_img = [].slice.call(block_img);
. Мы в ней создаем пустой массив, потом... splice возвращает, а call... пока не понимаю. Создаем массив из картинок, что-ли, но потом мы это применяем в переменной arrImg и там опять splice .

orionpro 23.12.2015 21:59

Как я понял,
[].slice.call(block_img)

Мы вызываем метод slice прототипа Array (то бишь массива) и применяем его к аргументу block_img ? Поправьте меня пожалуйста. Может я не так понимаю.

рони 23.12.2015 22:05

Цитата:

Сообщение от orionpro
Создаем массив из картинок

да
Цитата:

Сообщение от orionpro
там опять splice

откуда опять?

рони 23.12.2015 22:09

orionpro,
block_img = [].slice.call(block_img); превращение выборки картинок из псевдо-массива в настоящий массив
var arrImg = block_img.splice(rand,1) вырезание части массива картинок [0] и выборка из вырезанного первого элемента;

orionpro 23.12.2015 22:19

Цитата:

Сообщение от рони (Сообщение 401147)

откуда опять?

Этот вопрос снимаю. Там мы уже работаем с массивом block_img
var arrImg = block_img.splice(rand,1)[0]

Вы мне это уже объяснили.

orionpro 23.12.2015 22:23

Цитата:

Сообщение от рони (Сообщение 401149)
var arrImg = block_img.splice(rand,1) вырезание части массива картинок [0] и выборка из вырезанного первого элемента;

Вырезаем случайно, ибо входит аргумент rand, так же? А почему первого? Разве rand выбрал не один случайный элемент? Или он создал массив в случайной последовательности ? Из которого мы берём один элемент? Извините за кучу вопросов ...

рони 23.12.2015 22:24

orionpro,
на всякий случай slice и splice разные методы :)

рони 23.12.2015 22:28

Цитата:

Сообщение от orionpro
Вырезаем случайно, ибо входит аргумент rand, так же?

да случайно
Цитата:

Сообщение от orionpro
Разве rand выбрал не один случайный элемент?

нет rand это откуда резать а 1 сколько отрезать
Цитата:

Сообщение от orionpro
Или он создал массив в случайной последовательности ?

массив идёт попорядку, но вырезан из случайного места.
Цитата:

Сообщение от orionpro
Из которого мы берём один элемент?

да. потому что нам не нужен массив а нужен элемент.

orionpro 23.12.2015 22:33

Цитата:

Сообщение от рони (Сообщение 401154)
orionpro,
на всякий случай slice и splice разные методы :)

Вот это я гоню ...) Читал с мобильного, потом уже сел за компьютер. Спасибо.

orionpro 23.12.2015 22:53

Цитата:

Сообщение от рони (Сообщение 401155)
массив идёт попорядку, но вырезан из случайного места.

Из случайного места ... но какой длинны (имею ввиду количество элементов)? Длинна этого массива - количество всех картинок?
var rand = Math.floor(Math.random() * block_img.length);

рони 23.12.2015 23:12

Цитата:

Сообщение от orionpro
но какой длинны

какой укажите в месте где сейчас 1
Метод splice

Deff 24.12.2015 02:51

В принципе картинки лучше гонять по кругу(Из опыта войны во вьетнаме)
Особенно если их менее десятка. Поскольку зачастую одни и те же повтряются, а какой нидь 3-й элемент долго отсутствует
Гонять рандомно стоит картинки с цитатами и когда их много

orionpro 24.12.2015 14:00

Цитата:

Сообщение от Deff (Сообщение 401192)
В принципе картинки лучше гонять по кругу(Из опыта войны во вьетнаме)
Особенно если их менее десятка. Поскольку зачастую одни и те же повтряются, а какой нидь 3-й элемент долго отсутствует
Гонять рандомно стоит картинки с цитатами и когда их много

Спасибо. Ну пока их там 13.)

orionpro 30.12.2015 20:52

Опять к Вам с вопросом люди добрые). Продолжение того что выше, вывожу в canvas картинки...
var canvas = new fabric.Canvas('c');
    var imgElement = document.querySelector('.block_image_show_1 .my-image');
    var imgInstance = new fabric.Image(imgElement, {

    });
    var canvas2 = new fabric.Canvas('c');
    var imgElement2 = document.querySelector('.block_image_show_2 .my-image');
    var imgInstance2 = new fabric.Image(imgElement2, {

        left: 100
    });
    var canvas3 = new fabric.Canvas('c');
    var imgElement3 = document.querySelector('.block_image_show_3 .my-image');
    var imgInstance3 = new fabric.Image(imgElement3, {
        left: 200

    });
    var imgGroup = [imgInstance, imgInstance2, imgInstance3];
    canvas.add(new fabric.Group([imgInstance, imgInstance2, imgInstance3], {

    }));

    for (var v = 0; v < imgGroup.length; v++) {

    }

    var btn = document.querySelector('.btn');

    btn.addEventListener('click', function() {

        imgGroup[v].animate('left', 500, {
            onChange: canvas.renderAll.bind(canvas),
            duration: 5000,
            easing: fabric.util.ease.easeOutBounce
        });


    });

В переменной var imgGroup лежат все картинки, хочу в этом моменте весь массив использовать, чтобы анимировать все картинки сразу (их просто будет больше)
imgGroup[v].animate('left', 500, {
            onChange: canvas.renderAll.bind(canvas),
            duration: 5000,
            easing: fabric.util.ease.easeOutBounce
        });

но не могу использовать все массивы. Если написать просто
imgGroup[0]
, то один элемент спокойно себе анимируется... Что делать?
ps цикл я для пробы создал, но он не работает , точней не хочет анимация работать...

рони 30.12.2015 21:10

orionpro,
кто его знает, что такое fabric ... так-что лучше почитать вам документацию ... и не только на fabric

orionpro 30.12.2015 21:17

Цитата:

Сообщение от рони (Сообщение 402027)
orionpro,
кто его знает, что такое fabric ... так-что лучше почитать вам документацию ... и не только на fabric

Фабрик то ясно, что неведомая зверушка). Но вот, как мне весь массив объявить, а не один элемент массива imgGroup[0]... просто не писать же 10 раз анимацию под каждый объект. А этот fabric на canvas построен ... И согласен, документацию читаю, но её не густо, как всегда. Выбрал такой способ анимации. Возможно он не правильный, но делает, то что надо, вот пока не со всеми картинками.

рони 30.12.2015 21:23

orionpro,
строку 23 может перенести на 30 и 25 на 36 :-?

orionpro 30.12.2015 21:29

Цитата:

Сообщение от рони (Сообщение 402029)
orionpro,
строку 23 может перенести на 30 и 25 на 36 :-?

:) Ну да... теперь всё элементы задействованы. Спасибо. Буду читать дальше.


Часовой пояс GMT +3, время: 11:21.