以下代码只是一小部分,但是足以可以说明这个问题了。经过调试调用这个函数时,所传的参数均有值,可以在以下图片中看到这个问题的最奇怪之处是
我调试时走到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="";
}
}}
我调试时走到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="";
}
}}
eval(a)
最好还是乖乖的写标准写法: 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
}
function SetEditorContents(EditorName, ContentStr) {
var oEditor = FCKeditorAPI.GetInstance(EditorName) ;
oEditor.SetHTML(ContentStr) ;
}
一般调试是时间等待导致之前运算结束。致使你的editor1n加载完毕
得以使你的setHTML成功
当然这一切都是经验,并非是根据你的代码诊断的
不能使用的原因可能是
document.getElementById("editor1"+n)这个对象获取的不正确。你可以先打印出出alert(document.getElementById("editor1"+n))是不是编辑器对象
我题目中其实已经说明了,这个对象在IEDEBUGGER中调试时继续执行是可以通过的。也就是说这种写法,必须要经过这个JS调试器一遍后,才可以正确执行,如果不经过这个调试器就是仅仅弹出错误了。“运行时的错误”。其实在控制台中输出也是可以得到这个对象的。
而调试的过程时间中,又加载完成了,所以就没问题了??
我觉得这种理论也不太准确。因为在调试中也是出现过问题了的,只不我是继续F10才又成功的。
从你的代码中我无法获取更多信息,还是认为是这个可能性比较大
有关ewebEditor的API文档请参考http://www.ewebeditor.net/documentation/
里面有详细的描述。
关键是在这我里面用的时候情况太过复杂。我这个情况特别之处在于
1.所有的ewebeditor对象都是在后台动态生成的。
2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
3.就是其它干扰因素太多,可能会导致不可预知的问题发生。
但是用ieDebugger调试时能走到我说的这段代码来,且参数都有值,就不应该是代码其它地方有问题了。
我也不知道要怎么呈现,才能更清楚的表达我的意思。我怕代码贴太多了,影响观看。
代码超长,我搞一点生成的关键代码吧,能看得明白,大家就看看,看不明白就算了。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>");
}
2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
3.就是其它干扰因素太多,可能会导致不可预知的问题发生。这3点 除了3太虚以外 其他两点都不是出错的理由。
document.getElementById("editor1"+n)
你再看看该对象是否有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);
因为这个方法是ewebeditor对象内部封装的方法。
非常感谢ID为hch126163的朋友,帮我解决了问题。
特别感谢ID为net_lover,cj205这两位朋友的不厌其烦的帮我解决问题。
另外再次感谢,所有的参与回答和浏览的朋友们,谢谢了。hch126163的方式虽然可以解决问题,但是调试的时候有时候是会死循环的,但是不走调试器的时候却是OK的。这个问题仍然很奇怪。不管怎么样辛苦大家这么久,先结贴了吧。