我正在使用CkEditor并且想要定义一个自定义模板,它使用AJAX函数来加载HTML字符串。我已经能够定义自定义模板,但如果我使用函数作为模板对象的html属性,则该函数永远不会被执行。是否可以使用带有默认模板插件的AJAX加载模板,还是需要自己编写?
CKEDITOR.editorConfig = function (config) {
config.templates_files = ['/pathtomyfile/custom.js'];
};
CKEDITOR.addTemplates('default', {
imagesPath: CKEDITOR.getUrl(CKEDITOR.plugins.getPath('templates') + 'templates/images/'),
templates: [
{
title: 'Template 1',
image: 'template1.gif',
description: 'A custom template that does not work',
html: function () {
alert('This alert is never called');
var html = '';
$.ajax({
url: 'MyGetURL',
type: "GET",
async: false,
success: function (result) {
html = result;
},
error: function (jqXhr, textStatus, errorThrown) {
alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
}
});
return html;
}
},
{
title: 'Template 2',
image: 'template2.gif',
description: 'A working custom template',
html: '<h1>I Work!</h1>'
}
]
});
答案 0 :(得分:4)
你不能这样做。第一个原因是编辑器期望html
是一个字符串,而不是一个函数。第二个原因是你的AJAX请求没有意义,因为它是异步调用的,return html
在请求完成之前执行。
无论如何,你想要做的是在编辑器准备好后预先加载你的太阳穴。您只需使用jQuery代码更改以下XHR请求,但您必须记住应在CKEDITOR.addTemplates
回调中调用success
:
CKEDITOR.replace( 'editor1', {
templates: 'my',
on: {
instanceReady: function( argument ) {
var httpRequest = new XMLHttpRequest();
httpRequest.onreadystatechange = function() {
CKEDITOR.addTemplates( 'my', {
templates: [
{
title: 'My AJAX-driven template',
html: this.responseText
}
]
});
};
httpRequest.open( 'GET', 'yourFile.html' );
httpRequest.send();
}
}
});
如果您真的想要这样做(很难,我不推荐给您),您应该使用加载自定义模板的代码覆盖templates
命令,然后执行实际命令。我不认为你需要这样做。
玩得开心!
答案 1 :(得分:0)
如果您对使用错误的async: false
属性感到满意,我已通过将自定义配置文件更改为此来解决此问题:
$.ajax({
type: "POST",
url: '/editor/getTemplates',
async: false,
dataType: "json",
success: function(data) {
CKEDITOR.addTemplates("default",{
imagesPath:CKEDITOR.getUrl(CKEDITOR.plugins.getPath("templates")+
"templates/images/"),
templates:data});
},
error: function() {
alert("Error!");
}
});
服务器循环遍历所有模板并生成json编码的数组,templates
应为。
如果你没有将async设置为false(因为它在较新的jQuery中被释放),问题是编辑器会在它到达之前尝试访问它,在这种情况下我认为你必须编辑内部文件。