我正在开发一个基于浏览器网络的跨浏览工具集,允许用户选择网页的任何部分
john is< li> big< / li> <李>转储与LT; /锂>
结果
<span style="background-color: rgb(106, 168, 79)">john is</span> <li><span style="background-color: rgb(106, 168, 79)">big</span></li> <li><span style="background-color: rgb(106, 168, 79)">dump</span></li>
john
来自
<span style="background-color: rgb(106, 168, 79)">john is</span> <li><span style="background-color: rgb(106, 168, 79)">big</span></li> <li><span style="background-color: rgb(106, 168, 79)">dump</span></li>
结果
<span style="background-color: rgb(106, 168, 79)"></span> john <span style="background-color: rgb(106, 168, 79)">is</span> <li><span style="background-color: rgb(106, 168, 79)">big</span></li> <li><span style="background-color: rgb(106, 168, 79)">dump</span></li>
能够撤消和重做已执行的操作
我有突出显示的部分解决方案
function highlight(colour) {
var range, sel;
if (document.selection && (!window.getSelection)) {
// IE case
range = document.selection.createRange();
range.execCommand("BackColor", false, colour);
} else if (window.getSelection) {
// Non-IE case
sel = window.getSelection();
if (sel.getRangeAt) {
range = sel.getRangeAt(0);
}
//without designmode=on, you can't highlight the selected html (chrome)
document.designMode = "on";
if (range) {
sel.removeAllRanges();
sel.addRange(range);
}
// HiliteColor avoids FF3.5 from painting the background of the whole block
if (!document.execCommand("HiliteColor", false, colour) ) {
document.execCommand("BackColor", false, colour);
}
document.designMode = "off";
}
}
由于我的要求与richtext编辑器有很多相似之处,因此我在google closures编辑器中查看了ckeditor和(广泛)的代码。我放弃了他们两个人的希望,因为他们只在一个可编辑的iframe中工作。我的一个要求是不允许用户更改原始文本,只允许添加自己的注释(突出显示,内联注释等)。
我很乐意在此提出您的所有意见,如果可能的话,请指出正确的方向。
- Choesang
答案 0 :(得分:1)
我认为您仍然可以使用“富文本编辑器”方式(iframe),但随后尝试捕获“onkeypress”,“onkeydown”和其他交互事件以停止默认行为(编辑文档)。
答案 1 :(得分:0)
这是一个很好的资源,帮助我做了类似的事情:http://www.quirksmode.org/dom/execCommand.html
从第一页链接为例:
答案 2 :(得分:0)
您可以在论坛中找到解决方案:http://cksource.com/forums/viewtopic.php?f=11&t=15659
为了清楚起见,我在下面插入代码:
// Temporary workaround for providing editor 'read-only' toggling functionality.
( function()
{
var cancelEvent = function( evt )
{
evt.cancel();
};
CKEDITOR.editor.prototype.readOnly = function( isReadOnly )
{
// Turn off contentEditable.
this.document.$.body.disabled = isReadOnly;
CKEDITOR.env.ie ? this.document.$.body.contentEditable = !isReadOnly
: this.document.$.designMode = isReadOnly ? "off" : "on";
// Prevent key handling.
this[ isReadOnly ? 'on' : 'removeListener' ]( 'key', cancelEvent, null, null, 0 );
this[ isReadOnly ? 'on' : 'removeListener' ]( 'selectionChange', cancelEvent, null, null, 0 );
// Disable all commands in wysiwyg mode.
var command,
commands = this._.commands,
mode = this.mode;
for ( var name in commands )
{
command = commands[ name ];
isReadOnly ? command.disable() : command[ command.modes[ mode ] ? 'enable' : 'disable' ]();
this[ isReadOnly ? 'on' : 'removeListener' ]( 'state', cancelEvent, null, null, 0 );
}
}
} )();
并在您的javascript中,按以下方式调用
// Turn CKEditor into 'ready-only' mode or vice versa.
CKEDITOR.instances.editor1.readOnly( true );
CKEDITOR.instances.editor1.readOnly( false );
以上基本上提供了一个可编辑的区域(iframe),它只是同时读取的(你不能从键盘输入)。它完全满足我所有的功能。我不必关心如何实现:突出显示,删除格式,撤消和重做。一切都被ckeditor照顾:)