В прошлом посте был описан способ передачи данных на сервер с помощью тега img на странице. Но он не единственный способ.
Для этих целей можно приспособить тег script, котороый так же будет передовать данные на сервер и еще асинхронно передавать ответ обратно.
html код:
javascript код:Copy Source | Copy HTML
<input type="text" id="textField"/>
- <input type="button" id="sendMessage" value="Отправить IMG"/>
- <img id="imaGet" src="picture.php?add=hello" style="width:30px;height:30px;"/>
Функция ScriptDataSend создает тег script с заранее определенным url адресом и уникальным id (uid), чтобы используя этот uid задать уникальный обработчик события для этого соединения в глобальном хэше обработчиков window.responceCollection (другого "красивого" варианта реализации пока не придумал ...).Copy Source | Copy HTML
function ScriptDataSend(urlEncoded_str,callBack_func){
- ////generate uniq id for elements (I don't check it, only random!!)
- var uniqId=(Math.random()*10000000).toFixed( 0);
- //console.log("uniq: %s",uniqId);
- ////add script element and encoded data
- var th = document.getElementsByTagName("body")[ 0];
- var s = document.createElement('script');
- s.setAttribute('type','text/javascript');
- s.setAttribute('src',"script.php?uid="+uniqId+"&add="+urlEncoded_str);
- s.setAttribute('id',uniqId);
- ////auto remove script element
- s.onload=function(){
- //console.log("I'm loaded");
- s.parentNode.removeChild(s);
- delete window.responceCollection[uniqId];
- }
- th.appendChild(s);
- delete s;
- //// add callback in globalScope!
- if (window.responceCollection==undefined)
- window.responceCollection={};
- window.responceCollection[uniqId]=callBack_func;
- }
- var messageField=document.getElementById("textField");
- var sendButton2=document.getElementById("sendMessage2");
- sendButton2.addEventListener("click",function(){
- ScriptDataSend(encodeURIComponent(messageField.value),function(time){
- console.log("Get Javascript response: %s",time);
- });
- },false);
код файла script.php:
Как видите, script.php формирует ответ в виде набора данных и передает их в обработчик с уникальным id (uid).Copy Source | Copy HTML
<?php
- header('Content-type: text/javascript');//Делаем вид что javascript
- $time=date("H:i:s");
- $uid=$_GET["uid"];
- // отправляем ответ
- echo "window.responceCollection[\"".$uid."\"]('".$time."');";
- //- сохраняем полученные данные
- $fileName="script_data.txt";
- if (strlen($_GET["add"])> 0){
- $fh = fopen($fileName, "a+");
- fwrite($fh, urldecode($_GET["add"])." ".date("H:i:s")."\n");
- fclose($fh);
- }
- ?>
Повозможности никакого управляющего кода на js в php скрипте не генирируется, чтобы было удобнее отлаживать.
Недостатки метода отправки данных сервер с помощью тега script:
- только запросы get
- вся отладка на плечи кодера
- добавление и удаление элемента из DOM
- обработчик в глобальной области видимости