Javascript综合应用小案例

摘要:
根据需求,我得到了一份带有文字和红色标记的小申请。

按需求弄了一个 取词 以及 标红 的小应用。

Javascript综合应用小案例第1张

先上demo :http://qianduannotes.sinaapp.com/getKeyword/

很多平时常用的东西,都用上了,所以拿出来说说。

一、代码

var GetKeywords = {
	str: "",
	limit: 11,
	keywords:[],

	init : function(){
		var box = this._("article"),
			_this = this;

		//获取已经存在的关键词
		this.getAllKeyWord();

		//让rmKeyWord函数全局化
		window.rmkeyWord = this.rmkeyWord;

		//取词事件
		box.onmouseup = function(evt){
			var evt = evt || window.event,
				target = evt.target || evt.srcElement;

			//如果鼠标是在button上弹起,则忽略
			if(target.id == "btn") return;
			GetKeywords.str = _this.getSelectionText();

			if(_this.str.length == 0) return;
			if(_this._("btn")) {
				_this.removeBtn();
				if(GetKeywords.str == "") return;
				_this.createBtn(evt);
				return;
			}
			_this.createBtn(evt);
		}
	},

	//工具函数
	_: function(obj){
		return document.getElementById(obj);
	},

	//获取选中文本
	getSelectionText: function(){
		if(window.getSelection) {
			return window.getSelection().toString();
		} else if(document.selection && document.selection.createRange) {
			return document.selection.createRange().text;
		}
		return '';
	},

	//创建按钮
	createBtn: function(evt){
		var button = document.createElement("div"),
			evt = evt || window.event,
			x = evt.pageX || evt.x,
			y = evt.pageY || evt.y,
			i, j, len,
			cssList = "",
			_this = this,
			csses = {
				"height" : "30px",
				"line-height" : "30px",
				"position": "absolute",
				"top": y + 10 + "px",
				"left": x + 10 + "px",
				"cursor": "pointer",
				"border": "1px solid #000",
				"background": "#EEE",
				"padding": "2px 8px",
				"border-radius": "3px"
			};
		for(i in csses){
			if(csses.hasOwnProperty(i)){
				cssList += i + ":" + csses[i] + ";";
			}
		}
		button.style.cssText = cssList;
		button.innerHTML = "添加到关键词列表";
		button.setAttribute("id", "btn");

		this._("article").appendChild(button);

		button.onclick = function(){
			if(_this.str.length > _this.limit){
				alert("关键词长度最长为11,可以通过设置GetKeywords.limit来控制长度。");
				_this.removeBtn();
				return;
			}

			for(j = 0, len = GetKeywords.keywords.length; j < len; j++){
				if(GetKeywords.keywords[j] == _this.str){
					alert("已经存在该关键词了~");
					_this.removeBtn();
					return;
				}
				continue;
			}			
			_this.keywords.push(_this.str);
			_this.setRed(_this.str);
			_this.addTo();
			_this.removeBtn();
		};
	},

	//删除按钮
	removeBtn: function(){
		var btn = this._("btn");
		btn.parentNode.removeChild(btn);
	},

	//加入到关键词里列表
	addTo: function(){
		var word = this._("wordList");
		word.innerHTML += "<span><font>" + this.str + "</font><a href='https://tool.4xseo.com/article/302066.html' onclick='rmkeyWord(this);'></a></span>";
	},

	//关键词标红
	setRed: function(str){
		var content = this._("article"),
			temp = '(' + str + ')';
			reg = new RegExp(temp,'g');

		content.innerHTML = content.innerHTML.replace(reg, "<span style='color:red;'>$1</span>");
	},

	//删除标红
	rmRed: function(str){
		var content = this._("article"),
			temp = "(<span[^<]*" + str + "</span>)";
			reg = new RegExp(temp,'gi');
		content.innerHTML = content.innerHTML.replace(reg, str);
	},

	//获取已经存在的关键词(也可以用来获取所有关键词)
	getAllKeyWord: function (){
		var spans = this._("wordList").getElementsByTagName("span"),
			key = [], i = 0, len;
		for(len = spans.length; i < len; i++){
			var font = spans[i].getElementsByTagName("font")[0];
			var temp = font.innerText || font.textContent;
			this.setRed(temp);
			key.push(temp);
		}
		this.keywords = key;
	},

	//删除关键词
	rmkeyWord: function (obj){
		var target = obj.parentNode,
			word = obj.previousSibling.innerHTML,
			i = 0, len;
		GetKeywords.rmRed(word);
		for(len = GetKeywords.keywords.length; i < len; i++){
			if(GetKeywords.keywords[i] == word){
				GetKeywords.keywords.splice(i,i);
			}
			continue;
		}
		target.parentNode.removeChild(target);
		return;
	}
}


GetKeywords.init();

以上是所有js代码,比较长,下面将列举一些比较突出的点(望高人多多指点)。

二、代码分析

1.获取文本

getSelectionText: function(){
    if(window.getSelection) {
        return window.getSelection().toString();
    } else if(document.selection && document.selection.createRange) {
        return document.selection.createRange().text;
    }
    return '';
}

这个在以前(JavaScript操控光标,你会么?)的文章里也说过,就不赘述了。

2.创建控制框

createBtn: function(evt){
    var button = document.createElement("div"),
        //...
        csses = {
            "height" : "30px",
            "line-height" : "30px",
            "position": "absolute",
            "top": y + 10 + "px",
            "left": x + 10 + "px",
            "cursor": "pointer",
            "border": "1px solid #000",
            "background": "#EEE",
            "padding": "2px 8px",
            "border-radius": "3px"
        };
    for(i in csses){
        if(csses.hasOwnProperty(i)){
            cssList += i + ":" + csses[i] + ";";
        }
    }
    button.style.cssText = cssList;
    button.innerHTML = "添加到关键词列表";
    button.setAttribute("id", "btn");
  //...
}

这里有一点我想说说,在写js的时候,会经常涉及到对DOM对象style的处理,如果不想额外加入一个plugins.css之类的文件,可以像上面一样,将样式放置在一个对象中,然后利用for in将其写入,本来开始我用的是

obj.style[i] = csses[i];

不知道为什么,在IE下报错了,后来便用cssText代替。

效果:

添加到列表

3.标红

//关键词标红
setRed: function(str){
    var content = this._("article"),
        temp = '(' + str + ')';
        reg = new RegExp(temp,'g');

    content.innerHTML = content.innerHTML.replace(reg, "<span style='color:red;'>$1</span>");
}

这里主要就是正则表达式的事情了,正则的话,推荐两篇文章

  • 一篇是司徒正美的,讲的比较全面,比较系统。点我链接过去→
  • 一篇是30分钟搞定正则,这个讲说是对所有语言,JS的话正则这一块还不是特别完善和强大。点我链接过去→

哈哈,相信用过正则的人不需要我来解释这个$1了吧,他的意思就是匹配到的第一个。

当然,删除标红和这个原理是差不多的。

//删除标红
rmRed: function(str){
    var content = this._("article"),
        temp = "(<span[^<]*" + str + "</span>)";
        reg = new RegExp(temp,'gi');

    content.innerHTML = content.innerHTML.replace(reg, str);
}

这里是写完这篇blog才发现的一个bug, IE下如果rmRed中的正则是'g',貌似该函数会无效,在IE8控制台下查看,NND,输出innerHTML中的标签全部变成大写了,无奈,只好改成'gi'。

4.获取所有关键词和删除关键词

//获取已经存在的关键词(也可以用来获取所有关键词)
getAllKeyWord: function (){
    //...
},

//删除关键词
rmkeyWord: function (obj){
    //...
    GetKeywords.rmRed(word);
    for(len = GetKeywords.keywords.length; i < len; i++){
        if(GetKeywords.keywords[i] == word){
            GetKeywords.keywords.splice(i,i);
        }
        continue;
    }
    //...
}

这个地方,有一个疑问,在调用的时候,使用this.keywords没反应,但是改成GetKeywords就行了,还没研究具体原因是什么~

5.初始化

GetKeywords.init();

init()为总入口,进去之后,先获取已经存在的关键词,然后标红,接着绑定onmouseup事件。

三、然后

当然咯,这个案例的ajax部分还没写,弄完之后还得给后台送过去。。好吧,明天接着弄吧。

写这玩意儿还是花了点功夫,不过鄙人写代码的水平还在初级阶段,望大神们不要吐槽,多提宝贵意见,谢谢!

然后,还是那个demo,http://qianduannotes.sinaapp.com/getKeyword/

顺便,推广下,团队做的一个网站,主要技术是爬虫,高峰期PV稳定在120W以上,找工作的童鞋可以多去踩踩~

宣讲会查询系统——海投网 

P.S:刚让队友测试,还是发现了不少bug,果然考虑问题还是不全面啊~还要继续加油。。。

免责声明:文章转载自《Javascript综合应用小案例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python之网络编程-多线程js 判断屏幕下拉上滑操作下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

chrome内核浏览器缓存资源找回方法

曾几何时,用chrome浏览器看了某个图片,网页,视频等,当时没保存,后来再怎么找都找不到了,chrome还把缓存加密了,不能像ie那样找回,这世上有买后悔药的吗?还真有! 搜索chromeCacheView即可。 软件是英文的,使用方法自己看单词。提示:可以一键复制出来的。 一个只有65kb的小软件,却能在关键时候帮上你的大忙。 ps,随笔记事,以免遗忘...

常见使用技巧

常见使用技巧 常见SolidWorks使用问答: 问:你想隐藏装配体里头的零件,怎么办?答:右键点击零件或者树状图中的零件名字,然后点眼睛那个图标。更快捷的方式,只需要把鼠标放到那个零件上,按一下Tab,隐藏了。 问:隐藏装配体里头的零件想回复怎么办?答:把鼠标对准隐藏文件的位置,按Shift+tab,零件就回来了。 问:想在装配体树状图中拖动子装配体的位...

Mysql 10053 SocketException 你的主机中的软件中止了一个已建立的连接。

问题:存数据库失败 错误信息: Mysql 1053 SocketException 你的主机中的软件中止了一个已建立的连接。 解决方法:修改数据库最大数据传输量【max_allowed_packet】 1:查询【max_allowed_packet】:show variables like '%max_allowed_packet%';   结果只有10...

如何建立一套简单又高效的研发管理体系

对于一个研发管理体系,其核心是围绕着产品的整个生命周期来进行的。因此,根据一个产品的生命周期,可以把研发体系划分为几个关键的环节,如图所示: 可知,即时沟通和技术提升虽然不属于研发流程中的某一个环节,但它们是贯穿整个研发体系不可或缺的一部分,有着不可替代的作用。此外,任务管理需要对任务做整个研发生命周期的管理,除了作为其中的一个关键环节,也是贯穿整个研发...

友盟+UAPM应用性能报告:Android崩溃率达0.32%,OPPO 、华为、VIVO 崩溃表现良好

​随着信息技术高速发展,移动互联几乎已成为了一种生活方式的代名词,在全民上网的数字热潮中,如何能最大程度保障产品服务的稳定性,提供良好的用户体验,是当前企业都需要思考和亟待解决的问题。App的应用性能稳定是良好用户体验中非常关键的一环,而现实情况却是应用崩溃、卡顿、加载缓慢、页面白屏等问题,频频出现在用户的真实体验之中,成为影响业务表现的直接杀手。为此,应...

MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本

介绍MongoDB支持的一些高级功能: 数据库命令 固定大小的集合 GridFS存储大文件 MongoDB对服务端JavaScript的支持 数据库命令 命令的原理 MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd集合来执行。runCommand仅仅是接受命令文档,执行等价查询。 >db.runCommand({"dr...