Bookmarklet和tinyMCE

Bookmarklet和tinyMCE,tinymce,bookmarklet,Tinymce,Bookmarklet,函数loadBookmarklet(){ var scriptT=document.createElement(“脚本”); scriptT.src=“”; scriptT.type=“text/javascript” document.body.appendChild(scriptT); tinyMCE.init({ 模式:“文本区域”, 主题:“简单” }); }; 我得到的错误tinyMCE没有定义,有人能帮我吗 新错误 这是我的新代码,它给了我另一个错误 function loadBoo

函数loadBookmarklet(){ var scriptT=document.createElement(“脚本”); scriptT.src=“”; scriptT.type=“text/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
变量之前,您没有等待tiny_mce.js完成加载

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

  • onload/oncomplete
    处理程序附加到注入的脚本元素,然后将init代码移动到该处理程序中。(此方法可能因浏览器而异,包括
    onload
    oncomplete
  • 设置一个
    setTimeout
    函数,检查是否存在
    tinyMCE

    1.如果它不存在,它会再次调用自己
    2.如果存在超时,则清除超时并调用init脚本
  • 我通常使用第二种方法,因此您的代码可以调整为

    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);
    }
    
    逐步了解上述情况:

  • TinyMCE已加载
  • 当tinyMCE完成加载时,您的小部件将被加载
  • 当小部件完成加载时,变量
    newTM
    被创建为
    tinyMCE
  • tinyMCE已初始化

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

    我添加了您上面提到的代码,尽管它告诉我变量是“未定义的”,但它似乎处于某种无限循环中。下面是新代码,我是否遗漏了什么??函数TM_wait(){if(typeof tinyMCE='undefined'){window.setTimeout(TM_wait,100);}else{tinyMCE.init({mode:“textaries”,theme:“simple”})}}函数loadBookmarklet(){var scriptT=document.createElement(“script”);scriptT.src=“;scriptT.type=“text/javascript”;document.body.appendChild(scriptT);TM_wait();}在加载tinyMCE之前,它应该处于循环中。请检查tiny_mce.js是否没有执行404i无法解决的错误tinyMCE未定义,但添加了scriptT.onload=function(){}行。现在,我遇到的错误是,当我尝试访问bookmarklet.js中的tinyMCE变量时,它给了我一个错误tinyMCE null。你知道如何将tinyMCE变量从具有bookmarklet函数的html主页传递到js文件,js文件在单击bookmarklet时处理什么操作吗?查看编辑我的答案