#php #javascript #html #onclick
#php #javascript #HTML #onclick
Вопрос:
Итак, у меня есть этот скрипт, который будет поворачивать изображения, расположенные в каталоге, который отлично работает. Однако для поворота изображения требуется обновление страницы. Есть ли способ, которым я могу изменить это, чтобы оно поворачивало изображение при нажатии на само изображение? Заранее спасибо
HTML:
<img src="rotate.php" alt="random image" />
PHP:
<?php
$folder = 'images/';
$exts = 'jpg jpeg png gif';
$files = array(); $i = -1;
if ('' == $folder) $folder = './';
$handle = opendir($folder);
$exts = explode(' ', $exts);
while (false !== ($file = readdir($handle))) {
foreach($exts as $ext) {
if (preg_match('/.'.$ext.'$/i', $file, $test)) {
$files[] = $file;
$i;
}
}
}
closedir($handle);
mt_srand((double)microtime()*1000000);
$rand = mt_rand(0, $i);
header('Location: '.$folder.$files[$rand]);
?>
Комментарии:
1. Возможно, используйте JavaScript, поскольку это проблема на стороне клиента.
2. Значит, PHP работает нормально? Просто ищете решение для браузера?
3. @Matt Все, что я опубликовал, отлично работает. Я просто искал способ превратить отображение изображения в функцию onclick, чтобы она могла извлекать другое изображение из rotate.php при нажатии.
Ответ №1:
Обновление: это очень простой способ, но протестируйте его и посмотрите, работает ли он;
<script>
function changeImage(o){
o.src = 'http://www.domain.com/testtest.php?' (new Date()).getTime(); // time to help stop caching
}
</script>
<img src="http://www.domain.com/testtest.php" onclick="changeImage(this)" />
и в вашем php добавьте заголовок содержимого для отправки изображения, например, если это gif
или png…
<?php
// see link at bottom for getting file extention
switch ($selected_random_file_extention) {
case "gif":
header('Content-type: image/gif');
$file_ext = "gif"; break;
case "jpg":
header('Content-type: image/jpg')
$file_ext = "jpg"; break;
case 3:
header('Content-type: image/png');
$file_ext = "png"; break;
}
//header('Content-type: image/gif'); // send as image
//$random_image_name = rand(1,5);
// you would add $folder.$files[$rand]; and include you script above
$random_image_name = $folder.$files[$rand];
// adjust paths as needed
$img_file = "http://www.domain.com/".$random_image_name.".gif";
// .$file_ext;
readfile($img_file); // not sure how memory will go
?>
Идея состоит в том, чтобы установить header
тип содержимого и читать и записывать файл в выходной буфер с помощью readfile
, вооружившись этим, вы могли бы использовать ajax в качестве другого средства запроса изображения и с помощью status
легко отображать индикатор загрузки.
Если вам нужно переписать URL-адрес, вы можете изменить расширение .php для src или даже не иметь расширения.
http://php.net/manual/en/function.pathinfo.php
с помощью pathinfo 'extension'
вы можете получить расширение, а затем установить соответствующую скорость Content-type
Комментарии:
1. Я видел примеры java, в которых перечислены изображения, однако там более 20 000 изображений. Я мог только представить, насколько медленным это получится.
2. @syllable3, верно, тогда это другой вопрос, являются ли имена изображений в предсказуемой схеме именования, например, пронумерованными?
3. отрицательный. Они никоим образом не предсказуемы. Некоторые включают интервал, некоторые включают цифры и т.д.
4. $syllable3 другим способом может быть использование перезаписи URL-адреса, у вас есть доступ к этому на сервере?
5. Так нужно ли мне добавлять больше заголовков для каждого типа изображения? Пример: ` <?php header(‘Тип содержимого: изображение / gif’); // отправить как заголовок изображения (‘Тип содержимого: изображение / jpg’); заголовок(‘Тип содержимого: изображение/png’); ` …
Ответ №2:
<script>
function changeSrc(element) {
var file_names = ["image1.png", "image2.png", "image3.png"]; //etc
var i = Math.floor(Math.random() * file_names.length);
element.src = file_names[i];
}
</script>
<img src="image1.png" onclick="changeSrc(this)">
Просто объедините ваши $files в строку, заключенную в кавычки через запятую, и вставьте ее в качестве значения для массива file_names выше.
Комментарии:
1. Который работал бы, если бы все изображения были в одном формате именования. В каталоге также более 20 000 изображений, что, как я мог только предположить, значительно замедлит процесс.
2. Можно ли было бы изменить var file_names на каталог, чтобы он просто поворачивал любое изображение в этом каталоге?
3. Казалось бы, это правильная идея. В принципе, измените атрибут src с помощью JavaScript, добавляя случайное число к строке запроса каждый раз, когда нажимается ссылка. Это обновляет изображение и предотвращает кэширование. <img src=»rotate.php?1526321″ alt=»случайное изображение» />
Ответ №3:
Вы могли бы добавить IFRAME, а затем с помощью javascript случайным образом обновить этот фрейм
Комментарии:
1. Как насчет кэширования изображений в браузере?
2. Чтобы улучшить этот ответ, рассмотрите возможность добавления примера фрагмента кода.
Ответ №4:
Вы рассматривали возможность выполнения этого с помощью ajax? Таким образом, вы могли бы запустить PHP, а затем обновить изображение, но не остальную часть страницы.
Комментарии:
1. У меня нет. Не очень знаком с ajax.
2. Ajax на удивление прост, если вы не возражаете против использования фреймворка вроде jQuery. (Документация: api.jquery.com/jQuery.ajax ) Аналогичным вариантом может быть использование JavaScript для обновления html-кода в div, содержащем ваше изображение, путем удаления тега image и добавления нового. (Хотя это может привести к неполному обновлению изображения.)
Ответ №5:
Если вы не хотите переходить на его клиентскую часть, я бы добавил ссылку вокруг вашего тега IMG и разделил ваш PHP-скрипт на два файла.
<a href="rotate.php"><img src="random.php" alt="random image" /></a>
Файл 1 (rotate.php ): Поворачивает изображения
Файл 2 (random.php ): Перенаправляет на случайное изображение
header('Location: '.$folder.$files[$rand]);
Комментарии:
1. Я протестировал это. При первой загрузке страницы изображение прерывается, а при нажатии на него загружается фактическое изображение на сайт. (т.е. testsite.com/whateverimage.jpg ) Таким образом, после этого пользователь не может снова щелкнуть изображение, чтобы перейти к следующему.