我必须在我的内容可编辑的div中插入一个自定义指令。
/*Editor Div*/
<div id="edBody" contenteditable="true"></div>
/*Insert one custom directive*/
<a ng-click="insertType('fibtext')">Add Directive</a>我试过这个:
<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/
这是我试过的小提琴演示。
发布于 2014-04-25 08:52:39
为了让角知道添加的元素并发挥其魔力,您需要$compile元素并将其链接到作用域。
所以你需要一个带范围的控制器。您还需要将onclick处理程序替换为吴-点击,还需要$compile元素:
在HTML中:
<input type="button" value="..." ng-click="addHtmlAtCaret(...)">在联合来文中:
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);
...
};
});看,还有,这个短演示。
发布于 2017-11-07 20:45:56
在做粘贴之前,最好保存光标并恢复它。只有在以上按钮的情况下才能工作。但是,如果您使用Popover或Dialog on按钮,并在关闭对话框后,内容可编辑的Div焦点将首先进入AngularJS应用程序。所以,在做上面的工作之前,请也这样做。如下所示,请考虑这是您的内容可编辑Div。在ng-click和ng-keyup上,我只是保存可编辑的DIV的当前光标,当用户打开一个对话框,或者弹出或执行任何操作并调用函数addHtmlAtCaret(html)时,只需将光标重新定位到最后一个输入位置,并按照上面用户gkalpak解释的方式进行。
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);
}
} <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>
https://stackoverflow.com/questions/23270479
复制相似问题