[第四次发帖]有关eval拼接字符串时的运行时间错误(很奇怪的问题,欢迎大学来讨论!)

llddyy123wq 2011-01-18 11:03:42
以下代码只是一小部分,但是足以可以说明这个问题了。

经过调试调用这个函数时,所传的参数均有值,可以在以下图片中看到

这个问题的最奇怪之处是
我调试时走到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="";
}
}

}
...全文
288 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
wllllll 2011-01-18
  • 打赏
  • 举报
回复
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
}
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sid2008 的回复:]
var a = "editor1"+n).setHTML(val);
eval(a)
[/Quote]
第一眼,我肯定你这个办法是没用的。
第二眼,我再想了想,觉得也不一定。
然后我就试了试。
第三眼,我就失望了。
一样的不行。一样的错误,一样的调试后可以通过,不调试就没反应。
笨熊熊 2011-01-18
  • 打赏
  • 举报
回复
var a = "editor1"+n).setHTML(val);
eval(a)
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hch126163 的回复:]
document.getElementById("editor1"+n).setHTML(val);
[/Quote]
一样的不行的,我早都试过了。最开始想到用的就是这个。要是这样行,我就不会用eval了
hch126163 2011-01-18
  • 打赏
  • 举报
回复
document.getElementById("editor1"+n).setHTML(val);
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
真的可以了。呵呵。
非常感谢ID为hch126163的朋友,帮我解决了问题。
特别感谢ID为net_lover,cj205这两位朋友的不厌其烦的帮我解决问题。
另外再次感谢,所有的参与回答和浏览的朋友们,谢谢了。

hch126163的方式虽然可以解决问题,但是调试的时候有时候是会死循环的,但是不走调试器的时候却是OK的。这个问题仍然很奇怪。

不管怎么样辛苦大家这么久,先结贴了吧。
weakey 2011-01-18
  • 打赏
  • 举报
回复
很诡异的问题。被吓住了。帮顶顠过。
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 hch126163 的回复:]
个人认为最好的方法是:document.getElementById("editor1"+n).setHTML("aa");

运行报错,调试正确,很有可能是 cj205 说的 异步问题,楼主可以仔细看看 setHTML 方法的定义


变通方法(我有这样解决过问题):

function setEditHtml(editerID,html)
{
var editer = doc……
[/Quote]
这个方法虽然是啰嗦了一点,但是我觉得也许是有必要的。我赶快去试试吧。呵呵。
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 net_lover 的回复:]
图片里面显示的是对象不支持此属性和方法。感觉是对象有问题。注意 editor1+N还是editor+N?
[/Quote]
是editor1+N.
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 net_lover 的回复:]
如果对象正确
document.getElementById("editor1"+n)
你再看看该对象是否有setHTML方法?
如果有,就应当是可以的,怎么会不能用呢?
[/Quote]
对象肯定是有这个方法的。但是调试器里面是看不到这个方法的。
因为这个方法是ewebeditor对象内部封装的方法。
孟子E章 2011-01-18
  • 打赏
  • 举报
回复
图片里面显示的是对象不支持此属性和方法。感觉是对象有问题。注意 editor1+N还是editor+N?
hch126163 2011-01-18
  • 打赏
  • 举报
回复
个人认为最好的方法是: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);



孟子E章 2011-01-18
  • 打赏
  • 举报
回复
如果对象正确
document.getElementById("editor1"+n)
你再看看该对象是否有setHTML方法?
如果有,就应当是可以的,怎么会不能用呢?
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
再拱一拱,不相信,这么多人就没人遇到过这样的问题吗
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 cj205 的回复:]
1.所有的ewebeditor对象都是在后台动态生成的。
2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
3.就是其它干扰因素太多,可能会导致不可预知的问题发生。

这3点 除了3太虚以外 其他两点都不是出错的理由。
[/Quote]
3的确比较虚,但是这些个问题呀,我真的无法再表述的更清楚了。
否则就不需要人们见面讨论问题了,网络毕竟也是有局限性。
当面谈又搞不成,所以很是郁闷。
人:眼,手,耳,嘴。
更加的体会到人的这些器官一个也不能少呀。汗
Mr-Jee 2011-01-18
  • 打赏
  • 举报
回复
1.所有的ewebeditor对象都是在后台动态生成的。
2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
3.就是其它干扰因素太多,可能会导致不可预知的问题发生。

这3点 除了3太虚以外 其他两点都不是出错的理由。
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
上面有个图片的右半边被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>");
}
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cj205 的回复:]
eval不致带来如此问题
从你的代码中我无法获取更多信息,还是认为是这个可能性比较大
[/Quote]
EVAL这个东东的确是个好东西。它本身是没什么错的。
关键是在这我里面用的时候情况太过复杂。我这个情况特别之处在于
1.所有的ewebeditor对象都是在后台动态生成的。
2.EVAL执行的方法是ewebeditor对象的封装方法,而不是常见的DOM对象的系统方法
3.就是其它干扰因素太多,可能会导致不可预知的问题发生。

但是用ieDebugger调试时能走到我说的这段代码来,且参数都有值,就不应该是代码其它地方有问题了。
我也不知道要怎么呈现,才能更清楚的表达我的意思。我怕代码贴太多了,影响观看。
llddyy123wq 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wllllll 的回复:]
document.getElementById("editor11").setHTML("aa");

这样也难已执行吧.
最好还是乖乖的写标准写法: document.getElementById("editor11").innerHTML = "aa";

也就是:

eval("document.getElementById(\"editor1" + n + "\").inn……
[/Quote]
你的意思,我明白。可是这个setHTML方法是这个对象封装的方法,而不是HTML元素的内部方法,所以用innerHTML是不行的。
有关ewebEditor的API文档请参考http://www.ewebeditor.net/documentation/
里面有详细的描述。
Mr-Jee 2011-01-18
  • 打赏
  • 举报
回复
eval不致带来如此问题
从你的代码中我无法获取更多信息,还是认为是这个可能性比较大
加载更多回复(7)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧