异步/Ajax 加载 Kindeditor 失败

前端之家收集整理的这篇文章主要介绍了异步/Ajax 加载 Kindeditor 失败前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。


问题描述

使用 jquery 的 load 方法加载页面时,被加载页面的Kindeditor 控件显示失败。


原因

Kindeditor 代码片段
  1. function _ready(fn) {
  2. if (_readyFinished) {
  3. fn(KindEditor);
  4. return;
  5. }
  6. var loaded = false;
  7. function readyFunc() { //初始化方法
  8. if (!loaded) {
  9. loaded = true;
  10. fn(KindEditor);
  11. _readyFinished = true;
  12. }
  13. }
  14. function ieReadyFunc() {
  15. if (!loaded) {
  16. try {
  17. document.documentElement.doScroll('left');
  18. } catch(e) {
  19. setTimeout(ieReadyFunc,100);
  20. return;
  21. }
  22. readyFunc();
  23. }
  24. }
  25. function ieReadyStateFunc() {
  26. if (document.readyState === 'complete') {
  27. readyFunc();
  28. }
  29. }
  30. if (document.addEventListener) {
  31. _bind(document,'DOMContentLoaded',readyFunc); //将初始化方法 bind 在 documet 对象上
  32. } else if (document.attachEvent) {
  33. _bind(document,'readystatechange',ieReadyStateFunc); <span style="font-family: Arial,Helvetica,sans-serif;">//将初始化方法 bind 在 window 对象上</span>
  34. var toplevel = false;
  35. try {
  36. toplevel = window.frameElement == null;
  37. } catch(e) {}
  38. if (document.documentElement.doScroll && toplevel) {
  39. ieReadyFunc();
  40. }
  41. }
  42. _bind(window,'load',readyFunc);
  43. }

查看上面代码发现 Kindeditor 控件的初始化方法是 bind 在页面中的 window 和 document 对象的 onload 事件上。
所以使用普通方式请求含有Kindeditor 控件的页面,当页面加载时会触发 window 和document 的 onload 事件,也就初始化了Kindeditor 控件
而使用 ajax 方式加载含有Kindeditor 控件的页面,是不会触发onload 事件的。

解决方

经过上面的分析发现Kindeditor 控件这所以不显示是因为没有触发window 和document 的 onload 事件。
所以只要在加载完含有Kindeditor 控件的页面后手动触发一次 onload 事件即可。
  1. //chorme,firefox
  2. var event = document.createEvent('HTMLEvents');
  3. event.initEvent("load",true,true);
  4. window.dispatchEvent(event);
  5. //ie
  6. if(document.createEventObject){
  7. var event = document.createEventObject();
  8. window.fireEvent('onload',event);
  9. }

猜你在找的Ajax相关文章