`

DIV可编辑模式在光标位置插入内容

    博客分类:
  • web
 
阅读更多

当我们做一个聊天对话框时,可能想要支持图片发送或表情,而且我们希望表情和图片都以图片方式呈现在输入框内,这时,textarea就不管用了,因为它只支持纯文本。

我们可以利用div的contentEditable="true"属性设置,使DIV可编辑,这样,div中就可以追加图片。

我们插入表情时,需要先点击输入框上方或下方给的一个表情按钮,从而弹出一个浮动层,里面是各种表情,点击表情,即可将表情放到DIV中光标所在位置。

但有一个问题是:如果发送表情,是可能需要将表情插入到文本中间,而非文本末尾。而当我们点击表情按钮时,会导致DIV失去焦点,从而导致表情只能追加到文本末尾。

别担心,这个问题也可以解决,我们给表情按钮以及弹出的表情列表层最外层元素都增加两个HTML属性即可。

属性是:unselectable="on" onmousedown="return false;"

 然后再来的问题就是,如何能将选择到的元素插入到可编辑div中的光标位置呢?我在百度上搜索,找到了解决办法:

 

function insertAtCursor(dom, html) {
	if (dom != document.activeElement) { // 如果dom没有获取到焦点,追加
		dom.innerHTML = dom.innerHTML + html;
		return;
	}
	var sel, range;
	if (window.getSelection) {
		// IE9 或 非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;
			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);
	}
}

 

另外再给一份针对texterea中在光标位置插入Text内容的代码:

function insertValueAtCursor(myField, insertContent) 
{
    if (myField != document.activeElement) {
        myField.value = myField.value + insertContent;
        return;
    }
    //IE support
    if (document.selection) 
    {
        myField.focus();
        var sel     = document.selection.createRange();
        sel.text    = insertContent;
        sel.select();
    }
    //MOZILLA/NETSCAPE support
    else if (typeof myField.selectionStart === 'number' || typeof myField.selectionEnd == 'number') 
    {
        var startPos    = myField.selectionStart;
        var endPos      = myField.selectionEnd;
        console.log("startPos:" + startPos)
        // save scrollTop before insert
        var restoreTop    = myField.scrollTop;
        myField.value    = myField.value.substring(0, startPos) + insertContent + myField.value.substring(endPos, myField.value.length);
        if (restoreTop > 0)
        {
            // restore previous scrollTop
            myField.scrollTop = restoreTop;
        }
        myField.focus();
        myField.selectionStart  = startPos + insertContent.length;
        myField.selectionEnd    = startPos + insertContent.length;
    } else {
    	console.log('OK')
        myField.value += insertContent;
        myField.focus();
    }
}

 

最后我有一个例子,在附件中,下载下来,打开index.html或editor.html都能看到效果。

 

值得注意的是,上述代码只针对IE9以上版本以及chrome,firefox等支持HTML5的浏览器有效,IE8中做不到在光标位置插入图片。

如果要兼容IE8.0我找到了解决办法,就是不止是在父元素有这个属性就行,还需要在鼠标点击的那个元素加上这两个属性就OK。我把附件替换了,大家可以参考。

分享到:
评论

相关推荐

    vue项目中在可编辑div光标位置插入内容的实现代码

    vue项目中在可编辑div光标位置插入内容 html: &lt;div class=mouse-move dragstart=dragStart($event, draggable='true' v-for=(item, key=index click=dropRelease($event,&gt; {{item.labelName}} &lt;/div&gt; &lt;div ...

    JS在可编辑的div中的光标位置插入内容的方法

    主要介绍了JS在可编辑的div中的光标位置插入内容的方法,分别用js与jQuery两种方式加以实现,是非常实用的特效技巧,需要的朋友可以参考下

    在可编辑div中插入文字或图片解决思路与实现步骤

    最近在网上碰到一个人问了我一个问题,在可...要使div可编辑 必须 加入 contentEditable="true" 这个属性。 然后就是获取光标位置(或者选择文字位置)进行文字或者html的插入 。 由于火狐等标准浏览器支持getSelectio

    excel的使用

    解决办法是:在C行后插入一个空列(如果D列没有内容,就直接在D列操作),在D1中输入“=B1&C1;”,D1列的内容就是B、C两列的和了。选中D1单元格,用鼠标指向单元格右下角的小方块“■”,当光标变成"+"后,按住...

    dreamweaver的各种组件

    FloatingFrames 插入一任意位置的Frame, 就像开窗一般(IE better) Commands 名称 简介 Replicator 使用这个Command 可以复制任何您选种的HTML组件,并可以设定要在 复制的组件中所插入的分割符。 Window ...

    xheditor v1.0.0 rc2 build 100401

    添加:切换到源代码,可视化编辑页面的光标对应源代码相应位置的定位功能 添加:扩展jQuery的标准val函数,使之能够直接读取和设置编辑器的最新值 添加:为方便外部应用的扩展,特将编辑器内部的window和document...

    《程序天下:JavaScript实例自学手册》光盘源码

    9.33 双击单元格变为可编辑 9.34 鼠标经过表格时列变色 9.35 鼠标选择表格中的多行 9.36 使用JavaScript向表格中写入数据 9.37 类C# GridView的编辑效果(一) 9.38 类C# GridView的编辑效果(二) 第10章 单选框和...

    程序天下:JavaScript实例自学手册

    9.33 双击单元格变为可编辑 9.34 鼠标经过表格时列变色 9.35 鼠标选择表格中的多行 9.36 使用JavaScript向表格中写入数据 9.37 类C# GridView的编辑效果(一) 9.38 类C# GridView的编辑效果(二) 第10章 单选框和...

    易语言程序免安装版下载

    修改高级表格支持库,解决插入行/插入列在未指定行号/列号的情况下插入位置不正确的BUG。 7. 修改文本语音转换支持库,增加“机读文本.重新创建并初始化()”方法。 8. 修改应用接口支持库,增强“取快捷方式目标...

    delphi 开发经验技巧宝典源码

    0125 如何在指定的位置显示信息框 82 0126 使用ShowException函数显示一个异常信息 82 4.7 异常处理函数 83 0127 将错误编号转换为错误信息字符串 83 0128 使用ExceptAddr函数获得异常被抛出的地址 83 ...

    delphi 开发经验技巧宝典源码06

    0125 如何在指定的位置显示信息框 82 0126 使用ShowException函数显示一个异常信息 82 4.7 异常处理函数 83 0127 将错误编号转换为错误信息字符串 83 0128 使用ExceptAddr函数获得异常被抛出的地址 83 ...

    js使用小技巧

    可编辑 obj.contenteditable=true 执行菜单命令 obj.execCommand 双字节字符 /[^x00-xff]/ 汉字 /[u4e00-u9fa5]/ 让英文字符串超出表格宽度自动换行 word-wrap: break-word; word-break: break-all; ...

Global site tag (gtag.js) - Google Analytics