JS: Невозможно преобразовать в объект, связанный с childNodes - PullRequest
0 голосов
/ 30 ноября 2010

Ладно, чувствую себя здесь глупо, но мне интересно, в чем проблема именно здесь.

Хотя функция работает так, как должна, я получаю эту ошибку JS в Opera.Не уверен насчет других браузеров ...

Неопределенное исключение: TypeError: Невозможно преобразовать 'document.getElementById ("shoutbox_area" + moduleId)' в объект oElement = document.getElementById ("shoutbox_area" + moduleId).childNodes;

Вот соответствующий код:

function appendShout(XMLDoc)
{
 var shoutData = XMLDoc.getElementsByTagName("item");
 var oElement = [];

 if (shoutData.length > 0)
 {
  var moduleId = shoutData[0].getAttribute("moduleid");

  if (shoutData[shoutData.length - 1].getAttribute("lastshout") != "undefined")
  {
   for (var i = 0; i < shoutData.length; i++)
    if (shoutData[i].firstChild.nodeValue != 0)
     document.getElementById("shoutbox_area" + moduleId).innerHTML += shoutData[i].firstChild.nodeValue;


   oElement = document.getElementById("shoutbox_area" + moduleId).childNodes;
   var i = oElement.length;
   while (i--)
   {
    if (i % 2 == 0)
     oElement[i].className = "windowbg2";
    else
     oElement[i].className = "windowbg";
   }

   oElement[oElement.length - 2].style.borderBottom = "1px black dashed";
  }
 }
}

Может кто-нибудь, пожалуйста, помогите мне понять, почему он дает мне ошибку здесь:

oElement = document.getElementById("shoutbox_area" + moduleId).childNodes;

Не могу ли я присвоить массив дочерним узлам?

РЕДАКТИРОВАТЬ:

Эта ошибка JS возникает, когда я пытаюсь удалить крик.Функция JS для удаления крика такова:

function removeShout(shout, moduleID)
{
    var shoutContainer = shout.parentNode.parentNode;
    var send_data = "id_shout=" + shout.id;
    var url = smf_prepareScriptUrl(smf_scripturl) + "action=dream;sa=shoutbox;xml;" + "delete_shout;" + "canmod=" + canMod[moduleID] + ";" + sessVar + "=" + sessId;

    sendXMLDocument(url, send_data);

    var shoutID = 0;
    while (shoutID !== null)
    {
        var shoutID = document.getElementById(shout.parentNode.id);
        var moduleID = shoutID.parentNode.getAttribute("moduleid");

        if (shoutID.parentNode.lastChild)
        {
            var url = smf_prepareScriptUrl(smf_scripturl) + "action=dream;sa=shoutbox;xml;get_shouts=" + (shoutID.parentNode.lastChild.id.replace("shout_", "") - 1) + ";membercolor=" + memberColor[moduleID] + ";maxcount=" + maxCount[moduleID] + ";shoutboxid=" + shoutboxID[moduleID] + ";textsize=" + textSize[moduleID] + ";parsebbc=" + parseBBC[moduleID] + ";moduleid=" + moduleID + ";maxcount=" + maxCount[moduleID] + ";canmod=" + canMod[moduleID] + ";" + sessVar + "=" + sessId;

            getXMLDocument(url, appendShout);
        }

        element = shoutID.parentNode.childNodes;
        var i = element.length;
        while (i--)
        {
            if (i % 2 == 0)
                element[i].className = "windowbg2";
            else
                element[i].className = "windowbg";
        }

        shoutID.parentNode.removeChild(shoutID);
    }
}

Я использую следующие функции для отправки и получения XMLHttpRequest, как вы, возможно, уже заметили в функции removeShout выше:

// Load an XML document using XMLHttpRequest.
function getXMLDocument(sUrl, funcCallback)
{
    if (!window.XMLHttpRequest)
        return null;

    var oMyDoc = new XMLHttpRequest();
    var bAsync = typeof(funcCallback) != 'undefined';
    var oCaller = this;
    if (bAsync)
    {
        oMyDoc.onreadystatechange = function () {
            if (oMyDoc.readyState != 4)
                return;

            if (oMyDoc.responseXML != null && oMyDoc.status == 200)
            {
                if (funcCallback.call)
                {
                    funcCallback.call(oCaller, oMyDoc.responseXML);
                }
                // A primitive substitute for the call method to support IE 5.0.
                else
                {
                    oCaller.tmpMethod = funcCallback;
                    oCaller.tmpMethod(oMyDoc.responseXML);
                    delete oCaller.tmpMethod;
                }
            }
        };
    }
    oMyDoc.open('GET', sUrl, bAsync);
    oMyDoc.send(null);

    return oMyDoc;
}

// Send a post form to the server using XMLHttpRequest.
function sendXMLDocument(sUrl, sContent, funcCallback)
{
    if (!window.XMLHttpRequest)
        return false;

    var oSendDoc = new window.XMLHttpRequest();
    var oCaller = this;
    if (typeof(funcCallback) != 'undefined')
    {
        oSendDoc.onreadystatechange = function () {
            if (oSendDoc.readyState != 4)
                return;

            if (oSendDoc.responseXML != null && oSendDoc.status == 200)
                funcCallback.call(oCaller, oSendDoc.responseXML);
            else
                funcCallback.call(oCaller, false);
        };
    }
    oSendDoc.open('POST', sUrl, true);
    if ('setRequestHeader' in oSendDoc)
        oSendDoc.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
    oSendDoc.send(sContent);

    return true;
}

Надеюсь, это достаточно хорошо, вы можете сделать из него источник просмотра, чтобы увидеть фактический HTML, но есть атрибуты, которые добавляются к тегам Shoutbox во время выполнения, чтобы быть совместимыми с XHTML, и т. Д.

Пожалуйста, дайте мне знать, если вам что-то еще нужно?

Спасибо:)

1 Ответ

1 голос
/ 01 декабря 2010

Код ломается, потому что shoutID равен нулю во второй из этих двух строк, во второй раз в цикле:

var shoutID = document.getElementById(shout.parentNode.id);
var moduleID = shoutID.parentNode.getAttribute("moduleid");

Первая из этих строк странная.Почему бы просто не использовать var shoutID = shout.parentNode;?
Кроме того, атрибут moduleId, похоже, нигде не существует.

Чего вы пытаетесь достичь с помощью цикла while?

...