Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ie ругается при получении getElementById
 
 автор: Blizard   (22.07.2009 в 21:42)   письмо автору
 
 

Есть простой 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; говорит про то, что этот объект не поддерживает свойство или метод, в опере все нормально, помогите обыграть в эксплоере, что сделать чтобы заработало нормально?

  Ответить  
 
 автор: PAT   (22.07.2009 в 21:56)   письмо автору
 
   для: Blizard   (22.07.2009 в 21:42)
 

Не знаю, на что именно у вас ругается Эксплорер... но он имеет право на это.
Например:
function mesgo(x
но
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?

  Ответить  
 
 автор: Blizard   (22.07.2009 в 22:16)   письмо автору
 
   для: 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($fpLOCK_EX);
$fw fwrite($fp$message);
flock($fpLOCK_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 всегда проблемы, толи дело пхп ))

  Ответить  
 
 автор: PAT   (22.07.2009 в 22:30)   письмо автору
 
   для: 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-коде можно не использовать,
чтобы не мучаться с их экранированием.

  Ответить  
 
 автор: Blizard   (22.07.2009 в 22:46)   письмо автору
 
   для: PAT   (22.07.2009 в 22:30)
 

Сделал так

<body onload=setInterval("mesgo('nomes')",2000)>

действительно должен был сразу додуматься что так рациональнее, но тем не менее IE продолжает настаивать на своем объекте и методе...

з.ы. спасибо, что отвечаете )

  Ответить  
 
 автор: PAT   (22.07.2009 в 22:54)   письмо автору
 
   для: Blizard   (22.07.2009 в 22:46)
 

Ну и правильно ругается.
Где вы "скоммуниздили" код, в котором статус ответа сервера
проверяется ещё ДО отправки запроса к серверу?
Пороверять статус ответа надо при получении его,
т.е. не в функции mesgo (), а в handleResponse ().

  Ответить  
 
 автор: Blizard   (22.07.2009 в 23:15)   письмо автору
 
   для: PAT   (22.07.2009 в 22:54)
 

часть (проверки) сам сделал, а отправку в ajax.js взял из xmlhttprequest.ru

сделал

<body onload=setInterval("handleResponse()",2000)>

ie продолжает настаивать на своем долбаном объекте

  Ответить  
 
 автор: Blizard   (22.07.2009 в 23:20)   письмо автору
 
   для: PAT   (22.07.2009 в 22:54)
 

Хотя нет, все правильно было, иначе не будут подгружаться в онлайн режиме чужие сообщения

  Ответить  
 
 автор: Blizard   (22.07.2009 в 23:48)   письмо автору
 
   для: PAT   (22.07.2009 в 22:54)
 

PAT, смотрите, если message=document.getElementById("mymesag").value; вообще убрать то каждые 2 секунды начинает выводить [object] на страницу, а если message=document.getElementById("mymesag").value; заменить message = "ok"; то опять про объект говорит, про свойство или метод. Это означает то, что причина вовсе не в том, что обращается к элементу, который еще не существует. ведь переменной message присвоил обычную строку, а она ведь известна во время присваивания. Ну в чем еще может быть дело?

  Ответить  
 
 автор: Blizard   (22.07.2009 в 23:50)   письмо автору
 
   для: PAT   (22.07.2009 в 22:54)
 

Ура! Нашел!!! Не хватало var ))) Спс вам за помощь и оптимизацию!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования