我想解决CKEditor的问题。我使用jQuery颜色选择器为DIV标签添加背景颜色。然后我允许用户使用CKEditor编辑Div标签内容。但是,我注意到没有一种简单的方法来获取div标签的背景颜色,然后在编辑器加载时将其作为CKEditor的背景颜色。
我已经阅读了bodyClass和bodyId,并且不认为这些解决了我的问题。我没有类元素,但有像
这样的内联样式声明<div class="tp-header" style="background-color:#CCCCCC;">content</div>
我按如下方式调用CKEditor:
var editorId = 'editor1';
var instance = CKEDITOR.instances[editorId];
var color = $('.' + headerElementClass).css('background-color');
if (instance) { CKEDITOR.remove(instance); }
$('#' + editorId).ckeditor({ toolbar: 'BasicHtml', height: '100px', width: '500px', fullPage: false, bodyClass : 'background-color:' + color });
$('#' + editorId).val($('.' + headerElementClass).html());
请注意 bodyClass 的使用失败。有没有办法做到这一点?我在网站上匆匆寻找答案,却找不到答案。我希望有人在这里有答案。
答案 0 :(得分:1)
我正在考虑这个问题,我提出了一个更简单的解决方案 我没有使用CKEditor jQuery适配器,因此您可能需要对其进行修改以适合您的情况。
我使用标准的JavaScript集成方法对其进行了测试。
快速概述
设置变量
创建编辑器实例。
插入此&#34; addCss&#34;函数调用:
CKEDITOR.instances[editorId].addCss( 'body { background-color: '+color+'; }' );
这就是它的全部内容。以下是基于您的代码的示例:
// I added the "id" attribute:
<div id="editor1" class="tp-header" style="background-color:#CCCCCC;">content</div>
// Declare the variables, I added "headerElementClass".
var headerElementClass = "tp-header";
var color = $('.' + headerElementClass).css('background-color');
var editorId = 'editor1';
// Create the instance.
var instanceOne = CKEDITOR.replace( editorId,
{
toolbar: 'Basic',
height: '100px',
width: '500px',
fullPage: false,
customConfig : 'yourCustomConfigFileIfUsed.js'
});
// Insert the "addCss" function call:
instanceOne.addCss( 'body { background-color: '+color+'; }' );
如果您愿意,可以将addCss函数调用移动到您的配置文件中(将它放在editorConfig函数之外)。
好吧, 乔
离开更复杂的方法,有人可能会发现这些概念很有用。
您可以使用(bodyClass:&#39; nameOfClass&#39;),然后为该类的background-color属性赋值。但这很难,因为你有一个动态的背景色。
要动态分配背景颜色,您可以执行以下操作: 从您的代码开始并继续使用jQuery:
var editorId = 'editor1';
var instance = CKEDITOR.instances[editorId];
var color = $('.' + headerElementClass).css('background-color');
// Create a unique body id for this instance "editor1" ( bodyIdForeditor1 )
var idForBody = 'bodyIdFor' + editorId;
if (instance) { CKEDITOR.remove(instance); }
// Use bodyId instead of the original bodyClass assignment
$('#' + editorId).ckeditor({
toolbar: 'BasicHtml',
height: '100px',
width: '500px',
fullPage: false,
bodyId : idForBody
});
$('#' + editorId).val($('.' + headerElementClass).html());
// After both the document and editor instance are ready,
// assign the background color to the body
// Wait for the document ready event
$(document).ready(function(){
// Wait for the instanceReady event to fire for this (editor1) instance
CKEDITOR.instances.editor1.on( 'instanceReady',
function( instanceReadyEventObj )
{
var currentEditorInstance = instanceReadyEventObj.editor;
var iframeDoc=null;
// Create a function because these steps will be repeated
function setIframeBackground()
{
// The CKEditor content iframe doesn't have a Name, Id or Class
// So, we'll assign an ID to the iframe
// it's inside a table data cell that does have an Id.
// The Id of the data cell is "cke_contents_editor1"
// Note that the instance name is the last part of the Id
// I'll follow this convention and use an Id of "cke_contents_iframe_editor1"
$("#cke_contents_editor1 iframe").attr("id", "cke_contents_iframe_editor1");
// Now use the iframe Id to get the iframe document object
// We'll need this to set the context and access items inside the iframe
$('#cke_iframe_editor1').each(
function(){ iframeDoc=this.contentWindow.document;}
);
// Finally we can access the iframe body and set the background color.
// We set the Id of the body when we created the instance (bodyId : idForBody).
// We use the iframe document object (iframeDoc) to set the context.
// We use the "color" variable created earlier
$('#' + idForBody, iframeDoc).css("background-color", color);
}
// Call the function to set the color when the editor instance first loads
setIframeBackground();
// When the user switches to "source" view mode, the iframe is destroyed
// So we need to set the color again when they switch back to "wysiwyg" mode
// Watch for the "mode" event and check if we're in "wysiwyg" mode
currentEditorInstance.on( 'mode', function()
{
if(currentEditorInstance.mode == 'wysiwyg')
setIframeBackground();
});
}
);
});
好吧, 乔
答案 1 :(得分:1)
codewaggle的答案很好,但是如果你想在编辑器的<body>
元素上设置内联样式,你也可以这样做:
editor.document.getBody().setStyle()
或
editor.document.getBody().setStyles()
但是,每次调用editor.setData()之后以及用户切换回wysiwyg模式(从源模式)之后,你都需要重做这个,因为这些东西会重新创建编辑器iframe。要做到这一切,请使用函数设置样式,比如setEditorStyle
,,首先检查editor.mode==='wysiwyg'
(editor.document
否则为null),然后添加作为instanceReady
和mode
事件的事件监听器;如果您曾经调用过setData()并且之后不想手动调用它,那么也可能是contentDom
事件。
答案 2 :(得分:0)
动态车身颜色更改CKEditor