Javascript 插入节点后如何提升DOM范围?
我插入一个节点,当插入另一个节点时,它将替换先前插入的节点 我想我需要把范围放在第一个插入的节点之后,但是怎么做呢 我定义了一个函数:Javascript 插入节点后如何提升DOM范围?,javascript,dom,Javascript,Dom,我插入一个节点,当插入另一个节点时,它将替换先前插入的节点 我想我需要把范围放在第一个插入的节点之后,但是怎么做呢 我定义了一个函数: function EmoticonsMenu(jquery_element){ var e = jquery_element; var top = e.offset().top; var left = e.offset().left; var onIconClick_callback; this.onIconClick = functio
function EmoticonsMenu(jquery_element){
var e = jquery_element;
var top = e.offset().top;
var left = e.offset().left;
var onIconClick_callback;
this.onIconClick = function(eventObject){
var html = $(eventObject.target).parent().html().replace(/\n\s+|\s+\n/g, '');
onIconClick_callback(html);
};
e.blur(function(){
e.css({visibility:'hidden'});
e.hide();
});
this.attach_to = function(element, callback){
onIconClick_callback = callback;
var newTop = element.offset().top - top - 10 - e.height();
var newLeft = element.offset().left - left + 10;
e.css({top:newTop, left:newLeft});
e.css({visibility:'visible'});
e.focus();
};
};
还有一个地方,我可以将表情符号绑定到我的nicEditor自定义按钮上
nicEditorExampleButton = nicEditorButton.extend({
mouseClick : function(eventObject) {
// get nicEdit selected instance - se
var se = this.ne.selectedInstance;
var paste_icon_html = function(html){
// create a DOM node from the string
//var html = '<img src="/assets/emoticons/ac.gif">admin is here!</img>';
var div = document.createElement('div');
div.innerHTML = html;
var node = div.childNodes[0];
// get selection if any, insert html as a Node
var range = se.getRng();
range.deleteContents();
range.insertNode(node.cloneNode(true));
//range.setStart(node,0);
//range.setEnd(node,0);
};
emoticonsMenu.attach_to($(this.button), paste_icon_html);
}
});
nicEditors.registerPlugin(nicPlugin,nicExampleOptions);
nicEditorExampleButton=nicEditorButton.extend({
鼠标单击:函数(eventObject){
//获取所选实例-se
var se=此.ne.selectedInstance;
var paste_icon_html=函数(html){
//从字符串创建DOM节点
//var html='管理员在这里!';
var div=document.createElement('div');
div.innerHTML=html;
var node=div.childNodes[0];
//获取所选内容(如果有),将html作为节点插入
var range=se.getRng();
range.deleteContents();
range.insertNode(node.cloneNode(true));
//range.setStart(节点,0);
//range.setEnd(节点,0);
};
表情菜单。附加到($(此.按钮),粘贴图标\u html);
}
});
registerPlugin(nicPlugin,nicExampleOptions);
如果不想替换任何内容,请删除对的调用
此外,您可能会遇到这样的问题:在重复调用此代码段时,您总是引用相同的节点[0]
,并且它只能存在一次-要将其插入多次,您需要:
下面是需要更改的代码。而不是:
range.insertNode(node.cloneNode(true));
//range.setStart(node,0);
//range.setEnd(node,0);
};
应该是
range.insertNode(node);
range.setEndAfter(node); //++
range.setStartAfter(node); //++
};
se.getRng()
有什么作用?但是我需要替换任何选择,并使用range获取选择我克隆节点range.insertNode(节点[0].cloneNode(true))代码>但仍在被覆盖。被什么覆盖?请发布您的整个脚本,或链接一个简短的演示(例如在),它被第二个choosen图标覆盖。我已经发布了整个脚本。也许我必须使用range.setStart、setEnd方法?嗯,不,您不应该在这里使用clone
,因为
节点在这里是唯一的。你所说的“第二选择”是什么意思?你能告诉我你是如何调用这个函数的吗?
range.insertNode(node);
range.setEndAfter(node); //++
range.setStartAfter(node); //++
};