以下代码只是一小部分,但是足以可以说明这个问题了。经过调试调用这个函数时,所传的参数均有值,可以在以下图片中看到这个问题的最奇怪之处是
我调试时走到eval("editor1"+n+".setHTML('"+val+"')");这句代码时提示运行时错误、但是我继续执行却又成功了。不进入调试的话,就不行,肯定是报错的。 
其它相关图片:说明:
1.我这里的editor1+n(这里的n是数字型的)其实是一个ewebeditor对象,因为有好多个ewebeditor对象所以需要这么来处理。
2.ewebeditor对象是一个常用的HTML编辑器,我就不用介绍了。我猜测正是因为我用EVAL处理的这个方法是ewebeditor这个对象封装的方法,而不是HTML系统内部方法,所以就会导致出现这样的问题。其实用HTML元素对象的系统方法这么来组合应该不会有问题的。
3.如果图片看不清楚,可到我的相册里面看:http://hi.csdn.net/space-1135993-do-album-id-77002.html
4.如果我说得不太清楚的地方,大家可以提出,我再补充

有没有遇到过类似问题的朋友们,请帮着解决下。谢谢。
或者是有相关的思路或其它的解决办法也行。再次谢谢。
至于ewebeditor的官网程序员API就不用提供了,我知道的。看好多遍了。我的版本是6.8的。正式版的。//cursel代表当前分页栏索引,m代表导航个数,n代表题目的行索引,r代表该题的子题序号
function setTab(bsid,name,cursel,m,n,r)
{
    if(r=="0")
            {
                   r=getCurRow(childBaseCount,n);
            }
            for(var i=1;i<=m;i++)
            {                             
                var menu=document.getElementById(name+i+n);
                var con=document.getElementById("con_"+name+"1_"+n);
                if(i==cursel)
                {
                    menu.className="hover";
                    if(isEditing==true &&  cursel!=oldSel)//只有点了编辑按钮并且当前点中的分页栏不为现已选中栏时,才将公共容器中的内容保存到隐藏域中
                    {
                        var val = eval("editor1"+n+".getText()");
                        document.getElementById("hide_r"+n+"_c"+oldSel+r).value=val;                    
                    }
                    var val = document.getElementById("hide_r"+n+"_c"+i+r).value;
                    eval("editor1"+n+".setHTML('"+val+"')");//程序走到这里报的错
                    document.getElementById("con_tab1_"+n).children[0].innerHTML=document.getElementById("hide_r"+n+"_c"+i+r).value;                                            
                }
                else
                {
                    menu.className="";
                }                    
            }}
   

解决方案 »

  1.   

    document.getElementById("editor1"+n).setHTML(val);
      

  2.   

    一样的不行的,我早都试过了。最开始想到用的就是这个。要是这样行,我就不会用eval了
      

  3.   

    var a = "editor1"+n).setHTML(val);
    eval(a)
      

  4.   

    document.getElementById("editor11").setHTML("aa");这样也难已执行吧.
    最好还是乖乖的写标准写法: document.getElementById("editor11").innerHTML = "aa";也就是: eval("document.getElementById(\"editor1" + n + "\").innerHTML = \" + JsString(val) + \"")window.JsString = function(dString){
    dString = dString.replace(/\r/g, "\\r")
    dString = dString.replace(/\n/g, "\\n")
    dString = dString.replace(/\"/g, "\\"")
    dString = dString.replace(/\'/g, "\\'")
    return dString
    }
      

  5.   

    使用 fckeditor.freetextbox 显示内容看看
    function SetEditorContents(EditorName, ContentStr) {  
    var oEditor = FCKeditorAPI.GetInstance(EditorName) ;  
    oEditor.SetHTML(ContentStr) ;  
    }
      

  6.   

    异步问题?
    一般调试是时间等待导致之前运算结束。致使你的editor1n加载完毕
    得以使你的setHTML成功
    当然这一切都是经验,并非是根据你的代码诊断的
      

  7.   

    document.getElementById("editor1"+n).setHTML(val);这种方法应该是比较好的方法,
    不能使用的原因可能是
    document.getElementById("editor1"+n)这个对象获取的不正确。你可以先打印出出alert(document.getElementById("editor1"+n))是不是编辑器对象
      

  8.   

    我可保证这个对象是正确的。
    我题目中其实已经说明了,这个对象在IEDEBUGGER中调试时继续执行是可以通过的。也就是说这种写法,必须要经过这个JS调试器一遍后,才可以正确执行,如果不经过这个调试器就是仅仅弹出错误了。“运行时的错误”。其实在控制台中输出也是可以得到这个对象的。
      

  9.   

    你的意思是不经过调试的话,后台加载的速度太慢,走到这里时editor1n对象并未真正加载完,才导致的出现这种问题??
    而调试的过程时间中,又加载完成了,所以就没问题了??
    我觉得这种理论也不太准确。因为在调试中也是出现过问题了的,只不我是继续F10才又成功的。
      

  10.   

     eval不致带来如此问题
    从你的代码中我无法获取更多信息,还是认为是这个可能性比较大
      

  11.   

    你的意思,我明白。可是这个setHTML方法是这个对象封装的方法,而不是HTML元素的内部方法,所以用innerHTML是不行的。
    有关ewebEditor的API文档请参考http://www.ewebeditor.net/documentation/
    里面有详细的描述。
      

  12.   

    EVAL这个东东的确是个好东西。它本身是没什么错的。
    关键是在这我里面用的时候情况太过复杂。我这个情况特别之处在于
    1.所有的ewebeditor对象都是在后台动态生成的。
    2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
    3.就是其它干扰因素太多,可能会导致不可预知的问题发生。

    但是用ieDebugger调试时能走到我说的这段代码来,且参数都有值,就不应该是代码其它地方有问题了。
    我也不知道要怎么呈现,才能更清楚的表达我的意思。我怕代码贴太多了,影响观看。
      

  13.   

    上面有个图片的右半边被CSDN自动给截了部分去。所以我再贴出来顺便再搞点代码上来
    代码超长,我搞一点生成的关键代码吧,能看得明白,大家就看看,看不明白就算了。else
                        {
                            hideID0 = "hide_r" + j + "_c01";
                            hideID1 = "hide_r" + j + "_c11";
                            hideID2 = "hide_r" + j + "_c21";
                            hideID3 = "hide_r" + j + "_c31";
                            hideID4 = "hide_r" + j + "_c41";
                            hideID5 = "hide_r" + j + "_c51";
                            hideID6 = "hide_r" + j + "_c61";
                            string hideStr = "<input type=\"hidden\" id='" + hideID0 + "' value='' /><input type=\"hidden\" id='" + hideID1 + "' value='' /><input type=\"hidden\" id='" + hideID2 + "' value='' /><input type=\"hidden\" id='" + hideID3 + "' value='' /><input type=\"hidden\" id='" + hideID4 + "' value='' /><input type=\"hidden\" id='" + hideID5 + "' value='' /><input type=\"hidden\" id='" + hideID6 + "' value='' />";
                            sb.Append("<td id='" + tdID + "' style='display:none'><div class=\"lib_Tab\"><div id='" + divID + "' class=\"content2\"><div class=\"lib_Menubox lib_tabborderdiv1\"><ul><li id=" + id1 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',1,6," + j + ",'1')\" class=\"hover\">题文</li><li id=" + id2 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',2,6," + j + ",'1')\" >答案</li><li id=" + id3 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',3,6," + j + ",'1')\">详解</li><li id=" + id4 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',4,6," + j + ",'1')\">参数</li><li id=" + id5 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',5,6," + j + ",'1')\">错析</li><li id=" + id6 + " onclick=\"setTab('" + reader.GetValue(0).ToString() + "','tab',6,6," + j + ",'1')\">提示</li></ul></div><div class=\"lib_Contentbox lib_tabborder\"><div id=" + dID1 + " ><div style='display:none'></div><div style='display:none'><input type='hidden' id='" + boxID1 + "' value='0' runat='server'/><iframe id='" + eID1 + "' src='/ewebeditor.htm?id=" + boxID1 + "&style=coolblue' frameborder='0'scrolling='no' width='100%' height='100%'></iframe></div></div>" + hideStr + "</div><div style=\"clear:both\"></div></div></div></td>");
                        }
      

  14.   

    1.所有的ewebeditor对象都是在后台动态生成的。
    2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
    3.就是其它干扰因素太多,可能会导致不可预知的问题发生。这3点 除了3太虚以外 其他两点都不是出错的理由。
      

  15.   

    如果对象正确 
    document.getElementById("editor1"+n)
    你再看看该对象是否有setHTML方法?
    如果有,就应当是可以的,怎么会不能用呢?
      

  16.   

    个人认为最好的方法是:document.getElementById("editor1"+n).setHTML("aa");运行报错,调试正确,很有可能是 cj205 说的 异步问题,楼主可以仔细看看 setHTML 方法的定义
    变通方法(我有这样解决过问题):function setEditHtml(editerID,html)
    {
    var editer = document.getElementById(editerID);
    if(editer && editer.setHTML ){
    editer.setHTML(html);
    }else{
    setTimeout(function(){ setEditHtml(editerID,html);},10);
    }
    }// 调用:
    setEditHtml("editor1"+n,val);
      

  17.   

    图片里面显示的是对象不支持此属性和方法。感觉是对象有问题。注意 editor1+N还是editor+N?
      

  18.   

    对象肯定是有这个方法的。但是调试器里面是看不到这个方法的。
    因为这个方法是ewebeditor对象内部封装的方法。
      

  19.   

    真的可以了。呵呵。
    非常感谢ID为hch126163的朋友,帮我解决了问题。
    特别感谢ID为net_lover,cj205这两位朋友的不厌其烦的帮我解决问题。
    另外再次感谢,所有的参与回答和浏览的朋友们,谢谢了。hch126163的方式虽然可以解决问题,但是调试的时候有时候是会死循环的,但是不走调试器的时候却是OK的。这个问题仍然很奇怪。不管怎么样辛苦大家这么久,先结贴了吧。