【问题】
使用如下代码:
test.html
<html> <head> <title>商家管理系统</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <link rel="stylesheet" type="text/css" href="lib/easyui/themes/bootstrap/easyui.css"> <link rel="stylesheet" type="text/css" href="lib/easyui/themes/icon.css"> <script type="text/javascript" src="lib/easyui/jquery.min.js"></script> <script type="text/javascript" src="lib/easyui/jquery.easyui.min.js"></script> <style type="text/css"> html,body { height:100%; margin:0 auto; } </style> <script> $(function(){ $('#test').bind('click', function(){ createWindow('#content', '添加团购描述', 700, 500, 'goodsdetaileditform.html'); }); }); function createWindow(contextId, title, width, height, url){ var cur_open_windowId = '#testwin'; $(contextId).empty(); $(contextId).append('<div id="testwin" style="text-align:center;margin:0 auto; vertical-align:middle; display: table-cell; "></div>'); $(cur_open_windowId).window({ width:width, height:height, collapsible:false, minimizable:false, maximizable:false, title:title, cache: false, modal:true }); $(cur_open_windowId).window('refresh', url); } </script> </head> <body> <a id="test" class="easyui-linkbutton" style="width:183px; margin:3px 5px; margin-top:6px;">发布商品</a> <div id="content"></div> </body> </html>
和goodsdetaileditform.html
<script type="text/javascript" charset="utf-8" src="lib/kindeditor/kindeditor-all.js"></script> <script type="text/javascript" charset="utf-8" src="lib/kindeditor/lang/zh_CN.js"></script> <script type="text/javascript" charset="utf-8" src="lib/kindeditor/ekindeditor.js"></script> <div class="easyui-panel" border=0 > <div style="height: 100%; margin: 0 auto; overflow:hidden;"> <form id="ff" method="post" title="test" border=0 enctype="multipart/form-data"> <table cellpadding="1" border=0> <input type="hidden" readOnly=true id="goodsId" name="goodsId" /> <textarea name="easyui_editor" id="easyui_editor" class="easyui-kindeditor" border=0 style="width: 100%; height: 450px; overflow:hidden;"></textarea> </table> </form> <div style="text-align:center;padding-bottom: 10px;"> <a href="javascript:void(0)" class="easyui-linkbutton" style="width: 100px;" onclick="submitForm()">提交</a> <a href="javascript:void(0)" class="easyui-linkbutton" style="width: 100px;" onclick="$('#testwin').window('close')">关闭</a> </div> </div> </div> <script> var testcontent = "ceshi"; $(function(){ setTimeout(initForm,50); }); function initForm(){ var kindeditor = window.editor; kindeditor.html(testcontent); kindeditor.sync(); }; function submitForm(){ } </script>
然后测试结果是:
第一次点击后:
可以加载kindeditor,并且显示加载进来的html的内容:
第二次再点击团购编辑,结果,虽然可以load进来kindeditor,但是html内容却无法加载了:
【折腾过程】
1.怀疑可能是ajax加载html的问题,所以直接给要加载的内容赋值为固定的值:
$(function(){ setTimeout(initForm,50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
问题依旧:
第一次正常加载,第二次kindeditor可以显示,但是无法加载html内容。
2.看着感觉像是initForm只执行了一遍,所以第二次再去点击后,结果没有执行对应的initForm,所以无法加载html内容。
此处的相关代码运行逻辑是:
点击修改时,调用的是:
{ id:'editGoodsDesc', text:'修改团购描述', disabled:true, iconCls: 'icon-edit', handler: function(){ var row = $(contextId).datagrid('getSelected'); cur_goodsId = row.id; cur_goods_description = row.description; createWindow(contextId, '修改团购描述', 700, 500, 'view/store/form/goodsdetaileditform.html'); } }
goodsdetaileditform.html
再去调用
$(function(){ setTimeout(initForm,50); });
延迟加载了:
function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; kindeditor.html(cur_goods_description); kindeditor.sync(); };
3.搜:
createWindow js run once
jsp createWindow second time js not run
参考:
Understanding Execution Contexts
好好看看学学逻辑。
JavaScript tutorial – Creating time delays
4.搜:
js createWindow setTimeout run once
参考:
javascript – setTimeout runs only once? – Stack Overflow
去换成setInterval试试:
先去研究setInterval:
搜:
js setInterval
参考:
很明显,需要手动的调用clearInterval去清除掉。
去试试:
$(function(){ // setTimeout(initForm,50); setInterval(initForm,50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
问题依旧。
5.去换成:
$(function(){ setInterval("initForm()",50); });
试试:
问题依旧。
6.试试:
var kindeditor = window.editor; $(function(){ setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
第一次都无法加载html内容。
7.加上调试代码试试:
$(function(){ alert("Into second page function"); setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
第二次也是可以进入alert的->说明此处的函数的确在新加载时是可以被执行到的。
但就是第二次kindeditor无法加载html内容了。
8.再去调试第二次能否获得对应的kindeditor的句柄:
$(function(){ // alert("Into second page function"); // setTimeout(initForm,50); // setInterval(initForm,50); setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
一直刷新显示:
说明了此处的setInterval是工作的。
9.换成setTimeout:
$(function(){ // alert("Into second page function"); setTimeout(initForm,50); // setInterval(initForm,50); // setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); kindeditor.sync(); };
结果:
第二次也是可以像上面一样,弹出[object Object]的提示的:
说明第二次也是可以获得kindeditor的句柄的。
但是为何设置html值,却无法显示?
10.去给对应的ekindeditor.js加上调试代码,看看之前加的afterChange是否生效:
afterChange:function(){ this.sync();//这个是必须的,如果你要覆盖afterChange事件的话,请记得最好把这句加上. alert("KindEditor sync after change take effect"); }
和:
$(function(){ // alert("Into second page function"); setTimeout(initForm,50); // setInterval(initForm,50); // setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); //kindeditor.sync(); };
结果:
第二次是生效的:
11.去看看kindeditor是否有什么特殊参数设置,使得第二次加载的内容不显示。
没找到。
12.搜:
kindeditor 第二次不加载
参考:
和我遇到同样的问题:
“前台页面通过easyui当中的datagrid进行数据显示,当选中一行数据时点击编辑或者查看按钮,将该行数据显示到kindeditor当中,点击第一次正常加载,第二次加载时,不显示数据,”
但是没人解决。
checkboxlist启用autopostback后重新选择选项后不能加载kindeditor-CSDN论坛-CSDN.NET-中国最大的IT技术社区
提到有个autopostback,去找找看这个参数的含义。
搜:
autopostback
参考:
什么是AutoPostBack? – hexianghong888的专栏 – 博客频道 – CSDN.NET
此处并没有发现此项目的文件哪里设置了AutoPostBack。
13.参考:
Kindeditor在谷歌浏览器中ready无法执行解决_百度经验
看到有个:
afterBlur: function(){this.sync();},//和DWZ 的 Ajax onsubmit 冲突,提交表单时 编辑器失去焦点执行填充内容
去查查这个afterBlur,以及其他类似的函数,找到了官网的解释:
设置编辑器创建后执行的回调函数。
- 数据类型: Function
- 默认值: 无
编辑器内容发生变化后执行的回调函数。
- 数据类型: Function
- 默认值: 无
按下TAB键后执行的的回调函数。
- 数据类型: Function
- 默认值: 插入4个空格的函数
编辑器聚焦(focus)时执行的回调函数。
- 数据类型: Function
- 默认值: 无
编辑器失去焦点(blur)时执行的回调函数。
- 数据类型: Function
- 默认值: 无
14.搜:
kindeditor 第二次
参考:
【转】jquery validate验证框架与kindeditor使用需二次提交的问题_非洲小白脸_新浪博客
试试:
afterChange:function(){ this.sync();//这个是必须的,如果你要覆盖afterChange事件的话,请记得最好把这句加上. alert("KindEditor sync afterChange"); }, afterBlur : function(){ this.sync(); //编辑器失去焦点时直接同步,可以取到值 alert("KindEditor sync afterBlur"); }
结果:
问题依旧。
15.看到:
【求救】Kindeditor第二次点击列表时无法将获取到的信息显示在编辑器上?
好像问题一样:
其也是用了datagrid,结果没人回答。而且还是Kindeditor的官方。。。
不过参考其办法,其实也去调试,看看当时第二次设置的html值是否正常:
$(function(){ // alert("Into second page function"); setTimeout(initForm,50); // setInterval(initForm,50); // setInterval("initForm()",50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); alert(kindeditor.html()); //kindeditor.sync(); };
结果:
第二次也是可以正确获得kindeditor的html的值:
的,但是结果就是没有刷新显示。
看来的确就是KindEditor的bug了啊。。。
16.去看看KindEditor中是否有函数可以重新创建编辑器的,或者refresh之类的。
没找到,但去试试show():
$(function(){ setTimeout(initForm,50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); kindeditor.show(); alert(kindeditor.html()); };
结果:
问题依旧。
17.再去试试blur和sync:
http://kindeditor.net/docs/editor.html#focus
$(function(){ setTimeout(initForm,50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); kindeditor.html(cur_goods_description); kindeditor.show(); alert(kindeditor.html()); kindeditor.sync(); kindeditor.blur(); kindeditor.focus(); };
结果:
离开焦点或获得焦点是可以正常执行。
但是问题依旧,第二次还是不显示html的内容。
18.难道实在不行,需要我去调试KindEditor的js??
那可是太多的js代码, 很难看懂啊。。。
19.把filterMode设置为false试试:
$.fn.kindeditor.defaults = { filterMode : false, resizeType : 1, allowPreviewEmoticons : false,
结果:
问题依旧。
20.去试试别的方式设置html的值:
结果发现:
中的,都只是get html的值,而不是set html的:
html=document.getElementById('editor_id').value;// 原生API html=K('#editor_id').val();// KindEditor Node API html=$('#editor_id').val();// jQuery
所以没法试。
21.算了,去换用另外一种办法:
把之前用createWindow弹出编辑页面的事情,换成新打开html页面,看看能否绕过KindEditor的bug。
【已解决】jsp中把js的createWindow打开窗口变成新打开一个HTML网页
22.不过上面方法还没折腾完,看到:
ExtJs 集成UEditor and KindEditor | ITLee
想办法是去试试,则新创建出来的window关闭时,加上onDestroy
然后也看到这里说了这个事情:
KindEditor 销毁与自动高度冲突解决 – 皓月青峰 – 博客园
在extjs集成KindEditor无法获得焦点的问题(Chrome和Firefix) – 吉祥小家 – ITeye技术网站
去试试:
$(function(){ // alert("Into second page function"); setTimeout(initForm,50); }); function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor; alert(kindeditor); if(kindeditor != null){ kindeditor.remove(); kindeditor = kindeditor.create(); } kindeditor.html(cur_goods_description); kindeditor.show(); alert(kindeditor.html()); };
结果:
没用。
23.先去搞懂createWindow的用法和关闭对应的事件:
【已解决】js中的createWindow的用法和获取对应的关闭窗口的事件
24.然后就可以去添加对应的代码,在窗口销毁,关闭的时候,销毁KindEditor:
参考:
remove – KindEditor 4.x Documentation
结果:
创建窗口时不变:
$(cur_open_windowId).window({ width:width, height:height, collapsible:false, minimizable:false, maximizable:false, title:title, cache: false, modal:true }); $(cur_open_windowId).window('refresh', url);
打开窗口时内部处理:
<script> var kindeditor = window.editor; alert("Into script, cur_open_windowId=" + cur_open_windowId); $(cur_open_windowId).window({ onBeforeDestroy: function () { alert("onBeforeDestroy, window.editor=" + window.editor); //window.editor.remove('textarea[name="htmlcontent"]'); //当窗口关闭前销毁KindEditor window.editor.remove(); //当窗口关闭前销毁KindEditor } }); </script>
结果没用。
25.初始化就设置:
$(cur_open_windowId).window({ width:width, height:height, collapsible:false, minimizable:false, maximizable:false, title:title, cache: false, modal:true, onBeforeClose: function () { alert("onBeforeClose, window.editor=" + window.editor); window.editor.remove(); //当窗口关闭前销毁KindEditor }, }); $(cur_open_windowId).window('refresh', url);
之后不用:
<script> var kindeditor = window.editor; alert("Into script, cur_open_windowId=" + cur_open_windowId); $(cur_open_windowId).window({ onBeforeDestroy: function () { alert("onBeforeDestroy, window.editor=" + window.editor); window.editor.remove(); //当窗口关闭前销毁KindEditor } }); </script>
结果还是不行。
26.重新销毁后重建:
function initForm(){ cur_goods_description = "pure fixed html content test"; var kindeditor = window.editor.remove().create(); alert("remove and recreate kindeditor: kindeditor=" + kindeditor); kindeditor.html(cur_goods_description); };
还是不行。
27.试试:
var kindeditor = window.editor.create(); alert("recreate kindeditor: kindeditor=" + kindeditor);
结果:
还是不行。
28.试试:
$(cur_open_windowId).window({ width:width, height:height, collapsible:false, minimizable:false, maximizable:false, title:title, cache: false, modal:true, onBeforeClose: function () { alert("onBeforeClose, window.editor=" + window.editor); window.editor.remove(); //当窗口关闭前销毁KindEditor }, onBeforeDestroy: function () { alert("onBeforeDestroy, window.editor=" + window.editor); window.editor.remove(); //当窗口关闭前销毁KindEditor } }); $(cur_open_windowId).window('refresh', url);
结果:
还是不行。
此处变成:
即使最后在Window销毁destroy之前去remove销毁KindEditor,也还是无法绕过这个KindEditor的bug。
暂时放弃使用这种办法了。
29.继续去弄:
【已解决】jsp中把js的createWindow打开窗口变成新打开一个HTML网页
【总结】
最后是通过新打开HTML网页,实现规避KindEditor的bug,保证每次点击信息编辑页面后,可以正常打开页面,加载KindEditor,加载和显示商品信息。