如何解决“无法转换JavaScript参数arg 0 [nsIDOMHTMLDivElement.appendChild]”错误

时间:2010-05-07 06:32:38

标签: javascript dom

我有一个从ajax返回的json对象,当我提醒它时,它显示正确,我尝试将它们添加到无序列表中并将其添加到占位符div,但抛出上述错误..

function handleResponse() {
  if(httpa.readyState == 4){
  var response = httpa.responseText;
    //alert(response);
    if(response!='empty')
    {
      //alert(response);
      eval("prod="+response);
      var len = prod.length;
      var st = "<ul>";
      for(var cnt=0;cnt<len;cnt++)
      {
        st = st + "<li onclick='set("+prod[cnt].id+")'>"+prod[cnt].name+"</li>";  
      }      
      st = st + "</ul>";
      }
      var tt = document.getElementById('holder1');
      tt.appendChild(st); // i even tried **tt.appendChild(eval(st));**
      tt.style.display = 'block';  
    }

}

2 个答案:

答案 0 :(得分:3)

一些评论:

  • eval("prod="+response); - 不要这样做。它创建了一个全局“prod”变量,可以执行任意代码,阻止JS引擎加速代码,并且通常被认为是一种糟糕的编码实践。
    • 改为使用JSON解析器(来自json.org或来自您最喜欢的库的助手)。
  • tt.appendChild(st); // i even tried **tt.appendChild(eval(st));** - appendChild接受DOM节点; st是一个字符串,eval(st)评估st,假设它包含JavaScript代码(因此在XML上运行它会导致语法错误,除非您使用E4X,仍然不会创建适合与appendChild一起使用的对象。
    • 您应该解析您构建的HTML代码(通过innerHTMLcreateDocumentFragment,或者 - 再次 - 使用您喜欢的JS库中的帮助程序)
  • 最后,如果你这么做,请考虑using templates instead

答案 1 :(得分:1)

tt.innerHTML += st;

由于st是一个字符串,而不是一个DOM元素。