случайная картинка БЕЗ повторений
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;" onClick="slideShowNew()">Noviy</a><br><br><img src='images/image1.jpg' id="slide" />
Но к сожалению не работает)
При чем не работает именно та часть где ставится условие.
Заранее спасибо
Заметка 2: А что предлагаеш делать когда изображения кончатся?(aka n=5)
Заметка 3: Не хорошо использовать переменные типа images ибо они являются встроенными в document object, и исползование их может косвенно принести к ошибкам из-за неверной инерпретации браузера.уфф..
Еще раз взглянул на условия и их операции.
Стало страшно.
Сглюкнул.
Ухожу с данного топика.....
Мда... третий пункт и вовсе бред редкостный... DOM ты не знаешь, JS видимо тоже крайне посредственно... А если не понимаешь, так зачем же лезть?... [COLOR="Gray"](вопрос риторический!!!! если не дошло....)[/COLOR]
Заносим название картинок в 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();
?>
Что-то вроде того.
Следует избегать нагрузок на СУБД в тех случаях, когда задачу можно решить другими методами. В данном услучае работа с DOM на клиенте как раз наиболее разумное решение.
Не навязываю своё решение.
Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.
Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.
Ну, я думаю,рэндом такое допустит крайне редко:)
Т.е.если сейчас показана 1-я картинка, нужно чтобы она не менялась на 1-ю.
Тоже элементарно решается.
1) В твоей функции через random генерируем индекс из диапазона [1;images.length], извлекаем из массива images элемент по этому индексу и сравниваем его со значением в document.getElementById('slide').src. Если совпадают, то генерим индекст еще раз и так до тех пор пока не получим отличающийся индекс.
2) А можно и так. В глобальной зоне видимости переменных (это где у тебя var n=0 и проч.) создать переменную currentImage в которой и хранить текущий индекс фотки. Если текущий индекс совпадает со сгенерированным, то генерить еще раз. В принципе при этом способе можно задавать логику перебора фоток. Т.е. к примеру не случайный фоты выводить, а подряд (инкремент) или в обратном порядке (декремент). Можно даже переключатель ввести какую логику использовать.
*он же* (пост второй) Не редко, а со случайностью 1/5.
2автор Ты ещё раз условия посмотри свои, если ничего не увидешь, то посмотри ещё раз... Если опять ничего не увидешь, то иди читать ман (конкретно раздел, где описывается разница между "=" и "==").
Вот быстренько набрасал на PHP (на комменты сил не хватило). Сие чудо я не проверял, но тебе точно такое же на JavaScript нужно...
PS Спааать хоца
/**
* Класс итератор для получения случайной картинки
*
* Пример:
* $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;
}
}
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). Кроссбраузерность читала, ошибки к сожалению не нашла.
Если еще не слишком надоела, прошу помочь.
Заранее спасибо.
Навеяло мне Ваше обсуждение... Решил сделать себе подобную штучку.
Со сменой картинок проблем как раз нет, и отображением в браузерах то-же. Вот
Возникла проблема кэширования в IE.
<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 onload=slideShow(document.images.slide)>
<br><img src=img/1.jpg id=slide>
</body>
</html>
За код простите, мне так нравится, если кому надо рихтуйте.
Есть у кого мысли по поводу кэширования? Мета-тэги не помогают.
Думаю сделать через невидимость, но DIV использовать не хочу, а как по другому пока не придумал.
PS У меня только IE6, пожалуйста, проверьте в IE7, идут ли каждый раз запросы к серверу в момент смены картинок.
Есть у кого мысли по поводу кэширования? Мета-тэги не помогают.
Ну на JavaScript делать кэширование... не кэширование это вовсе. Хотя если под "кэширование" понимать сохранение картинки в окне браузера пока оно открыто, то можно. Есть 2 метода: 1) загруженные картинки складывать в какой либо контейнер с отрицательными margin (т.е. картинка появляется за пределами окна браузера) и потом просто нужную из них отображаешь на странице, и 2) вместо margin для скрытия загруженой картинки используем display:none.
У второго подхода есть свой плюс в том что загружаемы картинки не влияют на форматирование страницы и в DOM их можно ставить подряд при этом только у одной из них должно быть display:inline.
Думаю сделать через невидимость, но DIV использовать не хочу, а как по другому пока не придумал.
Чем тебе DIV не угодил? Не нравиться сразу используй IMG.
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]
Теперь скрипт для вывода картинки:
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 просто храниться цифра. Каждый раз, как у сервера запрашивает эту картинку хранимая там цифра увеличивается на единицу. Теперь открываем этот файл и смотрим, увеличивается ли число при нескольких нажатиям на кнопки скрыть/показать. Не увеличиваются, следовательно браузер их не запрашивает.
Ну вот весь код полностью:
[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
document.getElementById('slide').setAttribute('src', images[currentIm]);
[/HTML]
Зачем делать DOM вставку? Лучше просто переназначить свойство:
[HTML]
document.getElementById('slide').style.src = images[currentIm];
[/HTML]
Очень приятно получить такой развернутый ответ.
DIV не то чтобы не угодил, я не умею его готовить... Собственно, слои вообще не нравятся, не нравится обязательное позиционирование, задание размеров слоя, отсутствие умолчаний.
С табличкой приятнее работать, даже фрейм больше нравится :). Пока нет острой нужды в слоистости структуры. Особенно если использовать style.displey='none'.
Я как то вообще упустил из виду style.displey, торопился выложить.
Вот, сделал с применением displey='none'. Но, дурдом получается, теперь Опера завыпендривалась. Видимо, определяет, что изображения невидимые, и не загружает их. Пришлось оставить цикл предзагрузки, но Опера все равно коряво выводит.
Новый текст
<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" onload=slideShow()>
<p id=p></p>
</body>
</html>
у каждого разработчика должен стоят снифер что бы можно было отследить сетевую активность на компе
Спасибо, конечно... Но какой я нафиг разработчик :) так... для Души.. Потому и над кодом так издеваюсь.
За приведенный код спасибо, я так не делал, удобный метод.
Если уж заговорил, про style.displey='none', задам вопрос.
Хочу начать ламерский проект LamerPhotoBlog, основной редактор страниц почти готов (первый релиз :)), скоро планирую закончить. Осталось серверный ресайз изображений доделать и с textarea разобраться (не могу визуально отображаемые строки посчитать, т.е. не "\n", а видимые переносы строк. посмотрел getClientRects - сильно геморойно получается).
Так вот, я для себя, могу этого редактора приклеить к одному из готовых каталогов ссылок и успокоиться. Но. Такого плана Фото-Блогов я не смог найти в Интернете. Потому, хочется создать полностью функциональный FotoBlog, со своей серверной частью. PHP с идентификацией пользователей и MySQL мне самому не потянуть, да и желания нет. Если бы нашлись энтузиасты и подключились к проекту. Где найти таких программеров php? Пускай начинающих, по ходу научатся. Самое хорошее дело учиться на конкретной задаче. Вот и думаю на котором из форумов начать этот проект, чтобы наверняка нашлись сподвижники. Может посоветуете?
Да, вот (смотреть в IE, пока) примерный вид редактора, всё сырое, но суть понятна, функциональность можно оценить, минимум знаний от пользователя, простое заполнение жестко заданного шаблона. Максимум кода на клиентской стороне. Сейчас работает только верхний ряд фотографий и заголовки, малость переделываю, поломал. Покликайте по верхним заголовкам и картинкам.
Шаблонов будет несколько. Сейчас хочу упростить построение страницы, буду использовать textarea и для ввода текста, и для отображения, интерактивное редактирование. Собираюсь однотипные элементы выводить JavaScript-ом, только выводить, не создавать. Этот FotoBlog ориентирован на рекламодателей, т.е. фотографии продукции с комментариями, плюс описание деятельности фирмы.
Я так и понял.
Собственно, слои вообще не нравятся, не нравится обязательное позиционирование, задание размеров слоя, отсутствие умолчаний.
Блин, еще один... заруби себе на носу навечно, есть не понял это из спецификаций, что див это НЕ слой, а слой это НЕ див. Захочешь подробности велкам в поиск, я повторяться уже забадался.
Но, дурдом получается, теперь Опера завыпендривалась.
У тебя выпендривется у меня нет? Поди юзаешь Оперу времен царя гороха... у меня самые последние, в частности сейчас 9.22.
Спасибо, конечно... Но какой я нафиг разработчик :) так... для Души.. Потому и над кодом так издеваюсь.
"Взялся за гуж, не говори, что не дюж" (с) ;)
Если бы нашлись энтузиасты и подключились к проекту. Где найти таких программеров php?
Почему же обязательно PHP? Серверных языков много. Пройдись по рунетовским форумам с кличем, может кто и откликнется. Я даже уверен, что откликнуться обязательно, но так же уверен, что из этого ни чего хорошо не выйдет ;) . Хотя конечно смотря какие цели проекта, может тебя результат и устроит...
(смотреть в IE, пока) примерный вид редактора, всё сырое, но суть понятна, функциональность можно оценить, минимум знаний от пользователя, простое заполнение жестко заданного шаблона.
Комментировать не буду. Работай. Нравиться пользователям - хорошо.
Блин, еще один...
Как там? Шерлок Холмс - "Но мои глаза говорят мне обратное":D
Кроме фразы "DIV -- это не слой!" мне поиск ни чего не дал. Нет, я конечно догадываюсь, что он начинает "слоиться" когда его "наградишь" стилями, но он же не перестает при этом называться дивом.
У меня новая Опера, но "партабле", без инсталяции запускается. Или Ты говоришь про работу страницы по моей ссылке? Дак там кроме записи в невидимые имеджи, ещё и пред-загрузка в массив. А без этой предзагрузки выглядит так
А я только его маленько понимаю ;)
Цели проекта "простые" - законченый продукт:) . Ну и понятно, есть тайная мысль:cool: - раскрутить домен на котором будет выложен бесплатный скрипт. По этому домену грандиозные планы, для раскрутки все средства подойдут. Парням, кто займется серверной частью, сделаю шаблоны редакторов по их запросам.
Я точно знаю, что посетители моих сайтов испытывают большие трудности, когда читают - "вставить HTML". Потому и решил упростить всё до безобразия. А готового ни чего подобного не нашел.
Кроме фразы "DIV -- это не слой!" мне поиск ни чего не дал.