2010-11-30 24 views
0

Ok, se sentir stupide ici, mais se demandant quel est le problème ici exactement.JS: Impossible de convertir en objet, childNodes related

Bien que la fonction fonctionne comme il se doit, j'obtiens cette erreur JS dans Opera. Je ne sais pas d'autres navigateurs ...

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

Voici le code correspondant:

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

Quelqu'un peut-il s'il vous plaît aidez-moi à comprendre pourquoi il me donne une erreur ici:

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

Puis-je attribuer un tableau aux childNodes?

EDIT:

Ce JS erreur se produit lorsque je tente de supprimer un cri. La fonction JS pour la suppression d'un cri est le suivant:

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 en utilisant les fonctions suivantes pour l'envoi et obtenir le XMLHttpRequest que vous avez peut-être déjà remarqué dans la fonction removeShout ci-dessus:

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

Espérons que cette est assez bon, vous pouvez faire une source de vue sur elle pour voir le HTML réel, mais il y a des attributs qui sont ajoutés aux balises Shoutbox à l'exécution afin d'être compatible XHTML, etc.

S'il vous plaît laissez-moi savoir si y a-t-il autre chose dont vous avez besoin?

Merci :)

+0

qu'est-ce que 'moduleId' est égal à? Quel est l'identifiant de l'élément que vous ciblez? Qu'est-ce que childNodes contient-il? HTML serait utile. –

+0

Edité la question. J'espère que c'est assez d'informations pour vous maintenant pour pouvoir m'aider. Faites-moi savoir s'il y a autre chose dont vous avez besoin. Et merci beaucoup! J'apprécie beaucoup votre aide! :) – SoLoGHoST

Répondre

1

Le code se brise parce shoutID est nulle dans la seconde de ces deux lignes, la deuxième fois par la boucle:

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

La première de ces lignes est étrange. Pourquoi ne pas simplement utiliser ?
En outre, l'attribut moduleId semble être nulle part. Qu'essayez-vous d'accomplir avec la boucle while?

+0

Wow, merci. J'ai oublié ce morceau de code. Je pensais réellement permettre à plus d'un cri d'être enlevé à la fois. Quoi qu'il en soit, j'ai supprimé cette boucle et il semble avoir corrigé 1 des erreurs JS. Cependant l'attribut 'moduleid' est créé à RUNTIME donc je ne sais pas pourquoi c'est un problème ...? Je vous remercie! – SoLoGHoST

+0

OMG, vous êtes génial et je suis retardé! J'ai le moduleID étant passé comme le 2ème paramètre dans cette fonction, ainsi j'ai enlevé ceci: var moduleID = shoutID.parentNode.getAttribute ("moduleid"); 'et il saisit la valeur de moduleId correcte du 2ème paramètre. MERCI de m'avoir aidé avec un autre regard à ce sujet. J'aimerais avoir 4 yeux parfois. Merci un MILLION! – SoLoGHoST