JS:无法转换为对象,childNodes相关

发布于 2024-10-05 01:44:56 字数 4951 浏览 8 评论 0原文

好吧,感觉很愚蠢,但想知道问题到底出在哪里。

尽管该函数可以正常工作,但我在 Opera 中收到此 JS 错误。不知道其他浏览器是否...

未捕获的异常: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 等。

如果您还需要什么,请告诉我?

谢谢 :)

Ok, feeling stupid here, but wondering what the problem is here exactly.

Although the function works as it should, I get this JS Error in Opera. Not sure about other browsers...

Uncaught exception: TypeError: Cannot
convert
'document.getElementById("shoutbox_area"
+ moduleId)' to object
oElement = document.getElementById("shoutbox_area"
+ moduleId).childNodes;

Here is the relevant code:

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";
  }
 }
}

Can someone please help me to understand why it is giving me an error here:

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

Can I not assign an array to the childNodes?

EDIT:

This JS Error occurs when I try and delete a shout. The JS function for deleting a shout is this:

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);
    }
}

Am using the following functions for the sending and getting the XMLHttpRequest as you may have noticed already in the removeShout function above:

// 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;
}

Hopefully this is good enough, you can do a view source on it to see the actual HTML, but there are attributes that get added to the Shoutbox tags at runtime so as to be XHTML compliant, etc..

Please let me know if there is anything else you need?

Thanks :)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

赠佳期 2024-10-12 01:44:56

该代码正在被破坏,因为在这两行中的第二行中,第二次循环时,shoutID 为 null:

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

第一行很奇怪。为什么不直接使用varshoutID=shout.parentNode;
此外,moduleId 属性似乎也不存在。

您想通过 while 循环实现什么目的?

The code is breaking because shoutID is null in the second of these two lines, the second time through the loop:

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

The first of those lines is strange. Why not just use var shoutID = shout.parentNode;?
Also, the moduleId attribute seems to be nowhere around.

What are you trying to achieve with the while loop?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文