加载tinymce后执行js函数

时间:2016-06-05 10:51:26

标签: javascript jquery tinymce document-ready

我有一个选择onchange触发一个js功能来显示/隐藏tinymce编辑器:

<select id="mySelect" onChange="myFuntion()">
<option value="1">Yes</option>
<option value="0">No</option>

然后我有一个带有tinymce的textarea(在页面加载时加载)。

<textarea class="mce" id="myTextarea"></textarea>
<script src="tinymce.js></script> // file with global tinymce.init({ ... });

js功能如下:

<script>    
function myFuntion(){ 
  if( $( '#mySelect' ).val() == '1' ) { tinymce.get( 'myTextarea' ).show(); } 
  else { tinymce.get( 'myTextarea' ).hide(); }
}
$( document ).ready(function() { myFuntion(); }); // show/hide tinymce based on how the mySelect setting is on page load

除了“ $(document).ready(function(){myFuntion();}); ”抛出错误“ Uncaught TypeError:无法读取属性'show'of null “,我认为是因为tinymce尚未加载。

有一种方法可以更改“文档就绪功能”,“加载tinymce时>执行myFunction()”

PS:我使用tinymce 4,tinymce.init()在外部文件上并在其他页面上使用,所以我不想编辑这个文件

修改 我的实际解决方法是使用: setTimeout(function(){myFunction();},1500); 但如果有回调或类似,例如$(document).on('tinymce:init')会很棒

3 个答案:

答案 0 :(得分:3)

在tinymce 4中尝试使用Promise

tinymce.init({
//some settings
}).then(function(editors) {
   //what to do after editors init
});

答案 1 :(得分:2)

要添加Kim Gysen写的答案......您可以随时使用JavaScript来逐页修改/扩展标准init。

例如,从标准配置开始:

baseConfig = {
    selector: 'textarea'
    ....
}

...因为这只是一个简单的JavaScript对象,所以在使用它来初始化TinyMCE之前,可以将其他属性/方法注入该对象。

例如:

 customConfig = {
    setup: function (editor) {
        editor.on('init', function () {
            //Do what you need to do once TinyMCE is initialized
        });
    }
}

然后您可以将customConfig“注入”baseConfig。最简单的方法是使用jQuery的extend方法:

$.extend(baseConfig, customConfig);

...这将采用customConfig中的所有方法和属性,并将其添加到baseConfig。完成后,您可以使用新更新的baseConfig

加载TinyMCE
tinymce.init(baseConfig);

这种通用技术允许您创建“标准”配置,其中包含所需的所有基本功能,同时逐页注入其他配置选项。

现在,您可以在需要时触发TinyMCE中的“onInit”功能,而无需修改其他地方使用的核心配置。

答案 2 :(得分:0)

根据文档,您必须按如下方式声明回调:

static async Task OnQueryReceived(object sender, QueryReceivedEventArgs e)
        {
            DnsMessage query = e.Query as DnsMessage;
            if (query == null) return;
            DnsMessage response = query.CreateResponseInstance();

            if (response.Questions.Any())
            {
                DnsQuestion question = response.Questions[0];
                DnsMessage upstreamResponse = await DnsClient.Default.ResolveAsync(question.Name, question.RecordType, question.RecordClass);

                response.AdditionalRecords.AddRange(upstreamResponse.AdditionalRecords);
                response.ReturnCode = ReturnCode.NoError;

                if (!question.Name.ToString().Contains("yourdomain.com"))
                {
                    response.AnswerRecords.AddRange(upstreamResponse.AnswerRecords);
                }
                else
                {
                    response.AnswerRecords.AddRange(
                        upstreamResponse.AnswerRecords
                            .Where(w => !(w is ARecord))
                            .Concat(
                                upstreamResponse.AnswerRecords
                                    .OfType<ARecord>()
                                    .Select(a => new ARecord(a.Name, a.TimeToLive, IPAddress.Parse("192.168.0.199"))) // some local ip address
                            )
                    );
                }

                e.Response = response;
            }
        }

这是他们提供的手柄,以确保tinyMCE准备就绪 你在这说什么:

  

我使用tinymce 4,tinymce.init()在外部文件上使用   其他页面,所以我不想编辑这个文件

对我来说没有多大意义。
根据文件:

  

oninit:此选项使您可以指定要执行的功能   当所有编辑器实例完成初始化时。这是   很像HTML页面的onload事件。

清楚地表明这是你应该去的方式 声明function myCustomOnInit() { alert("We are ready to rumble!!"); } tinyMCE.init({ ... oninit : myCustomOnInit }); 的位置无关紧要,只需确保添加要执行的功能即可。