文本编辑器弹出时内容可编辑光标位置在可编辑 div 中

Posted

技术标签:

【中文标题】文本编辑器弹出时内容可编辑光标位置在可编辑 div 中【英文标题】:Content Editable cursor position to be in editable div when popup of text editor occur 【发布时间】:2016-07-05 23:56:44 【问题描述】:

我正在尝试构建一个 jquery 内容可编辑代码,其中用户在将鼠标悬停时识别可编辑 div,一旦单击该 div,内容就会变为可编辑,并且会弹出用于选择编辑类型的按钮。现在,当我单击按钮时,会弹出一个文本编辑器并设置文本格式,一旦单击按钮,光标或指针就会从可编辑的 div 中出来。我正在使用 jquery 使内容可编辑

这是我的代码。

$(function() 
  var mouseX;
  var mouseY;
  var modal = false;
  $(document).mousemove(function(f) 
    mouseX = f.pageX;
    mouseY = f.pageY;
  );

  var openPopup = function(e)  //Function to open popup
    $(e).fadeIn(400);
    $('#mask, [data-nitstextpopup]').fadeIn(400).css(
      'top': mouseY,
      'left': mouseX
    ).draggable();
    $('#mask').css(
      'top': 0,
      'left': 0
    );
    $('[data-nitstextbutton]').hide();
  ;

  var closePopup = function()  // Function to close the popup
    $('#mask, [data-nitstextpopup]').fadeOut(400);
    $('[data-nitstextbutton]').show();
  ;
  $('[data-nitspagelabel]').hover(function() 
    $(this).css('border', 'solid 1px #777');
  , function() 
    $(this).css('border', 'none');
  );
  $('[data-nitspagelabel]').click(function() 
    $(this).attr('contenteditable', 'true');
    var labeltype = $('[data-nitspagelabel]').data("nitslabeltype");
    if (labeltype == "text") 
      if (modal == false) 
        modal = true;
        $('[data-nitstextbutton]').css(
          'top': mouseY,
          'left': mouseX
        ).fadeIn(400).click(function(e) 
          e.preventDefault();
          var popupbox = $(this).attr('href');
          openPopup(popupbox);
        );
      
    
  );
  $('#mask').on('click', function(e) 
    e.stopPropagation();
    closePopup();
    modal = false;
    $('[data-nitstextbutton]').hide();
  );
  $(document).keyup(function(e) 
    if (e.keyCode == 27) 
      closePopup();
      modal = false;
      $('[data-nitstextbutton]').hide();
    
  );
);
#mask 
  display: none;
  background: #9ACD32;
  position: fixed;
  left: 0;
  top: 0;
  z-index: 88888;
  width: 100%;
  height: 100%;
  opacity: 0.2

[data-nitstextpopup] 
  display: none;
  background: #e2e2e2;
  padding: 0px;
  float: left;
  font-size: 1.2em;
  position: fixed;
  width: 250px;
  z-index: 99999;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.0-rc.1/jquery-ui.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>

<body>
  <div id="mask"></div>
  <div>
    <h3>this is new html document generated by newject extention</h3>
  </div>
  <div class="clearfix" data-nitstextbutton style="display: none;">
    <a href="#nitstexteditor" class="btn btn-circle btn-sm default">
            Edit <i class="fa fa-pencil"></i>
        </a>
    <a href="#" class="btn btn-icon-only btn-circle default">
      <i class="fa fa-circle-o-notch"></i>
    </a>
  </div>
  <div id="editable" style="top: 50%; left: 50%" data-nitspagelabel="1" data-nitslabeltype="text">
    <h3>This is the content editable where I can change fonts and edit text</h3>
  </div>
  <div id="nitstexteditor" style="display: none;" data-nitstextpopup="0" data-nitseditor="1">
    <div class="portlet box blue">
      <div class="portlet-title">
        <div class="caption">
          <i class="fa fa-pencil-square-o"></i> Text Editor
        </div>
        <div class="tools">
          <a href="" class="remove">
          </a>
        </div>
      </div>
      <div class="portlet-body form">
        <form role="form">
          <div class="form-body">
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
    											<i class="fa fa-magic"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select style">
              </div>
            </div>
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
                                    <i class="fa fa-font"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select font">
              </div>
            </div>
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
                                    <i class="fa fa-font"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select Size">
              </div>
            </div>
            <div class="form-group">
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-bold"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-italic"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-underline"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-justify"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-left"></i>
              </a>
            </div>
            <div class="form-group">
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-right"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-undo"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-repeat"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-link"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-chain-broken"></i>
              </a>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>

稍后我会将凭据用于格式化文本。提前致谢!

【问题讨论】:

【参考方案1】:

我在特殊情况下使用了停止传播,它起作用了!!!

刚刚使用了下面的代码:

stopPropagation();

完整代码如下:

var key;
var edittag;

function nitspopupeditor(key, edittag)  //Function to format editable items.
  if (edittag) 
    document.execCommand(edittag, false, null);
    $('key').focus();
  
;



function closep()  // Function to close the popup on close button.
  $('[data-nitstextpopup]').fadeOut(400);
  $('[data-nitstextbutton]').show();

$(function() 
  var mouseX;
  var mouseY;
  var modal = false;
  $(document).mousemove(function(f) 
    mouseX = f.pageX;
    mouseY = f.pageY;
  );

  var openPopup = function(e)  //Function to open popup
    $(e).fadeIn(400);
    $('[data-nitstextpopup]').fadeIn(400).css(
      'top': mouseY,
      'left': mouseX
    ).draggable();
    $('[data-nitstextbutton]').hide();
  ;


  var closePopup = function()  // Function to close the popup
    $('[data-nitstextpopup]').fadeOut(400);
    $('[data-nitstextbutton]').show();
  ;

  $('[data-nitspagelabel]').hover(function()  // to hover only editable items
    $(this).css('border', 'solid 1px #777');
  , function() 
    $(this).css('border', 'none');
  );
  $('[data-nitspagelabel]').click(function()  //click function on editable div to get editable buttons
    var $this = $(this);
    key = $this.attr('[data-nitspagelabel]');
    $(this).attr('contenteditable', 'true');
    var labeltype = $('[data-nitspagelabel]').data("nitslabeltype");
    if (labeltype == "text") 
      if (modal == false) 
        modal = true;
        $('[data-nitstextbutton]').css( //popup text editing buttons 
          'top': mouseY,
          'left': mouseX
        ).fadeIn(400).click(function(e) 
          e.preventDefault();
          $this.focus(function() 
            var $this = $(this);
            $this.data('enter', $this.html());
            $this.data('before', $this.html());
            return $this;
          ).on('keyup paste', function()  // any key pressed or paste is used
            var $this = $(this);
            var text = $this.html();
            if ($this.data('before') != text) 
              $this.data('before', text);
              var data = ;
              data[key] = text;
            
            return $this;
          ).on('blur', function()  // Clicking outside send the data to save
            var $this = $(this);
            var text = $this.html();
            if ($this.data('enter') !== text) 
              $this.data('enter', text);
              var data = ;
              data[key] = text;
            
            return $this;
          );
          var popupbox = $(this).attr('href');
          openPopup(popupbox); // opens the editing tools popup
          edittag = $('[data-nitsedittag]').data("nitsedittag");
          nitspopupeditor(key, edittag); // formatting buttons
        );
      
    
  );
  $(document).click(function(e)  // clicking outside closing the popup
    closePopup();
    modal = false;
    $('[data-nitstextbutton]').hide();
  );
  $('[data-nitstextpopup]').click(function(e)  // setting execption areas for closing popup
    e.stopPropagation();
  );
  $("#btnedit").click(function(e)  // setting execption areas for closing popup
    e.stopPropagation();
  );
  $("#editable").click(function(e)  // setting execption areas for closing popup
    e.stopPropagation();
  );
  $(document).keyup(function(e)  // setting esc button close popup
    if (e.keyCode == 27) 
      closePopup();
      modal = false;
      $('[data-nitstextbutton]').hide();
    
  );


);
<body>
  <div contenteditable="true">
    <h3>this is new html document generated by newject extention</h3>
  </div>

  <div id="btnedit" class="clearfix" data-nitstextbutton style="display: none;">
    <a href="#nitstexteditor" class="btn btn-circle btn-sm default">
            Edit <i class="fa fa-pencil"></i>
        </a>
    <a href="#" class="btn btn-icon-only btn-circle default">
      <i class="fa fa-circle-o-notch"></i>
    </a>
  </div>
  <div id="editable" style="top: 50%; left: 50%" data-nitspagelabel="1" data-nitslabeltype="text">
    <h3>This is the content editable where I can change fonts and edit text</h3></div>
  <div id="nitstexteditor" style="display: none;" data-nitstextpopup="0" data-nitseditor="1">
    <div class="portlet box blue">
      <div id="test" class="portlet-title">
        <div class="caption">
          <i class="fa fa-pencil-square-o"></i> Text Editor
        </div>
        <div class="tools">
          <a onclick="closep()" class="remove">
          </a>
        </div>
      </div>
      <div class="portlet-body form">
        <form name="texteditorform" role="form">
          <div class="form-body">
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
                                                <i class="fa fa-magic"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select style">
              </div>
            </div>
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
                                    <i class="fa fa-font"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select font">
              </div>
            </div>
            <div class="form-group">
              <div class="input-group">
                <span class="input-group-addon input-circle-left">
                                    <i class="fa fa-font"></i>
                                </span>
                <input type="text" class="form-control input-circle-right" placeholder="Select Size">
              </div>
            </div>
            <div class="form-group">
              <a class="btn btn-icon-only default" onclick="nitspopupeditor()" data-nitsedittag="bold">
                <i class="fa fa-bold"></i>
              </a>
              <a class="btn btn-icon-only default" data-nitsedittag="italic">
                <i class="fa fa-italic"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default" data-nitsedittag="underline">
                <i class="fa fa-underline"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-justify"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-left"></i>
              </a>
            </div>
            <div class="form-group">
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-align-right"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-undo"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-repeat"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-link"></i>
              </a>
              <a href="javascript:;" class="btn btn-icon-only default">
                <i class="fa fa-chain-broken"></i>
              </a>
            </div>
          </div>
        </form>
      </div>
    </div>
  </div>

</body>
[data-nitstextpopup] 
  display: none;
  background: #e2e2e2;
  padding: 0px;
  float: left;
  font-size: 1.2em;
  position: fixed;
  width: 250px;
  z-index: 99999;

【讨论】:

以上是关于文本编辑器弹出时内容可编辑光标位置在可编辑 div 中的主要内容,如果未能解决你的问题,请参考以下文章

如何获取可编辑div或body里光标的像素位置?

js在opera下怎样获取可编辑div中的鼠标光标和选中文本

区域可编辑contenteditable的问题总结

在可编辑div中定位光标和设置光标

使用键盘时如何在可编辑视图中获取光标的位置?

各位帅哥,jQuery怎么获取可编辑div的光标的位置或者索引? 急急急 。。。。