Помогите с простейшим Аяксом.

  • Автор темы Dymytry
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dymytry

#1
Парни, помогите разобраться с Аяксом!

Я пытаюсь сделать простенькую функцию чтобы понять как это все работает. Моя функция должна обращаться к Lotus Domino базе и брать оттуда JSON, далее помещать его в таблицу на странице. Весь код я скопировал из статей в инете и чуток изменил. По кнопке на странице вызывается MSDNAjax(url, viewtableid).
Так вот, у меня очень странный результат: все работает, только если в коде функции MSDNAjax стоит alert! Так, как указано в коде ниже. Если я его убираю - ничего не работает. Не могу понять, что я не так сделал.. Как так может быть вообще?

Код:
//globals------------------------------------------------------------------------
var oReq = getXMLHttpRequest();
//end of globals--------------------------------------------------------------

//standart XMLHttpRequest object initialization-----------------------------
function getXMLHttpRequest()
{
var http_request = false;

if (window.XMLHttpRequest) { // Mozilla, Safari, ...
http_request = new XMLHttpRequest();
if (http_request.overrideMimeType) {http_request.overrideMimeType('text/xml');
}
} else if (window.ActiveXObject) { // IE
try {
http_request = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
http_request = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
}

return http_request;
}


//main ajax call------------------------------------------------------------
function MSDNAjax(url, viewtableid)
{

if (oReq != null) {
oReq.open("GET", url, true);
oReq.send();
alert('strange alert');
oReq.onreadystatechange = DisplayView(eval( "(" + oReq.responseText + ")"), viewtableid);
}
else {
window.alert("AJAX (XMLHTTP) not supported.");
}
}


//display information----------------------------------------------------
function DisplayView(res, viewtableid)
{
if (oReq.readyState == 4) {
if (oReq.status == 200) {

var vec=res.viewentry;
var thetable="";

var tableobj = document.getElementById(viewtableid);

for (i=0; i<vec.length; i++)
{
var rowobj = tableobj.tBodies[0].insertRow(0);
for (j=0; j<vec[i].entrydata.length; j++)
{
var cellobj = rowobj.insertCell(0);
cellobj.appendChild(document.createTextNode(vec[i].entrydata[j].text[0]));
}
}

}
}
}
 

hosm

* so what *
18.05.2009
2 442
6
#2
хотя девушек тут игнорят, но я бы не делала сразу eval тут:
DisplayView(eval( "(" + oReq.responseText + ")"), viewtableid);
Есть шанс, что заглючит по истечении сессии
---
перенесите eval() после этого:
if (oReq.status == 200) {
---
и кстати, есть еще try-catch, не забываем проверить на ошибку eval()...
 
D

Dymytry

#3
Спасибо!

Eval перенес, но не помогло.

Я покопался еще, оказывается что этот alert обязательно должен быть перед if (oReq.readyState == 4), иначе оно не проходит в этот if. При этом если перед if (oReq.readyState == 4) поставить alert(oReq.readyState) то он выдаст 1 и спокойно пройдет внутрь if.

Может у кого-то есть точно работающий аякс-код с инициализацией соотв. объектов?
 
?

????

#5
oReq.onreadystatechange = DisplayView(eval( "(" + oReq.responseText + ")"), viewtableid);

тут происходит вызов функции с возвратом значения, а не присваивание обработчика.

меняй на oReq.onreadystatechange = DisplayView;

ну и саму функцию:
function DisplayView()
{
...
}
 
D

Dymytry

#6
Спасибо за ответы (особенно девушкам :D.

Заработало!

Если кто занимался подобными задачами, посоветуйте пожалуйста как решить такую проблему, наверняка есть что-то стандартное:

Я через этот свой Аякс заполняю таблицу вот таким кодом:
Код:
cellobj = rowobj.insertCell(0); 
cellobj.appendChild(document.createTextNode(mydata));
Теперь мне в каждой из этих cell надо прописать функцию на событие onclick. Я прочел что IE не поддерживает outerHTML для tr и td.

Я пробовал вместо таблицы помещать результаты Аякс запроса в набор DIVов, но у меня больше 1000 записей и мне кажется что набор в 1000 DIVов грузится существенно медленней, чем таблица с 1000 строками (похоже на правду?).

Как тут можно поступить, чтобы задать onclick?
 
Статус
Закрыто для дальнейших ответов.