Взаимодействие javascript и CGI
То есть может ли javascript выполнить cgi-сценарий и получить ответ на него,
если сценарий, напрмер, знает что он общается с javascript. И делать это регулярно без перезагрузки документа.
Ведь можно же в теле документа можно написать
<SCRIPT language="JavaScript" src="../cgi-bin/jscgi_prog.cgi"></SCRIPT>
Тогда результат скрипта будет рассматриваться как javascipt-код. Но это только один раз при загрузке документа...
Но если нужно регулярно выполнять сценарии на сервере и получать от них ответы...
Некрасиво можно сделать так:
объявить iframe в теле документа с нулевой длинной и шириной.
Записывать в его src адреса нужных скриптов, перезагружать документ iframe.
Потом пусть сценарий дает пустой документ, но с объявленными javascript-объектами, в которых и
хранится информация. Тогда обратившить по иерархии можно достать информацию, полученную от сценария.
Но это как-то искуственно, не очень профессионально.
Цитата:
Originally posted by SunnyMoon
Но это как-то искуственно, не очень профессионально.
Но это как-то искуственно, не очень профессионально.
Но единственно возможно. Все современные чаты так работают.
Код:
function jb() {
var A=null;
try {
A=new ActiveXObject("Msxml2.XMLHTTP")
}
catch(e) {
try {
A=new ActiveXObject("Microsoft.XMLHTTP")
}
catch(oc) {
A=null
}
}
if (!A && typeof XMLHttpRequest!="undefined") {
A=new XMLHttpRequest()
}
return A
}
function fc(Rb) {
if (k && k.readyState!=0) {
k.abort()
}
k=jb();
if(k) {
k.open("GET",sa+"&js=true&qu="+Rb,true);
k.onreadystatechange=function() {
if (k.readyState==4 && k.responseText) {
var frameElement=B;
if (k.responseText.charAt(0)=="<") {
W--
}
else {eval(k.responseText)}
}
}
k.send(null)
}
}
var A=null;
try {
A=new ActiveXObject("Msxml2.XMLHTTP")
}
catch(e) {
try {
A=new ActiveXObject("Microsoft.XMLHTTP")
}
catch(oc) {
A=null
}
}
if (!A && typeof XMLHttpRequest!="undefined") {
A=new XMLHttpRequest()
}
return A
}
function fc(Rb) {
if (k && k.readyState!=0) {
k.abort()
}
k=jb();
if(k) {
k.open("GET",sa+"&js=true&qu="+Rb,true);
k.onreadystatechange=function() {
if (k.readyState==4 && k.responseText) {
var frameElement=B;
if (k.responseText.charAt(0)=="<") {
W--
}
else {eval(k.responseText)}
}
}
k.send(null)
}
}
(c) Google
а по теме есть посмотри что такое XMLHTTPRequest на сайте мозиллы. Там вроде былли ссылки на микрософтовский аналогичный объект.
Код:
objXMLCont = new ActiveXObject('Microsoft.XMLDOM');
objXMLCont.async = false;
objXMLCont.load('server_side_script.php');
if(!objXMLCont.xml) divContent.innerHTML = "Error!!!";
else divContent.innerHTML = objXMLCont.xml;
objXMLCont.async = false;
objXMLCont.load('server_side_script.php');
if(!objXMLCont.xml) divContent.innerHTML = "Error!!!";
else divContent.innerHTML = objXMLCont.xml;
Понятно, что divContent - это id любого элемента (не обязательно <DIV>)
Естесственно, после такой подгрузки, если в загруженном контенте есть какие-то java-скрипты, их можно выполнить (только автоматом они, по-моему не станут выполняться, как если бы шли в нормальном документе)
В этом красивом и удобном варианте есть некоторые недостатки:
1) Подгружаемый контент должен быть правильным xml-документом (т.е. тэги закрываются всегда, а параметры обязательно в кавычках и т.п.)
2) !!! эта штука исключительно IE-шная фишка :( и в других браузерах не будет работать.
Если нужна кросс-браузерная совместимость, то пркатют только фрэймы (да и те не везде!)
Я WEB-чатами не пользуюсь (и не делаю), а в остальном можно и без ТАКОЙ динамики обойтись. На мой взгляд, всё что сложнее HTML-а должно делаться в виде SOFT-а.