在ajax打开的页面中加载tinymce,ajax重新绑定事件响应秘诀

广告位招租
扫码页面底部二维码联系

在一些界面的开发中,我们使用ajax的方【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。法保证页面无刷新的操作,这样可以让操作更【版权所有,侵权必究】【作者:唐霜】流畅。但是有一个问题,通过ajax的方法本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】请求一个页面,把抓取到的节点加载到当前页转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net面的DOM中,这时新加载的dom节点并没【未经授权禁止转载】【原创内容,转载请注明出处】有在当前页面的js初始化过程中绑定事件响【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net应,因此,新加载进来的这些元素不会完成当本文作者:唐霜,转载请注明出处。原创内容,盗版必究。前页面的原始操作。

【转载请注明来源】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。

那么怎么解决这个问题呢?方法很简单,即新加载DOM结束之后,再次执行绑定动作,【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】让新加载的节点元素也可以响应事件。

【版权所有】唐霜 www.tangshu【版权所有】唐霜 www.tangshuang.net【原创内容,转载请注明出处】ang.net转载请注明出处:www.tangshua本文作者:唐霜,转载请注明出处。原创内容,盗版必究。ng.net【关注微信公众号:wwwtangshua【版权所有,侵权必究】未经授权,禁止复制转载。ngnet】原创内容,盗版必究。

在get到这个点之后,我们再来看下tin本文版权归作者所有,未经授权不得转载。【本文受版权保护】ymce的具体实践情况。

转载请注明出处:www.tangshua原创内容,盗版必究。【作者:唐霜】ng.net原创内容,盗版必究。

首先,我们有一个页面a.html,在b.本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。html中有一个textarea需要加载著作权归作者所有,禁止商业用途转载。【转载请注明来源】tinymce作为富文本编辑器。我们希望本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】在a.html中,通过一个弹出层,把b.本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.nethtml加载进来,在a.html中操作这著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。个富文本区域,实现表单提交。就像:

【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。转载请注明出处:www.tangshua【本文受版权保护】本文版权归作者所有,未经授权不得转载。ng.net

2016-03-04 14-08-36屏幕截图

【本文受版权保护】未经授权,禁止复制转载。【关注微信公众号:wwwtangshua未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。ngnet】

那么我们要怎么来实现呢?

【转载请注明来源】【作者:唐霜】【本文首发于唐霜的博客】【本文受版权保护】

我们在a.html中,使用下面的js来实【未经授权禁止转载】【转载请注明来源】现ajax重新绑定事件:

【版权所有】唐霜 www.tangshu【本文首发于唐霜的博客】原创内容,盗版必究。ang.net本文版权归作者所有,未经授权不得转载。
$('#open').click(function(e) {
  e.preventDefault();
  $.get('b.html',function(result) {
    var html = $(result).find('#form');
    $('#dialog').html(html).show(); // 将抓取到的html元素加入到a.html的#dialog节点中,并且把#dialog显示出来
    
    var options = { 
      // tinymce的配置项
    }
    $('#editor').tinymce(options); // 注意,editor的b.html中textarea的id值
  });
});

这样,每次在点击#open这个按钮的时候【作者:唐霜】【原创不易,请尊重版权】,就会先请求b.html,并将抓取到的h本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。tml元素作为内容加载到弹出层中显示出来【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net,并且重新绑定新加载的dom的编辑器事件本文作者:唐霜,转载请注明出处。【原创不易,请尊重版权】,展示富文本编辑器。

【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。

可是有一个严重的问题,估计这个问题很多情【本文受版权保护】著作权归作者所有,禁止商业用途转载。况下都会出现,不单单是tinymce。那【转载请注明来源】【原创不易,请尊重版权】就是dom中是否已经存在有对应的tiny【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】mce.editors?

【转载请注明来源】本文作者:唐霜,转载请注明出处。【本文受版权保护】【版权所有】唐霜 www.tangshu本文作者:唐霜,转载请注明出处。转载请注明出处:www.tangshuang.netang.net

我们要从内存的角度去分析这个问题。当ti【版权所有】唐霜 www.tangshuang.net著作权归作者所有,禁止商业用途转载。nymce被初始化之后,富文本编辑器的渲【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】染结果已经以dom节点的形式存在与内存中【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】,每一个富文本编辑器对应的dom节点由产【版权所有,侵权必究】【转载请注明来源】生该编辑器的textarea的id值(或【版权所有,侵权必究】【版权所有,侵权必究】其他选择器值)决定。这也就让tinymc本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】e开发者决定,在第二次打开tinymce【原创内容,转载请注明出处】【未经授权禁止转载】时,只需要从内存中取出对应的操作,将它再【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。绑定到渲染出来的dom节点上去。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。【转载请注明来源】著作权归作者所有,禁止商业用途转载。

而这个操作,直接影响了我们上述代码的最终本文版权归作者所有,未经授权不得转载。【作者:唐霜】执行效果。因为我们第一次执行$('#editor').tinymce(options);时是ok的,会自然看到富文本编辑器。但是【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。,当我们关闭弹出层,第二次点击#open著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。时,会发现,编辑器处一片空白,编辑器没有【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。被加载。这是什么原因呢?

【版权所有,侵权必究】【作者:唐霜】【访问 www.tangshuang.n未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。et 获取更多精彩内容】

原来,在第二次打开弹出层时,我们通过aj转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】ax去抓取到html元素加载进来之后,t【版权所有,侵权必究】未经授权,禁止复制转载。inymce不会做任何操作。为什么呢?因【转载请注明来源】著作权归作者所有,禁止商业用途转载。为在内存中tinymce已经实例化了#e【版权所有,侵权必究】【关注微信公众号:wwwtangshuangnet】ditor这个textarea,tiny转载请注明出处:www.tangshuang.net【转载请注明来源】mce认为不需要再实例化一次。可是实际上【版权所有,侵权必究】【未经授权禁止转载】,当tinymce实例化一个编辑器时,会转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。通过加载一些新的<div>节著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。点,来实现编辑器的皮肤效果,比如编辑器的【转载请注明来源】【版权所有】唐霜 www.tangshuang.net工具按钮等;而如果我们通过ajax再次加【本文受版权保护】【本文受版权保护】载得到的html中,并没有这些<d【访问 www.tangshuang.net 获取更多精彩内容】【访问 www.tangshuang.net 获取更多精彩内容】iv>节点,而tinymce又不再未经授权,禁止复制转载。【原创内容,转载请注明出处】次实例化#editor,所以实际上,现在【作者:唐霜】【未经授权禁止转载】的dom中,是不存在编辑器皮肤相关的&l【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。t;div>节点的,所以,我们当然转载请注明出处:www.tangshuang.net【本文受版权保护】看不到我们熟悉的编辑器界面。

【本文首发于唐霜的博客】【本文受版权保护】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

那么怎么解决这个问题呢?第一种方法是,我【版权所有】唐霜 www.tangshuang.net【关注微信公众号:wwwtangshuangnet】们仅第一次点击#open的时候把b.ht【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netml的内容加载进来,第二次点击#open【本文首发于唐霜的博客】【版权所有,侵权必究】的时候,不要再去抓取,而是直接打开原来加【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。载好的,这个方法可以称为“缓存法”。但是【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】,缓存法会导致当b.html得到更新时,【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.neta.html打开的内容不即时。比如,原本本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.nettextarea中没有任何内容,可是在第转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。二次打开的时候textarea实际上又被原创内容,盗版必究。原创内容,盗版必究。增加了内容,这样的话,在a.html的缓【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】存中,并不存在这些内容,导致提交表单的时【转载请注明来源】【原创内容,转载请注明出处】候会覆盖原来添加的内容。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】【本文首发于唐霜的博客】未经授权,禁止复制转载。

第二种方法则是我们本文要讲的重新绑定的方转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net法,可以称为“重载法”。什么意思呢?就是【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】取消tinymce对内存中是否存在相关节转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】点的判定,每次执行$('#editor').tinymce(options);时,都往内存中增加新节点(同时销毁原有节本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。点)。当然,这种方法是比较消耗资源的,会原创内容,盗版必究。【作者:唐霜】反复的消耗内存,因此只在必要的时候这样子本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】去操作。

【版权所有】唐霜 www.tangshu【关注微信公众号:wwwtangshuangnet】【本文受版权保护】ang.net【版权所有】唐霜 www.tangshu【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】ang.net【本文受版权保护】【原创不易,请尊重版权】
$('#open').click(function(e) {
  e.preventDefault();
  $.get('b.html',function(result) {
    var html = $(result).find('#form');
    $('#dialog').html(html).show(); // 将抓取到的html元素加入到a.html的#dialog节点中,并且把#dialog显示出来
    var options = {
      // tinymce的配置项
    }
    tinymce.execCommand('mceRemoveEditor',true,'editor'); // tinymce 4.0+
    $('#editor').tinymce(options); // 注意,editor的b.html中textarea的id值
  });
});

和第一段代码相比,多了上面红色的部分。这【原创不易,请尊重版权】未经授权,禁止复制转载。一句表示,将内存中原有的通过#edito【作者:唐霜】【关注微信公众号:wwwtangshuangnet】r创建的tinymce资源销毁,一旦销毁原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。,那么下面的tinymce就会再执行in【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.netit动作了。注意一个细节,上面的R【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】17;editor’不是&#【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。8217;#editor’,原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。该句操作不依赖jquery的语法,而ex未经授权,禁止复制转载。原创内容,盗版必究。ecCommand的第三个参数是edit著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。or_id的意思,也就是textarea【本文受版权保护】【原创不易,请尊重版权】的id属性值。另外,4.0+版本才使用&【原创内容,转载请注明出处】【作者:唐霜】#8217;mceRemoveEdito原创内容,盗版必究。【本文首发于唐霜的博客】r’参数,3.0+版本则使用【本文受版权保护】【本文受版权保护】mceRemoveControlR【版权所有,侵权必究】【转载请注明来源】17;参数,注意区别。

原创内容,盗版必究。转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】ng.net【原创内容,转载请注明出处】【原创不易,请尊重版权】

除了tinymce,很多插件都是这样,比本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。如幻灯、瀑布流、评论框等等,当你使用aj【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。ax去请求新内容时,一定要记住,新加载的【本文受版权保护】本文版权归作者所有,未经授权不得转载。节点,需要重新绑定原有的事件响应。

转载请注明出处:www.tangshua【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。ng.net【原创不易,请尊重版权】

2016-03-04 7658 , ,

为价值买单,打赏一杯咖啡

本文价值76.58RMB