【问题标题】:Bookmarklet and tinyMCE书签和 tinyMCE
【发布时间】:2010-12-31 00:06:12
【问题描述】:

函数 loadBookmarklet() { var scriptT = document.createElement("script"); scriptT.src = "http://abc.com/tinymce/jscripts/tiny_mce/tiny_mce.js"; scriptT.type = "文本/javascript";

document.body.appendChild(scriptT); tinyMCE.init({ 模式:“文本区域”, 主题:“简单” }); };

我收到错误 tinyMCE 未定义,谁能帮我解决这个问题?

新错误

这是我拥有的新代码,它给了我另一个错误

function loadBookmarklet() {
      var scriptT = document.createElement("script");
      scriptT.src = "http://abc.com/tiny_mce.js";
          scriptT.type = "text/javascript";
      scriptT.onload = function(){}
      document.body.appendChild(scriptT);
      tinyMCE.init({ mode : "textareas", theme : "simple" }); 
      newTM = tinyMCE;
      var scriptW = document.createElement("script");
      scriptW.src = "http://abc.com/widget.js";
      scriptW.type = "text/javascript";
      document.body.appendChild(scriptW);

    }

在我的 widget.js 中,我试图将 widget.js 中的 textarea 设置为编辑器

newTM.activeEditor.setContent(selectedText);

错误是

newTM.activeEditor 为空

【问题讨论】:

  • 查看我的答案的编辑

标签: tinymce bookmarklet


【解决方案1】:

那是因为您在引用 tinyMCE 变量之前没有等待 tiny_mce.js 完成加载

您需要推迟tinyMCE.init 代码,直到文件加载完毕。有几种方法可以做到这一点

  1. onload / oncomplete 处理程序附加到注入的脚本元素,然后在该处理程序内移动初始化代码。 (此方法可能因浏览器而异,onloadoncomplete
  2. 设置一个setTimeout 函数来检查tinyMCE 是否存在,
    1.如果不存在,则再次调用自己
    2.如果存在则清除超时并调用初始化脚本

我一般用第二种方法,所以你的代码可以调整成

var scriptT = document.createElement("script"); 
scriptT.src = "http://abc.com/tinymce/jscripts/tiny_mce/tiny_mce.js"; scriptT.type = "text/javascript";
document.body.appendChild(scriptT);

//Your script loading code is above this line

function TM_wait() { //this function checks for existence of tinyMCE
  if(typeof tinyMCE == 'undefined') {
    window.setTimeout(TM_wait,100); 
    //calls itself if tinyMCE is not loaded
  }else{
    tinyMCE.init({ mode : "textareas", theme : "simple" }); 
    //calls the init function cos tinyMCE is loaded
  }

}

TM_wait(); // calls the checker function for the first time

编辑

响应您的编辑,试试这个

function loadBookmarklet() {
      var scriptT = document.createElement("script");
      scriptT.src = "http://abc.com/tiny_mce.js";
      scriptT.type = "text/javascript";
      scriptT.onload = function(){
        var scriptW = document.createElement("script");
        scriptW.src = "http://abc.com/widget.js";
        scriptW.type = "text/javascript";
        scriptW.onload = function(){
           newTM = tinyMCE;
           newTM.init({ mode : "textareas", theme : "simple" }); 
        }
        document.body.appendChild(scriptW);
      }
      document.body.appendChild(scriptT);
}

上面发生的事情的一步一步:

  1. TinyMCE 已加载
  2. 当 tinyMCE加载完成时,您的小部件已加载
  3. 当您的小部件加载完成时,变量newTM 被创建为tinyMCE 的别名
  4. tinyMCE 已初始化

因为我们等待 tinyMCE 和 widget.js 完成加载,所以一切都设置正确且有序。现在您的 newTM 应该包含对 tinyMCE 的引用

【讨论】:

  • 我添加了您上面提到的代码,虽然它给我的变量是“未定义”,但它似乎处于某种无限循环中。新代码如下,我错过了什么吗?函数 TM_wait() { if(typeof tinyMCE == 'undefined') { window.setTimeout(TM_wait,100); }else{ tinyMCE.init({ mode : "textareas", theme : "simple" }); } } 函数 loadBookmarklet() { var scriptT = document.createElement("script"); scriptT.src = "abc./jscripts/tiny_mce/tiny_mce.js"; scriptT.type = "文本/javascript"; document.body.appendChild(scriptT); TM_wait(); }
  • 它应该在一个循环中,直到 tinyMCE 被加载。请检查 tiny_mce.js 是否没有执行 404
  • 我能够解决错误 tinyMCE 未定义,但添加行 scriptT.onload = function(){} 现在我遇到的错误是当我尝试在我的bookmarklet.js,它给了我一个错误 tinyMCE null。任何想法如何将 tinyMCE 变量从具有书签功能的主 html 页面传递给 js 文件,该文件在单击书签时处理什么操作?
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 2012-10-05
相关资源
最近更新 更多