HTML注释(选择,突出显示,删除格式)

时间:2009-12-10 13:32:06

标签: javascript html css highlighting undo-redo

我正在开发一个基于浏览器网络的跨浏览工具集,允许用户选择网页的任何部分

  • 突出显示,如果您选择:
  

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>

  • UNDO / REDO :很高兴有功能

能够撤消和重做已执行的操作

我有突出显示的部分解决方案

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

3 个答案:

答案 0 :(得分:1)

我认为您仍然可以使用“富文本编辑器”方式(iframe),但随后尝试捕获“onkeypress”,“onkeydown”和其他交互事件以停止默认行为(编辑文档)。

答案 1 :(得分:0)

这是一个很好的资源,帮助我做了类似的事情:http://www.quirksmode.org/dom/execCommand.html

从第一页链接为例:

http://www.quirksmode.org/dom/execCommand/

答案 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照顾:)