js-处理div设置的编辑框处理焦点定位追加内容

本文介绍如何在DIV元素中启用编辑模式,并详细讲解了获取和设置光标位置的方法。通过实例演示了如何在光标位置插入HTML内容。

 

具体实现方法如下:

首先要让DIV启用编辑模式

<div contenteditable=true id="divTest"></div>

通过设定contenteditable=true开启div的编辑模式.这样DIV就可以跟文本框一样输入内容了。
不扯话题了。下面说怎么获取或设置光标位置.

2个步骤:

① 获取DIV中的光标位置
② 改变光标位置

var cursor = 0; // 光标位置  

document.onselectionchange = function () {

var range = document.selection.createRange();

var srcele = range.parentElement();//获取到当前元素

var copy = document.body.createTextRange();

copy.moveToElementText(srcele);

for (cursor = 0; copy.compareEndPoints("StartToStart", range) < 0; cursor++) {

 copy.moveStart("character", 1);//改变光标位置,实际上我们是在记录cursor的数量.

}

}

给document绑定光标变化事件。用来记录光标位置.
这样就可以拿到DIV的光标位置了.

function moveEnd(obj) {

lyTXT1.focus();

var r = document.selection.createRange();

//因为这里死从当前光标开始移动的(好像文本框的是从0算起.)所以我们需要拿到当前光标位置,然后就可以计算出要移动多少位了,这样就可以把光标移动到想要的位置了

r.moveStart('character', lyTXT1.innerText.length - cursor);

r.collapse(true);

r.select();

}

给document绑定光标变化事件。用来记录光标位置.
这样就可以拿到DIV的光标位置了.

function moveEnd(obj) {
lyTXT1.focus();
var r = document.selection.createRange();
//因为这里死从当前光标开始移动的(好像文本框的是从0算起.)所以我们需要拿到当前光标位置,然后就可以计算出要移动多少位了,这样就可以把光标移动到想要的位置了
r.moveStart('character', lyTXT1.innerText.length - cursor);
r.collapse(true);
r.select();
}

通过上面的我们就可以将DIV中的光标移动到最后面了
一个完整的实例

<button type="button" onclick="document.getElementById('test').focus(); insertHtmlAtCaret('<b>INSERTED</b>');">插入字符</button>

<div contentEditable="true" style="height:50px; border:2px solid red;" id="test"> </div>

 

function insertHtmlAtCaret(html) {

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;

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);

}

}

 

转载于:https://www.cnblogs.com/hwaggLee/p/4728073.html

任务描述 本关任务:掌握jQuery基本表单事件方法,实现如下效果。 相关知识 为了完成本关任务,你需要掌握: focus()blur()事件方法; change()事件方法; select()事件方法; submit()事件方法。 focus事件blur事件 当元素获得焦点时(当通过鼠标点击选中元素或通过 tab 键定位到元素时),触发 focus 事件。 当元素失去焦点时发生 blur 事件。 基本语法: $(selector).focus(function(){ ...... }) $(selector).blur(function(){ ...... }) 说明:selector表示要操作的dom元素 示例:当鼠标获取焦点时,在输入框后显示“获取到焦点”,当鼠标失去焦点时,弹框说明失去焦点,并将文字隐藏。 <input type="text" /> <span style="display:none">获取到焦点</span> $("input").focus(function() { $("span").css("display","inline"); }) $("input").blur(function() { alert("失去焦点"); $("span").css("display","none"); }) 效果图如下: change事件 当输入框的值改变的时候失去焦点触发change事件。 基本语法: $(selector).change(function(){ ...... }) 示例:在输入框中改变数据后弹出数据被改变的提示框。 <input type="text"/> $("input").change(function(){ alert("改变了数据"); }); 效果图如下: select事件 当 textarea 或文本类型的 input 元素中的文本被选择(标记)时,会发生 select 事件。 基本语法: $(selector).select(function(){ ...... }) 示例:选中输入框中的文本弹出提示框“文本已选中!”。 <input type="text" value="www.educoder.net"> $("input").select(function(){ alert("文本已选中!"); }); 效果图如下: submit事件 当提交表单时,会发生 submit 事件。submit() 方法触发 submit 事件,或规定当发生 submit 事件时运行的函数。 该事件只适用于 <form> 元素。 基本语法: $(selector).submit(function(){ ...... }) 示例:提交表单时弹出提示框,并将提交内容显示在url中。 <form action=""> <input type="text" name="Name"> <input type="submit" value="提交"> </form> $("form").submit(function(){ alert("提交"); }); 效果图如下: 编程要求 根据提示,在右侧编辑器中补充代码,jquery已经引入,平台会对你的代码进行检测,要求如下: 获取第一个输入框时,输入框的背景颜色变成yellow色,当失去焦点时,输入框的背景颜色为green; 选中下拉框的显示项时,将有红色背景色的div(已提供在任务文件中)显示出来,选中不显示时,将其隐藏。(默认div为隐藏); 当选中第二个输入框中的文本时,在输入框后面追加“Text select!”文本。 提示:相应的操作对象已经为你提供了class属性名id属性名。 注意:为了方便评测,这里统一用双引号 "" 来包含字符串或属性。 最终实现效果如下: 测试说明 平台会对你的代码进行运行测试,如果实际输出结果与预期结果相同,则通关。 开始你的任务吧,祝你成功!
最新发布
10-20
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值