LINUX.ORG.RU

Webform: onclick не дожидается, пока выполнится cgi-скрипт

 , ,


0

1

Вебстраница (index1.html)

<html>
  <body>
    <img src="pic.gif">
    <form action="../cgi-bin/update_pic1.cgi" method="get">
      <input type=submit value="Update Pic">
    </form>
  </body>
</html>
состоит из gif-картинки и вебформы, которая выполняет cgi-script (update_pic1.cgi)
#!/bin/bash
echo "Content-type: text/html"
echo ""
sleep 2
gnuplot plot_pic.gp
echo "<html><body>"
echo "<script>location.href='///localhost/index1.html'</script>"
echo "</body></html>"
создающий новую gif'ку (это делает gnuplot). В связи с этим возникает известная проблема: вместо перезагрузки только gif'ки приходится перезагружать всю страницу, чего хотелось бы избежать. Для решения проблемы я разделил страницу (index2.html) на два фрейма
<html>
    <frameset rows="90%,*">
      <frame src="main.html">
      <frame src="hidden.html" name="hidden">
    </frameset>
</html>
в один из который я поместил картинку и форму (main.html)
<html>
  <head><script>
      function updatePic(){
      var pic=document.getElementById("pic");
      pic.src="pic.gif"
      }
  </script></head>
  <body>
    <img src="pic.gif" id="pic">
    <form action="../cgi-bin/update_pic2.cgi" method="get"    target="hidden" onclick="return updatePic()">
      <input type=submit value="Update Pic">
    </form>
  </body>
</html>
а другую (hidden.html) оставил для перенаправления cgi-вывода
<html>
  <body>
  </body>
</html>
Таким образом, я избавлен от необходимости перезагружать всю main.html. Вместо этого я прошу просто перезагрузить изображение функцией onclick. Однако, в этом случае возникает другая проблема: onclick перезагружает картинку до того, как cgi скрипт её нарисует. Как заставить картинку перезагрузиться только после того, как cgi скрипт её нарисует?

Я был бы очень рад, если бы решение было ограничено 5-ю строками кода bash, js или с++, и без использования perl и AJAX.

Вместо:

      function updatePic(){
      var pic=document.getElementById("pic");
      pic.src="pic.gif"
      }

Я бы сделал загрузку через XMLHttpRequest и запись картинки уже из переменной. Код не напишу, я ещё начинающий.

Shadow ★★★★★ ()
Последнее исправление: Shadow (всего исправлений: 1)

Можно просто удалять/создавать элемент img с добавлением мусора в query string дабы избежать кеширования. Хотя с помощью jquery можно сделать более грамотно, но это будет не без ajax

redixin ★★★★ ()

onclick перезагружает картинку до того, как cgi скрипт её нарисует. Как заставить картинку перезагрузиться только после того, как cgi скрипт её нарисует?

заставь сервер отдавать страницу после того, как картинка будет готова. У тебя же на онклик идет обычный запрос к серверу. Пока сервер не отдаст, ничего не перезагрузится. Но это все уродство, вообще-то, надо тут аджаксом делать.

anonymous ()
Ответ на: комментарий от anonymous

onclick он на то и onclick что срабатывает на клик. Пусть сервер хоть ошибку 500 вернет через час, событие все равно произойдет сразу после клика. Человеку нужно на onsuccess колбек вешать, а это уже форменный аякс. Без асинхронности можно только delay какой нибудь, но и он в жс тоже на асинхронностях работает.

Без аякса нормальный вариант это cgi скриптом картинку по хттп отдавать

redixin ★★★★ ()
Ответ на: комментарий от redixin

событие все равно произойдет сразу после клика

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

anonymous ()
Ответ на: комментарий от anonymous

Пока ответ не будет получен

либо произойдет сброс по превышению таймаута. но за это время его говно по любому успеет картинку нарисовать

anonymous ()
Ответ на: комментарий от anonymous

событие click. оно происходит когда пользователь кликает.

а еще можно проставлять img src=/cgi-bin/script.cgi а скрипт пусть возвращает хттп редирект на сгенеренную картинку, раз уж так не хочется отдавать саму картинку.

redixin ★★★★ ()

Прям как в нулевые попал.

Deleted ()
Ответ на: комментарий от redixin

И че? он же пишет, что у него на онклик location повешено.

anonymous ()
Ответ на: комментарий от Deleted

This. Олсо слолировал с «perl не советовать».

anonymous ()

Т.е. ты хочешь получать данные по другому адресу внутри страницы без ajax? Тогда man websocket, потому что иначе это невозможно.

Или вся страница будет «ждать» ответа от сервера или используй ajax, или же websockets если тебе нужно это делать внутри страницы.

invokercd ★★★★ ()
Ответ на: комментарий от redixin

зачот!

Вот это сработало. Всем спасибо. Остался вопрос, если это так просто работает, зачем все эти аяксы с их XMLHttpRequest'ами?

jonny23 ()
Ответ на: комментарий от anonymous

браузер пошлёт и будет, а событие «клик» произойдёт сразу как пользователь нажмёт кнопку. и соотверственно, updatePic вызовется задолго до того как браузер сходит на сервер.

AndreyKl ★★★★★ ()
Ответ на: комментарий от Deleted

да, где-то там. я когда начинал под веб (2004 емнип), уже было php во всю и cgi вспоминали старожилы как страшный сон.

AndreyKl ★★★★★ ()
Ответ на: комментарий от redixin

мне кажется или это ОН? ощущение что фраза «зачем же тогда если всё так делается» это просто коронная ЕГО фраза.

AndreyKl ★★★★★ ()
Последнее исправление: AndreyKl (всего исправлений: 1)
Ответ на: комментарий от AndreyKl

cgi — это абсолютно правильный подход. Он простой и прозрачный. Просто с 2000-х Вузы начали массово штамповать ботов для индустрии, поэтому, все скатилось в говно.

anonymous ()

зачем ты используешь говнофреймы - атавизм из Web 1.0?

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.