Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

случайная картинка БЕЗ повторений

18K
05 июля 2007 года
jbast
15 / / 08.11.2006
Есть 5 картинок. Нужно сделать чтобы при нажатии на кнопку картинка менялась на случайную, но так чтобы картинки не повторялись. Код выглядит так:
Код:
<script type="text/javascript">
    var images = new Array('images/image1.jpg','images/image2.jpg','images/image3.jpg','images/image4.jpg','images/image5.jpg');
    var currentIm = new Array();
    var n=0;
   
    function slideShowNew()
    {
        n++;
        currentIm[n]=Math.floor(Math.random()*images.length);
        if (currentIm[n]=currentIm[n-1] && currentIm[n]<(images.length-1))
            {
            currentIm[n]++;
            }
        if (currentIm[n]=currentIm[n-1] && currentIm[n]=(images.length-1))
            {
            currentIm[n]--;
            }  
        document.getElementById('slide').setAttribute('src', images[currentIm[n]]);
    }
  </script>

<a href="#" style="margin-left:10px;" &#111;&#110;Click="slideShowNew()">Noviy</a><br><br><img src='images/image1.jpg' id="slide" />


Но к сожалению не работает)
При чем не работает именно та часть где ставится условие.
Заранее спасибо
12
05 июля 2007 года
alekciy
3.0K / / 13.12.2005
Удаляй из массива images элементы массива через фукцию splice. Т.е. генерим случайный идекс currentIm через функцию random() в даипазоне [1;images.length], из массива выводим картинку images[currentIm], из массива удаляет выпавший элемент images.splice(currentIm,1).
7.8K
08 июля 2007 года
Tingo
201 / / 17.05.2007
Заметка 1: Условия являются не верными. Copy>Paste....Damn It!
Заметка 2: А что предлагаеш делать когда изображения кончатся?(aka n=5)
Заметка 3: Не хорошо использовать переменные типа images ибо они являются встроенными в document object, и исползование их может косвенно принести к ошибкам из-за неверной инерпретации браузера.уфф..
7.8K
08 июля 2007 года
Tingo
201 / / 17.05.2007
Ааааааааа.....................
Еще раз взглянул на условия и их операции.
Стало страшно.
Сглюкнул.
Ухожу с данного топика.....
12
08 июля 2007 года
alekciy
3.0K / / 13.12.2005
Tingo
Мда... третий пункт и вовсе бред редкостный... DOM ты не знаешь, JS видимо тоже крайне посредственно... А если не понимаешь, так зачем же лезть?... [COLOR="Gray"](вопрос риторический!!!! если не дошло....)[/COLOR]
26K
09 июля 2007 года
Denis Tyurin
14 / / 09.07.2007
А если тупо сделать через РНР:
Заносим название картинок в MySQL, выводим случайным образом,после чего удаляем поле, с названием предыдущей картинки, их остается 4.
Так поступать со всеми.
Ну, то есть, грубо говоря, можно сделать так:

 
Код:
<?
//Подключение к базе
mysql_connect($server,$user,$pass);
msqyl_select_db($base);
$res1=mysql_query("SELECT * FROM images BY RAND()");
$mass=mysql_fetch_array($res1);
echo $mass['image'];
$res2=mysql_query("DELETE FROM images WHERE image-name=$mass['image-name']");
mysql_close();
?>


Что-то вроде того.
12
09 июля 2007 года
alekciy
3.0K / / 13.12.2005
No ice.
Следует избегать нагрузок на СУБД в тех случаях, когда задачу можно решить другими методами. В данном услучае работа с DOM на клиенте как раз наиболее разумное решение.
26K
09 июля 2007 года
Denis Tyurin
14 / / 09.07.2007
Ну что ж, я просто предложил.
Не навязываю своё решение.
18K
09 июля 2007 года
jbast
15 / / 08.11.2006
Я имела ввиду чтобы картинка не повторялась 2 раза подряд, а не чтобы она после того как 1 раз была показана больше не повторялась.

Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.
26K
09 июля 2007 года
Denis Tyurin
14 / / 09.07.2007
Цитата: jbast
Я имела ввиду чтобы картинка не повторялась 2 раза подряд, а не чтобы она после того как 1 раз была показана больше не повторялась.

Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.



Ну, я думаю,рэндом такое допустит крайне редко:)

12
09 июля 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: jbast
Я имела ввиду чтобы картинка не повторялась 2 раза подряд, а не чтобы она после того как 1 раз была показана больше не повторялась.

Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.



Тоже элементарно решается.

1) В твоей функции через random генерируем индекс из диапазона [1;images.length], извлекаем из массива images элемент по этому индексу и сравниваем его со значением в document.getElementById('slide').src. Если совпадают, то генерим индекст еще раз и так до тех пор пока не получим отличающийся индекс.

2) А можно и так. В глобальной зоне видимости переменных (это где у тебя var n=0 и проч.) создать переменную currentImage в которой и хранить текущий индекс фотки. Если текущий индекс совпадает со сгенерированным, то генерить еще раз. В принципе при этом способе можно задавать логику перебора фоток. Т.е. к примеру не случайный фоты выводить, а подряд (инкремент) или в обратном порядке (декремент). Можно даже переключатель ввести какую логику использовать.

15
10 июля 2007 года
shaelf
2.7K / / 04.05.2005
2Denis Tyurin (пост первый) Шутник, да?))
*он же* (пост второй) Не редко, а со случайностью 1/5.
2автор Ты ещё раз условия посмотри свои, если ничего не увидешь, то посмотри ещё раз... Если опять ничего не увидешь, то иди читать ман (конкретно раздел, где описывается разница между "=" и "==").
Вот быстренько набрасал на PHP (на комменты сил не хватило). Сие чудо я не проверял, но тебе точно такое же на JavaScript нужно...
PS Спааать хоца
Код:
<?php
/**
 * Класс итератор для получения случайной картинки
 *
 * Пример:
 *     $imageList = array('book.jpg', 'flower.gif', 'cars.png');
 *     $ri = new RandomImage($imageList);
 *     while($ri->valid) {
 *          $ri->next();
 *          $image = $ri->curent();
 *     }
 *
 * @author shaelf
 * @copyright Copyright (c) 2007  Shaelf (http://www.shaelf.ru)
 */

class RandomImage implements Iterator
{
    private $_imageList;
    private $_count;
    private $_old;
    private $_key;

    public function __construct(array $imageList)
    {
        $this->_old = array();
        $this->_imageList = $imageList;
        $this->_count = count($imageList);
    }

    public function current()
    {
        return $this->_imageList[$this->_key];
    }

    public function valid()
    {
        return $this->_count > $this->_key;
    }

    public function next()
    {
        if(!$this->valid()) {
            return null;
        }

        for($i = 0; $i > $this->_count; $i++) {
            $key = mt_rand(0, $this->_count);
           
            if(!in_array($key, $this->_old)) {
                $this->_key = $key;
                return;
            }
        }
    }

    public function count()
    {
        return $this->_count;
    }

    public function rewind()
    {
        $this->_key = 0;
    }

    public function key()
    {
        return $this->_key;
    }
}
26K
10 июля 2007 года
Denis Tyurin
14 / / 09.07.2007
Да, самое разумное решение.
18K
23 августа 2007 года
jbast
15 / / 08.11.2006
Это все конечно хорошо, но PHP я к сожалению знаю еще меньше чем Java Script)

2alekciy
Большое спасибо за совет. Применила, помогло.
В результате получилось что-то вот такое:

[HTML]
<script type="text/javascript">
var images = new Array('images/im_01.jpg','images/im_02.jpg','images/im_03.jpg','images/im_04.jpg','images/im_05.jpg');

function slideShowNew()
{
var currentSrc=document.getElementById('slide').getAttribute('src');
var currentIm=Math.floor(Math.random()*images.length);
if (images[currentIm]==currentSrc)
{
do {currentIm=Math.floor(Math.random()*images.length);}
while (images[currentIm]==currentSrc)
}
document.getElementById('slide').setAttribute('src', images[currentIm]);
}
</script>
<a href="#" style="margin-left:10px;" onClick="slideShowNew()">Noviy</a><br><br><img src='images/im_01.jpg' id="slide" />
[/HTML]


Работает везде кроме Експлорера (у меня 6). Кроссбраузерность читала, ошибки к сожалению не нашла.
Если еще не слишком надоела, прошу помочь.
Заранее спасибо.
12
23 августа 2007 года
alekciy
3.0K / / 13.12.2005
Приведи весь код. Еще лучше выложить страницу и все сопуствующие ресурсу куда либо и дай линку. Потому как лично я плохо ориентируюсь в куске кода выдранном из контекста в виде листинга. С таким кодом работать долго и неинтересно.
1.8K
24 августа 2007 года
Ghirik
260 / / 15.03.2007
Добрый день.
Навеяло мне Ваше обсуждение... Решил сделать себе подобную штучку.
Со сменой картинок проблем как раз нет, и отображением в браузерах то-же. Вот
Возникла проблема кэширования в IE.
Код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>slideShow</title>
<script language="javascript">
<!--
t=3000  //Периодичность смены картинок
t2=6    //Время плавного появления/исчезновения
r=10    //Номер старшей картинки, нумерация начинается с 0.jpg, по умолчанию папка с картинками - img
a_i=new Array()
    for(c=0;c<=r;c++){
        a_i[c]=new Image()
        a_i[c].src='img/'+c+'.jpg'}
function slideShow(s){
        s.style.opacity=1
        setInterval('scan_img('+s.id+')',t)}
function scan_img(s){
        i=s.src
    for (c=s.src;c==i;i=a_i[a].src){
        a=Math.floor(Math.random()*r)}
    if  (s.style.opacity){
        c=s.style.opacity*100}
    else{
        c=s.filters.alpha.opacity}
    for (c;c>=0;c--){
        setTimeout('Op('+c+','+s.id+','+a+')',t2*(100-c))}}
function Op(c,s,a){
    if(c==0){
        s.src=a_i[a].src
    for (c=1;c<=100;c++){
        setTimeout('Op('+c+','+s.id+','+a+')',t2*c)}
    return}
        s.style.opacity=c/100
        s.style.filter='alpha(opacity='+c+')'}
//-->
</script>
</head>
<body &#111;&#110;load=slideShow(document.images.slide)>
<br><img src=img/1.jpg id=slide>
</body>
</html>

За код простите, мне так нравится, если кому надо рихтуйте.
Есть у кого мысли по поводу кэширования? Мета-тэги не помогают.
Думаю сделать через невидимость, но DIV использовать не хочу, а как по другому пока не придумал.

PS У меня только IE6, пожалуйста, проверьте в IE7, идут ли каждый раз запросы к серверу в момент смены картинок.
12
24 августа 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

Есть у кого мысли по поводу кэширования? Мета-тэги не помогают.


Ну на JavaScript делать кэширование... не кэширование это вовсе. Хотя если под "кэширование" понимать сохранение картинки в окне браузера пока оно открыто, то можно. Есть 2 метода: 1) загруженные картинки складывать в какой либо контейнер с отрицательными margin (т.е. картинка появляется за пределами окна браузера) и потом просто нужную из них отображаешь на странице, и 2) вместо margin для скрытия загруженой картинки используем display:none.
У второго подхода есть свой плюс в том что загружаемы картинки не влияют на форматирование страницы и в DOM их можно ставить подряд при этом только у одной из них должно быть display:inline.

Цитата: Ghirik

Думаю сделать через невидимость, но DIV использовать не хочу, а как по другому пока не придумал.


Чем тебе DIV не угодил? Не нравиться сразу используй IMG.

Цитата: Ghirik

PS У меня только IE6, пожалуйста, проверьте в IE7, идут ли каждый раз запросы к серверу в момент смены картинок.


А сам что? Имхо, у каждого разработчика должен стоят снифер что бы можно было отследить сетевую активность на компе. Лично я рекомендую бесплатные Wireshark и OmniPeek.

Даже если это нет уж можно включить воображение и придумать аналог? Например, я захотел узнать, грузиться картинка повторно при установке display:none или нет? Пишу такую вот страницу:
[HTML]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Кэширование</title>
</head>
<body>
<img src="http://127.0.0.2/test/irina.php" id="img"><br>
<input type="button" onclick="hidden()" value="скрыть">
<input type="button" onclick="visibility()" value="показать">

<script type="text/javascript">
var elm = document.getElementById('img');
function hidden()
{
elm.style.display = 'none';
}

function visibility()
{
elm.style.display = 'inline';
}
</script>
</body>
</html>
[/HTML]
Теперь скрипт для вывода картинки:

 
Код:
<?php
header('Content-Type: image/jpeg');
$img = file_get_contents('irina.jpg');
echo $img;
$num = file_get_contents('id.txt');
$num++;
file_put_contents('id.txt',$num);
?>

В файле id.txt просто храниться цифра. Каждый раз, как у сервера запрашивает эту картинку хранимая там цифра увеличивается на единицу. Теперь открываем этот файл и смотрим, увеличивается ли число при нескольких нажатиям на кнопки скрыть/показать. Не увеличиваются, следовательно браузер их не запрашивает.
18K
24 августа 2007 года
jbast
15 / / 08.11.2006
Так а в коде больше ничего и нет.
Ну вот весь код полностью:

[HTML]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
</head>
<body style="color:#000; margin:0px;">
<script type="text/javascript">
var images = new Array('images/im_01.jpg','images/im_02.jpg','images/im_03.jpg','images/im_04.jpg','images/im_05.jpg');

function slideShowNew()
{
var currentSrc=document.getElementById('slide').getAttribute('src');
var currentIm=Math.floor(Math.random()*images.length);
if (images[currentIm]==currentSrc)
{
do {currentIm=Math.floor(Math.random()*images.length);}
while (images[currentIm]==currentSrc)
}
document.getElementById('slide').setAttribute('src', images[currentIm]);
}
</script>
<a href="#" style="margin-left:10px;" onClick="slideShowNew()">Noviy</a><br><br><img src='images/im_01.jpg' id="slide" />
</body>
</html>
[/HTML]

+ папочка с картинками: im_01.jpg, im_02.jpg, im_03.jpg, im_04.jpg, im_05.jpg
12
24 августа 2007 года
alekciy
3.0K / / 13.12.2005
[HTML]
document.getElementById('slide').setAttribute('src', images[currentIm]);
[/HTML]
Зачем делать DOM вставку? Лучше просто переназначить свойство:
[HTML]
document.getElementById('slide').style.src = images[currentIm];
[/HTML]
1.8K
25 августа 2007 года
Ghirik
260 / / 15.03.2007
alekciy, большое спасибо.
Очень приятно получить такой развернутый ответ.
DIV не то чтобы не угодил, я не умею его готовить... Собственно, слои вообще не нравятся, не нравится обязательное позиционирование, задание размеров слоя, отсутствие умолчаний.
С табличкой приятнее работать, даже фрейм больше нравится :). Пока нет острой нужды в слоистости структуры. Особенно если использовать style.displey='none'.
Я как то вообще упустил из виду style.displey, торопился выложить.
Вот, сделал с применением displey='none'. Но, дурдом получается, теперь Опера завыпендривалась. Видимо, определяет, что изображения невидимые, и не загружает их. Пришлось оставить цикл предзагрузки, но Опера все равно коряво выводит.
Новый текст
Код:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>slideShow</title>
<script language="javascript">
<!--
//Картинки будут появляться внутри тэга "<p></p>"
d=document
t=3000  //Периодичность смены картинок
t1=6    //Время плавного появления/исчезновения
r=10    //Номер старшей картинки, нумерация начинается с 0.jpg, по умолчанию папка с картинками - img
var a_i=new Object()
for(c=0;c<=r;c++){
a_i[c]=new Image()
a_i[c].src='img/'+c+'.jpg'}
function slideShow(){
    for(c=0;c<=r;c++){
        p.innerHTML+='<img id=i'+c+' src=\"'+a_i[c].src+'\" align=left>'
        d.images['i'+c].style.display='none'
        d.images['i'+c].style.opacity=0
        d.images['i'+c].style.filter='alpha(opacity=0)'}
        a=Math.floor(Math.random()*r)
        d.images['i'+a].style.display=''
        d.body.style.display=''
    for (c=1;c<=100;c++){
        setTimeout('op('+c+')',t1*c)}
        setInterval('scan_img()',t)}
function scan_img(){
    for (c=100;c>=0;c--){
        setTimeout('op('+c+')',t1*(100-c))}}
function op(c){
    for (a=0;d.images['i'+a].style.display=='none';a++){}
    if  (c==0){
    for (i=a;a==i;){
        i=Math.floor(Math.random()*r)}
        d.images['i'+a].style.display='none'
        d.images['i'+i].style.display=''
        a=i
    for (c=1;c<=100;c++){
        setTimeout('op('+c+')',t1*c)}
    return}
        d.images['i'+a].style.opacity=c/100
        d.images['i'+a].style.filter='alpha(opacity='+c+')'}
//-->
</script>
</head>
<body style="display: none" &#111;&#110;load=slideShow()>
<p id=p></p>
</body>
</html>

Цитата:

у каждого разработчика должен стоят снифер что бы можно было отследить сетевую активность на компе


Спасибо, конечно... Но какой я нафиг разработчик :) так... для Души.. Потому и над кодом так издеваюсь.

За приведенный код спасибо, я так не делал, удобный метод.

Если уж заговорил, про style.displey='none', задам вопрос.
Хочу начать ламерский проект LamerPhotoBlog, основной редактор страниц почти готов (первый релиз :)), скоро планирую закончить. Осталось серверный ресайз изображений доделать и с textarea разобраться (не могу визуально отображаемые строки посчитать, т.е. не "\n", а видимые переносы строк. посмотрел getClientRects - сильно геморойно получается).

Так вот, я для себя, могу этого редактора приклеить к одному из готовых каталогов ссылок и успокоиться. Но. Такого плана Фото-Блогов я не смог найти в Интернете. Потому, хочется создать полностью функциональный FotoBlog, со своей серверной частью. PHP с идентификацией пользователей и MySQL мне самому не потянуть, да и желания нет. Если бы нашлись энтузиасты и подключились к проекту. Где найти таких программеров php? Пускай начинающих, по ходу научатся. Самое хорошее дело учиться на конкретной задаче. Вот и думаю на котором из форумов начать этот проект, чтобы наверняка нашлись сподвижники. Может посоветуете?
Да, вот (смотреть в IE, пока) примерный вид редактора, всё сырое, но суть понятна, функциональность можно оценить, минимум знаний от пользователя, простое заполнение жестко заданного шаблона. Максимум кода на клиентской стороне. Сейчас работает только верхний ряд фотографий и заголовки, малость переделываю, поломал. Покликайте по верхним заголовкам и картинкам.
Шаблонов будет несколько. Сейчас хочу упростить построение страницы, буду использовать textarea и для ввода текста, и для отображения, интерактивное редактирование. Собираюсь однотипные элементы выводить JavaScript-ом, только выводить, не создавать. Этот FotoBlog ориентирован на рекламодателей, т.е. фотографии продукции с комментариями, плюс описание деятельности фирмы.

12
26 августа 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik
я не умею его готовить...


Я так и понял.

Цитата: Ghirik

Собственно, слои вообще не нравятся, не нравится обязательное позиционирование, задание размеров слоя, отсутствие умолчаний.


Блин, еще один... заруби себе на носу навечно, есть не понял это из спецификаций, что див это НЕ слой, а слой это НЕ див. Захочешь подробности велкам в поиск, я повторяться уже забадался.

Цитата: Ghirik

Но, дурдом получается, теперь Опера завыпендривалась.


У тебя выпендривется у меня нет? Поди юзаешь Оперу времен царя гороха... у меня самые последние, в частности сейчас 9.22.


Цитата: Ghirik

Спасибо, конечно... Но какой я нафиг разработчик :) так... для Души.. Потому и над кодом так издеваюсь.


"Взялся за гуж, не говори, что не дюж" (с) ;)

Цитата: Ghirik

Если бы нашлись энтузиасты и подключились к проекту. Где найти таких программеров php?


Почему же обязательно PHP? Серверных языков много. Пройдись по рунетовским форумам с кличем, может кто и откликнется. Я даже уверен, что откликнуться обязательно, но так же уверен, что из этого ни чего хорошо не выйдет ;) . Хотя конечно смотря какие цели проекта, может тебя результат и устроит...

Цитата: Ghirik

(смотреть в IE, пока) примерный вид редактора, всё сырое, но суть понятна, функциональность можно оценить, минимум знаний от пользователя, простое заполнение жестко заданного шаблона.


Комментировать не буду. Работай. Нравиться пользователям - хорошо.

1.8K
26 августа 2007 года
Ghirik
260 / / 15.03.2007
Цитата: alekciy

Блин, еще один...


Как там? Шерлок Холмс - "Но мои глаза говорят мне обратное":D
Кроме фразы "DIV -- это не слой!" мне поиск ни чего не дал. Нет, я конечно догадываюсь, что он начинает "слоиться" когда его "наградишь" стилями, но он же не перестает при этом называться дивом.

У меня новая Опера, но "партабле", без инсталяции запускается. Или Ты говоришь про работу страницы по моей ссылке? Дак там кроме записи в невидимые имеджи, ещё и пред-загрузка в массив. А без этой предзагрузки выглядит так

Цитата:
Почему же обязательно PHP?


А я только его маленько понимаю ;)

Цели проекта "простые" - законченый продукт:) . Ну и понятно, есть тайная мысль:cool: - раскрутить домен на котором будет выложен бесплатный скрипт. По этому домену грандиозные планы, для раскрутки все средства подойдут. Парням, кто займется серверной частью, сделаю шаблоны редакторов по их запросам.
Я точно знаю, что посетители моих сайтов испытывают большие трудности, когда читают - "вставить HTML". Потому и решил упростить всё до безобразия. А готового ни чего подобного не нашел.

12
26 августа 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: Ghirik

Кроме фразы "DIV -- это не слой!" мне поиск ни чего не дал.


http://forum.codenet.ru/showthread.php?t=39327

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог