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

Тема в разделе "Web 2.0, AJAX, Ruby, RSS технологии", создана пользователем Dymytry, 11 дек 2009.

Статус темы:
Закрыта.
  1. Dymytry

    Dymytry Гость

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

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

    Код (Text):
     
    //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]));
    }
    }

    }
    }
    }
     
  2. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    хотя девушек тут игнорят, но я бы не делала сразу eval тут:
    DisplayView(eval( "(" + oReq.responseText + ")"), viewtableid);
    Есть шанс, что заглючит по истечении сессии
    ---
    перенесите eval() после этого:
    if (oReq.status == 200) {
    ---
    и кстати, есть еще try-catch, не забываем проверить на ошибку eval()...
     
  3. Dymytry

    Dymytry Гость

    Спасибо!

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

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

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

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
  5. ????

    ???? Гость

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

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

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

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

    Dymytry Гость

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

    Заработало!

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

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

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

    Как тут можно поступить, чтобы задать onclick?
     
  7. Dymytry

    Dymytry Гость

    Я думал так задать onclick: outerHTML = "<TD onclick=..."

    Спасибо!
     
Загрузка...
Похожие Темы - Помогите простейшим Аяксом
  1. limbra
    Ответов:
    3
    Просмотров:
    45
  2. NylevoiChelovek
    Ответов:
    4
    Просмотров:
    102
  3. Ruska132
    Ответов:
    37
    Просмотров:
    314
  4. gURaBA_N
    Ответов:
    7
    Просмотров:
    147
  5. uxbmw3w
    Ответов:
    0
    Просмотров:
    64
Статус темы:
Закрыта.

Поделиться этой страницей