html鼠标选择文字颜色,js实现鼠标选中文本改变选中区域颜色以及给选中区域加上html标签...

使用JavaScript实现HTML文本选择颜色和添加标签功能
这篇博客展示了如何使用JavaScript监听鼠标松开事件,获取选中文本,并改变选中区域的颜色。通过分析选中范围,将选中文本前后的内容与中间选中的部分分离,再结合HTML标签进行处理,实现对选中文本的高亮和添加HTML标记。文中提供两个示例代码段,分别处理单个和多个子节点的情况。

这个demo是看了dialog flow 的intent模块下面的Training phrases 得到的心得,实现的一个简单的选中区域实现的效果,不过这里就没写选中之后会弹出数据了。直接上demo:

第一个:

Field selection demo

#trainPhase {

border: 1px solid #ddd;

padding: 10px;

}

div test body. Please input content.

(function() {

$('#trainPhase').on('mouseup', function(event) {

var selection_text = window.getSelection().toString();

if(selection_text) {

var childNodes = $(event.currentTarget)[0].childNodes;

var range = window.getSelection().getRangeAt(0);

var startOffset = range.startOffset;

var endOffset = range.endOffset;

if (childNodes.length == 1){

var nodeText = childNodes[0].textContent.trim();

var prefix = nodeText.substring(0, startOffset);

var middle = '' + nodeText.substring(startOffset, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

$(event.currentTarget)[0].innerHTML = prefix + middle + suffix;

}

if (childNodes.length > 1){

if(range.startContainer == range.endContainer){

for(var idx in childNodes){

if (childNodes[idx] == range.startContainer ||

childNodes[idx] == range.startContainer.parentNode){

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, startOffset);

var middle = '' + nodeText.substring(startOffset, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

$(childNodes[idx]).replaceWith( prefix + middle + suffix);

}

}

}else{

//多个span合并

var isStart = false;

var repalce_span = ""

for(var idx in childNodes){

if (childNodes[idx] == range.startContainer || childNodes[idx] == range.startContainer.parentNode){

isStart = true;

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, startOffset);

var suffix = '' + nodeText.substring(startOffset, nodeText.length);

repalce_span = prefix + suffix;

childNodes[idx].replaceWith("")

}else if(childNodes[idx] == range.endContainer ||

childNodes[idx] == range.endContainer.parentNode){

isStart = false;

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

repalce_span += prefix + suffix

$(childNodes[idx]).replaceWith(repalce_span);

break;

}else{

if(isStart){

repalce_span += childNodes[idx].textContent

childNodes[idx].replaceWith("")

}

}

}

}

}

}

});

}());

第二个:

Field selection demo

#trainPhase {

border: 1px solid #ddd;

padding: 10px;

}

div test body. Please input content.

replace selection

(function() {

var $elem;

$('#trainPhase').focus(function(){

$elem = $(this);

});

// $('#get').on('click', function() {

// alert($elem.fieldSelection().text);

// window.console && console.log($elem.fieldSelection());

// });

$('#replace').on('click', function() {

var selection_text = window.getSelection().toString();

var childNodes = document.getElementById("trainPhase").childNodes;

var range = window.getSelection().getRangeAt(0);

var startOffset = range.startOffset;

var endOffset = range.endOffset;

if (childNodes.length == 1){

var nodeText = childNodes[0].textContent.trim();

var prefix = nodeText.substring(0, startOffset);

var middle = '' + nodeText.substring(startOffset, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

document.getElementById("trainPhase").innerHTML = prefix + middle + suffix;

}

if (childNodes.length > 1){

if(range.startContainer == range.endContainer){

for(var idx in childNodes){

if (childNodes[idx] == range.startContainer ||

childNodes[idx] == range.startContainer.parentNode){

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, startOffset);

var middle = '' + nodeText.substring(startOffset, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

$(childNodes[idx]).replaceWith( prefix + middle + suffix);

}

}

}else{

//多个span合并

var isStart = false;

var repalce_span = ""

for(var idx in childNodes){

if (childNodes[idx] == range.startContainer || childNodes[idx] == range.startContainer.parentNode){

isStart = true;

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, startOffset);

var suffix = '' + nodeText.substring(startOffset, nodeText.length);

repalce_span = prefix + suffix;

childNodes[idx].replaceWith("")

}else if(childNodes[idx] == range.endContainer ||

childNodes[idx] == range.endContainer.parentNode){

isStart = false;

var nodeText = childNodes[idx].textContent;

var prefix = nodeText.substring(0, endOffset) + "";

var suffix = nodeText.substring(endOffset, nodeText.length);

repalce_span += prefix + suffix

$(childNodes[idx]).replaceWith(repalce_span);

break;

}else{

if(isStart){

repalce_span += childNodes[idx].textContent

childNodes[idx].replaceWith("")

}

}

}

}

}

});

}());

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值