|
|
|
| Есть простой 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>
<script type="text/javascript" src="ajax.js"></script>
</head>
<body onload="mesgo('nomes')";>
<script language="JavaScript">
setInterval("mesgo('nomes')", 2000);
</script>
<div id=message></div>
<input type=text id=mymesag><input type=submit onclick="mesgo(); document.getElementById('mymesag').value=''; document.getElementById('mymesag').focus();" value="отправить">
</body>
</html>
|
понятно, что после нажатия на кнопку отправить вызывается ф-ия mesgo(); из файла ajax.js, а вот часть файла ajax.js
function mesgo(x)
{
if(xmlHttp.readyState==4 || xmlHttp.readyState==0)
{
message=document.getElementById("mymesag").value;
xmlHttp.open("GET","send.php?message="+message+"&kash="+Math.random()+"&x="+x, true);
xmlHttp.onreadystatechange=handleResponse;
xmlHttp.send(null);
}
}
|
IE про message=document.getElementById("mymesag").value; говорит про то, что этот объект не поддерживает свойство или метод, в опере все нормально, помогите обыграть в эксплоере, что сделать чтобы заработало нормально? | |
|
|
|
|
|
|
|
для: Blizard
(22.07.2009 в 21:42)
| | Не знаю, на что именно у вас ругается Эксплорер... но он имеет право на это.
Например: но
onclick="mesgo(); //НИЧЕГО не передаётся
|
Ну и что именно вы отсылаете серверу, когда прописываете
xmlHttp.open("GET","send.php?message="+message+"&kash="+Math.random()+"&x="+x, true);
| Вам таки нужен именно undefined в URL?
Зачем тогда такие сложности?
Писали бы прямо:
xmlHttp.open("GET","send.php?message="+message+"&kash="+Math.random()+"&x=undefined", true);
|
Кроме того, где функция encodeURIComponent? | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 21:56)
| | сделал так
message=encodeURIComponent(document.getElementById("mymesag").value);
onclick="mesgo()"; заменил на onclick="mesgo('yesmes');"
kash - этот гет параметр чтобы не кэшировался запрос
x - он имеет теперь два типа "nomes" и "yesmes", создан для того, чтобы знать, писать в файл сообщение или нет, т.к. запрос к ф-ии mesgo() каждые две секунды и большинство раз там пустая строка
для того, чтобы понятнее была суть кода, я делаю чат без фреймов, обработчик urla send.php
вот его код
<?php
header("Content-Type: text/xml");
$message=$_GET['message'];
$x=$_GET['x'];
if ($x!="nomes") $message.=" ~ "; else $message="";
// при передаче обратно в js файл ~ меняется на <br>
// поэтому был введен X чтобы не писать в файл лишние ~
$fp = fopen("./messages/messages.dat", "a");
flock($fp, LOCK_EX);
$fw = fwrite($fp, $message);
flock($fp, LOCK_UN);
fclose($fp);
$ech = File("./messages/messages.dat");
$text.='<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
$text.='<response>';
$text.=$ech[0];
$text.='</response>';
echo $text;
?>
|
ну и после уже прием данных сервера
if(xmlHttp.status==200)
{
xmlResponse=xmlHttp.responseXML;
xmlElement=xmlResponse.documentElement;
str=xmlElement.firstChild.data;
var repl = /~/g;
result = str.replace(repl,"<br>");
var mes=gebi("message");
mes.innerHTML=result;
}
|
может он на объект ругаться из-за того, что document.getElementById("mymesag").value в момент первого вызова еще какбы не загрузился на страницу? Но с другой стороны в теле head разве при загрузке вообще js выполняется? Мне все время казалось что только непосредственно при вызове из тела body. Вобщем я совсем в тупике нахожусь... С javascript всегда проблемы, толи дело пхп )) | |
|
|
|
|
|
|
|
для: Blizard
(22.07.2009 в 22:16)
| |
<body onload="mesgo('nomes')";> - это ПРАВИЛЬНО
|
<script language="JavaScript">
setInterval("mesgo('nomes')", 2000);
</script>
а это - полный БРЕД, браузер ещё НЕ ЗНАЕТ объекта с id="mymesag"
|
Почему сразу не прописать:
<body onload=setInterval("mesgo('nomes')",2000)>
| Если прописать БЕЗ ПРОБЕЛОВ, то внешние кавычки в HTML-коде можно не использовать,
чтобы не мучаться с их экранированием. | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 22:30)
| | Сделал так
<body onload=setInterval("mesgo('nomes')",2000)>
действительно должен был сразу додуматься что так рациональнее, но тем не менее IE продолжает настаивать на своем объекте и методе...
з.ы. спасибо, что отвечаете ) | |
|
|
|
|
|
|
|
для: Blizard
(22.07.2009 в 22:46)
| | Ну и правильно ругается.
Где вы "скоммуниздили" код, в котором статус ответа сервера
проверяется ещё ДО отправки запроса к серверу?
Пороверять статус ответа надо при получении его,
т.е. не в функции mesgo (), а в handleResponse (). | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 22:54)
| | часть (проверки) сам сделал, а отправку в ajax.js взял из xmlhttprequest.ru
сделал
<body onload=setInterval("handleResponse()",2000)>
ie продолжает настаивать на своем долбаном объекте | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 22:54)
| | Хотя нет, все правильно было, иначе не будут подгружаться в онлайн режиме чужие сообщения | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 22:54)
| | PAT, смотрите, если message=document.getElementById("mymesag").value; вообще убрать то каждые 2 секунды начинает выводить [object] на страницу, а если message=document.getElementById("mymesag").value; заменить message = "ok"; то опять про объект говорит, про свойство или метод. Это означает то, что причина вовсе не в том, что обращается к элементу, который еще не существует. ведь переменной message присвоил обычную строку, а она ведь известна во время присваивания. Ну в чем еще может быть дело? | |
|
|
|
|
|
|
|
для: PAT
(22.07.2009 в 22:54)
| | Ура! Нашел!!! Не хватало var ))) Спс вам за помощь и оптимизацию! | |
|
|
|