首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在angularjs光标位置的可内容div中插入div或自定义指令

在angularjs光标位置的可内容div中插入div或自定义指令
EN

Stack Overflow用户
提问于 2014-04-24 13:33:28
回答 2查看 1.7K关注 0票数 0

我必须在我的内容可编辑的div中插入一个自定义指令。

代码语言:javascript
复制
   /*Editor Div*/
      <div id="edBody"  contenteditable="true"></div>
   /*Insert one custom directive*/
   <a ng-click="insertType('fibtext')">Add Directive</a>

我试过这个:

代码语言:javascript
复制
  <input type="button" value="Insert" ng-click="addHtmlAtCaret('<dc-tags></dc-tags>')">
   /* Directive */
    asignmentApp.directive('dcTags', function() {
       return {
          restrict: 'E',
          template: 'new <b> Value </b>'
       };
    });

请帮帮我。小提琴:- http://jsfiddle.net/k2SUJ/1/

这是我试过的小提琴演示

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-25 08:52:39

为了让角知道添加的元素并发挥其魔力,您需要$compile元素并将其链接到作用域。

所以你需要一个带范围的控制器。您还需要将onclick处理程序替换为吴-点击,还需要$compile元素:

在HTML中:

代码语言:javascript
复制
<input type="button" value="..." ng-click="addHtmlAtCaret(...)">

在联合来文中:

代码语言:javascript
复制
app.controller('ctrl', function ($compile, $scope) {
    $scope.addHtmlAtCaret = function (html) {
        document.getElementById('test').focus();
        ...
        var el = document.createElement("div");
        el.innerHTML = html;
        $compile(el)($scope);
        ...
    };
});

看,还有,这个短演示

票数 1
EN

Stack Overflow用户

发布于 2017-11-07 20:45:56

在做粘贴之前,最好保存光标并恢复它。只有在以上按钮的情况下才能工作。但是,如果您使用Popover或Dialog on按钮,并在关闭对话框后,内容可编辑的Div焦点将首先进入AngularJS应用程序。所以,在做上面的工作之前,请也这样做。如下所示,请考虑这是您的内容可编辑Div。在ng-click和ng-keyup上,我只是保存可编辑的DIV的当前光标,当用户打开一个对话框,或者弹出或执行任何操作并调用函数addHtmlAtCaret(html)时,只需将光标重新定位到最后一个输入位置,并按照上面用户gkalpak解释的方式进行。

代码语言:javascript
复制
var saveSelection, restoreSelection;
$scope.commentKeyInput = function(keyEvent,id) {  // (keyEvent.target).innerHTML='';
   		  if (keyEvent.which === 13){
   		    //alert('I am an alert');
   		  }
   		  else{
 		    var divID='comment'+id;   			  
   			savedSelection = saveSelection(document.getElementById(divID));
//   			savedSelection.start++;
//   			console.log(savedSelection.start);
   		  }
   		}   	     
   	  $scope.commentBoxClicked=function(event,id){  
   		  try{
   		    var divID='comment'+id;   			  
   			savedSelection = saveSelection(document.getElementById(divID));  
//   			console.log(savedSelection.start);
   		  }
   		  catch(e){
   			  alert(e);
   		  }  
   	  } 
      
      if (window.getSelection && document.createRange) {
    	    saveSelection = function(containerEl) {
    	        var range = window.getSelection().getRangeAt(0);
    	        var preSelectionRange = range.cloneRange();
    	        preSelectionRange.selectNodeContents(containerEl);
    	        preSelectionRange.setEnd(range.startContainer, range.startOffset);
    	        var start = preSelectionRange.toString().length;

    	        readCounter++;     	        
    	        return {
    	            start: start,
    	            end: start + range.toString().length
    	        }
    	    };

    	    restoreSelection = function(containerEl, savedSel) {
    	        var charIndex = 0, range = document.createRange();
    	        range.setStart(containerEl, 0);
    	        range.collapse(true);
    	        var nodeStack = [containerEl], node, foundStart = false, stop = false;
//            	  console.log('Read Called '+readCounter+ " Node Type ="+node.nodeType);
//            	  readCounter++;    	        	
    	        while (!stop && (node = nodeStack.pop())) {
    	            if (node.nodeType == 3) {
    	                var nextCharIndex = charIndex + node.length;
    	                if (!foundStart && savedSel.start >= charIndex && savedSel.start <= nextCharIndex) {
    	                    range.setStart(node, savedSel.start - charIndex);
    	                    foundStart = true;
    	                }
    	                if (foundStart && savedSel.end >= charIndex && savedSel.end <= nextCharIndex) {
    	                    range.setEnd(node, savedSel.end - charIndex);
    	                    stop = true;
    	                }
    	                charIndex = nextCharIndex;
    	            } else {
    	                var i = node.childNodes.length;
    	                while (i--) {
    	                    nodeStack.push(node.childNodes[i]);
    	                }
    	            }
    	        }

    	        var sel = window.getSelection();
    	        sel.removeAllRanges();
    	        sel.addRange(range);
    	    }
    	} else if (document.selection && document.body.createTextRange) {
    	    saveSelection = function(containerEl) {
    	        var selectedTextRange = document.selection.createRange();
    	        var preSelectionTextRange = document.body.createTextRange();
    	        preSelectionTextRange.moveToElementText(containerEl);
    	        preSelectionTextRange.setEndPoint("EndToStart", selectedTextRange);
    	        var start = preSelectionTextRange.text.length;

    	        return {
    	            start: start,
    	            end: start + selectedTextRange.text.length
    	        }
    	    };

    	    restoreSelection = function(containerEl, savedSel) {
    	        var textRange = document.body.createTextRange();
    	        textRange.moveToElementText(containerEl);
    	        textRange.collapse(true);
    	        textRange.moveEnd("character", savedSel.end);
    	        textRange.moveStart("character", savedSel.start);
    	        textRange.select();
    	    };
    	} 
      
    $scope.addHtmlAtCaret = function (html) {
                if (savedSelection) {
                   restoreSelection(document.getElementById('comment0'), savedSelection);
                }          //document.getElementById('comment0').focus();
        var sel, range;
        if (window.getSelection) {
            // IE9 and non-IE
            sel = window.getSelection();
            if (sel.getRangeAt && sel.rangeCount) {
                range = sel.getRangeAt(0);
                range.deleteContents();
    
                // Range.createContextualFragment() would be useful here but is
                // non-standard and not supported in all browsers (IE9, for one)
                var el = document.createElement("div");
                el.innerHTML = html;
                $compile(el)($scope);
                var frag = document.createDocumentFragment(), node, lastNode;
                while ( (node = el.firstChild) ) {
                    lastNode = frag.appendChild(node);
                }
                range.insertNode(frag);
                
                // Preserve the selection
                if (lastNode) {
                    range = range.cloneRange();
                    range.setStartAfter(lastNode);
                    range.collapse(true);
                    sel.removeAllRanges();
                    sel.addRange(range);
                }
            }
        } else if (document.selection && document.selection.type != "Control") {
            // IE < 9
            document.selection.createRange().pasteHTML(html);
        }
    }      
代码语言:javascript
复制
<div contenteditable   ng-model="commentform.comment name="comment0" id="comment0"  placeholder="Write a comment..." ng-keyup="commentKeyInput($event,0)" ng-click="commentBoxClicked($event,0)" ></div> 

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23270479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档