[技术博客]WEB实现划词右键操作
[技术博客]WEB实现划词右键操作
一、功能解释
简单地对题目中描述的功能进行解释:在浏览器中,通过拖动鼠标选中一个词(或一段文字),右键弹出菜单,且菜单为自定义菜单,而非浏览器本身的菜单。类似的功能有:网页版百度文库中的鼠标选中复制。
二、功能拆解
上述功能较为复杂,便于理解与实现,可以拆分为以下几部分:
- 获取鼠标划词的内容
- 实现自定义右键菜单(并为自定义右键菜单中的每个选项绑定合适的行为)
- 划词与右键菜单的绑定
三、技术实现
(一)获取鼠标划词的内容
简单地搜索之后,了解到这一功能可以通过JavaScript中的Selection来实现。
Selection是对当前激活选中区(即高亮文本)进行操作。在非IE浏览器(Firefox、Safari、Chrome、Opera)下可以使用window.getSelection()获得selection对象range是一个fragment,可以理解成一个或多个range组成了一个selection(使用Ctrl键可以进行多选高亮区域),但由于兼容性较差(IE, Chrome均不支持),很少有人使用。- 对于获取到的
selection对象,可以通过一些JS方法转化为可以处理的对象,常用的方法是通过toString()获得一份selection对象的字符串copy,进行其他操作。 - 其他的高级用法暂时没有用到,有兴趣的话可以查看官方API或这篇博客。
- 在我们的项目中,需要将选中的区域显示在HTML页面中,还要传给后端,概括来说,操作如下:
var rg = window.getSelection(); //获取鼠标选中的区域
document.getElementById("some_html_element").innerText=rg.toString();//将该区域以字符串的形式显示在某个html元素中
$.ajax({//采用ajax提交内容
//其他内容略去
data:JSON.stringify({
"action":"some_action",
"data":{
"name":rg.toString();
}
})
})
当然也不是像上面展示的那么直白,显示在HTML中与传给后端有不同的Trigger。
(二)实现自定义右键菜单
- 关于自定义右键菜单,JQuery给出了非常实用的API——
contextmenu。几乎所有的HTML自定义菜单都是用它来实现的。
下面是JQuery官方API的一个小例子,效果是右键点击p区域的HTML元素,就会出现Hello World!的弹窗。
$("p").contextmenu(function(){
alert("Hello World!");
});
实际上,在contextmenu中,有很多可选的参数,下面以项目中的例子来进行简单介绍。
$.contextMenu({
selector: '.context-menu-one',
// callback: function(key, options) {
// var m = "clicked: " + key + "\n" + rg.toString();
// console.log(m);
// },
items: {
"relation":{
name: "添加关系:",
disabled: true},
"entity1": {
name: "作为实体1",
callback: function(key, options){
document.getElementById("div2").innerText=rg.toString();
e1 = rg.toString();
}},
"entity2": {
name: "作为实体2",
callback: function(key, options){
document.getElementById("div4").innerText=rg.toString();
e2 = rg.toString();
}},
"sep1": "---------",
"添加实体": {
name: "添加实体",
callback: function(key, options){
e = rg.toString();
sendEntityBeta();
location.reload();
}
}
}
});
selector指定了应用自定义右键菜单的区域,效果与官方demo中的$("p")相同。值得注意的是,selection必须是一个HTML元素(在页面中实际存在的某一区域),而不是某个JS对象。自定义菜单将作用于整个HTML元素中,替换浏览器原有的右键菜单。callback是该菜单的总回调函数,当选中菜单中的某个选项时,如果该选项没有额外定义回调函数callback,那么将调用总回调函数。items定义了菜单中的各个选项。每个item的基本结构为"item":{},大括号中是该item的描述信息,包括name,disabled等,以及刚刚提到的callback可以每个选项绑定合适的行为。其中值得一提的是,如果令disabled: true,将会禁用该选项,在菜单中,该项显示为灰色且无法点击,可以用此方法来在菜单内设置一些提示信息。- 除此之外,
items也可以进行嵌套,实现子菜单的功能。(禁止套娃)
除上述参数外,还有许多高级的功能,在官方Plugin中,还有很多一看就懂的有启发性的demo。
(三)划词与右键菜单的绑定
- 在熟悉了
selection与contextmenu的使用后,上面这个问题也就迎刃而解了,只需要将contextmenu中的selector设置在需要getSelection()的区域即可。 - 当然要是不了解上面两个工具的话,还是会踩到很多坑的。比如
selection的兼容性问题、contextmenu只能作用在HTML元素上等等。
四、总结
- 没做过是真的不知道,前端没那么好做T_T
[技术博客]WEB实现划词右键操作的更多相关文章
- 【技术博客】MySQL和Django常用操作
MySQL和Django是搭建网站常用的配置之一,在此记录一下在Windows系统搭建网站时MySQL以及Django常用的操作. MySQL MySQL的SQL语句不区分大小写,推荐将保留字大写,数 ...
- 【软工】[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE
[技术博客] 用Monaco Editor打造接近vscode体验的浏览器IDE 官方文档与重要参考资料 官方demo 官方API调用样例 Playground 官方API Doc,但其搜索框不支持模 ...
- 各大IT公司 技术博客汇总
来自:http://www.cnblogs.com/IT-Bear/p/3191423.html 腾讯系列(13) 阿里系列(18) 百度系列(3) 搜狐系列(3) 新浪系列(2) 360系 ...
- 在Ubuntu14.04上安装WordPress4搭建技术博客
1.安装LAMP环境 1.1 安装Apache2 1.2 安装MySQL5 1.3 安装PHP5 1.4 安装phpMyAdmin 2.初始化数据库 3.下载并配置WordPress 4.配置Apac ...
- 技术人如何利用 github+Jekyll ,搭建一个独立免费的技术博客
上次有人留言说,技术博客是程序员的标配,但据我所知绝大部分技术同学到现在仍然没有自己的技术博客.原因有很多,有的是懒的写,有的是怕写不好,还有的是一直想憋个大招,幻想做到完美再发出来,结果一直胎死腹中 ...
- 【转】【技术博客】Spark性能优化指南——高级篇
http://mp.weixin.qq.com/s?__biz=MjM5NjQ5MTI5OA==&mid=2651745207&idx=1&sn=3d70d59cede236e ...
- [转]有哪些值得关注的技术博客(Java篇)
有哪些值得关注的技术博客(Java篇) 大部分程序员在自学的道路上不知道走了多少坑,这个视频那个网站搞得自己晕头转向.对我个人来说我平常在学习的过程中喜欢看一些教程式的博客.这些博客的特点: 1. ...
- 最值得收藏的java技术博客(Java篇)
第一个:java_my_life 作者介绍:找不到原作者信息.大概做了翻阅全部是2012年的博客. 博客主要内容:主要内容是关于Java设计模式的一些讲解和学习笔记,在相信对学习设计模式的同学帮助很大 ...
- 一文搞定scrapy爬取众多知名技术博客文章保存到本地数据库,包含:cnblog、csdn、51cto、itpub、jobbole、oschina等
本文旨在通过爬取一系列博客网站技术文章的实践,介绍一下scrapy这个python语言中强大的整站爬虫框架的使用.各位童鞋可不要用来干坏事哦,这些技术博客平台也是为了让我们大家更方便的交流.学习.提高 ...
随机推荐
- 《Go语言圣经》阅读笔记:第三章基础数据类型
第三章 基础数据类型 Go语言将数据类型分为四类: 基础类型 数字 整数 浮点数 复数 字符串 布尔 复合类型 数据 结构体 引用类型 指针 切片 字典 函数 通道 接口类型 在此章节中先介绍基础类型 ...
- weblogic漏洞初探之CVE-2015-4852
weblogic漏洞初探之CVE-2015-4852 一.环境搭建 1. 搭建docker 这里用了vulhub的环境进行修改:https://vulhub.org/ 新建个文件夹,创建两个文件doc ...
- linux下分卷压缩,合并解压的3种方法
我们上传东西的时候,由于文件过大而不能上传,或者不给上传,最明显的就是发邮件了,附件最大5M,有的10M.如果超过了就郁闷了.这个时候,如果能把压缩的东西,分割开来就比较爽了,windows下面我想大 ...
- 什么是maven与maven的使用过程(例如在idea创建maven工程(重点讲讲idea创建使用maven管理的web工程,并且部署到tomcat上))
什么是maven与maven的使用过程(例如在idea创建maven工程) (重点讲讲idea创建使用maven管理的web工程项目,并且部署到tomcat服务器上) 一.什么是maven? 1, M ...
- 【PHP】随机生成名字
public function test(){ $a = "赵 钱 孙 李 周 吴 郑 王 冯 陈 楮 卫 蒋 沈 韩 杨 朱 秦 尤 许 何 吕 施 张 孔 曹 严 华 金 魏 陶 姜 戚 ...
- jenkins自动构建前端项目(window,vue)
我们把一个多人协作的vue前端项目发布服务器,一般要经过以下步骤: git更新最新的代码 构建项目 把构建后的代码上传到服务器 如果用jenkins来构建的话,只需要点击一次构建按钮,就可以自动完成以 ...
- (一)es 概述与安装
一.基本概念介绍 1. es 核心术语 核心概念 ES -> 数据库 索引index -> 表 文档 document -> 行(记录) 字段 fields -> 列 早期版本 ...
- ~/.emacs emacs 配置文件
windows ~/.emacs (when (>= emacs-major-version 24) (require 'package) (add-to-list 'package-archi ...
- ios web 媒体查询兼容
原文:https://blog.csdn.net/dear_zx/article/details/82785250 防止链接丢失,复制一下 兼容iphone4/4s: @media (device-h ...
- 『Python』matplotlib的imshow用法
热力图是一种数据的图形化表示,具体而言,就是将二维数组中的元素用颜色表示.热力图之所以非常有用,是因为它能够从整体视角上展示数据,更确切的说是数值型数据. 使用imshow()函数可以非常容易地制作热 ...