正则表达式的先行断言(lookahead)和后行断言(lookbehind)
作者:admin 日期:2019-07-01
正则表达式的先行断言和后行断言一共有4种形式:
(?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion)
(?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion)
(?<=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion)
(?<!pattern) 零宽负向后行断言(zero-width negative lookbehind assertion)
这里面的pattern是一个正则表达式。
JS跳转隐藏来路referrer
作者:admin 日期:2015-10-07
有时候跳转过去不希望别人知道来路,可以用下面这段js实现。
function open_without_referrer(link){
document.body.appendChild(document.createElement("iframe')).src='javascript:"<script>top.location.replace(\''+link+'\')<\/script>"';
}
原理就是创建了一个新的iframe,在src处设置了一个javascript:xxx来执行一段js,执行的内容就是top.location.replace。
sublime系统命令 快捷键设置
作者:admin 日期:2015-09-09
Sublime的构建系统
作者:admin 日期:2015-09-07
sublime是一个非常好用的web开发工具,在我们之前的文章中也有提到过。大家可以参考一下。
sublime的下载: http://chaojiahuo.cn/
sass安装
作者:admin 日期:2015-08-28
JS正则表达式进取URL中的域名
作者:admin 日期:2015-08-26
这个事件比较简单,就直接上代码了。
var urls = [
"http://www.zeroplace.cn",
"http://www.zeroplace.cn/",
"http://www.zeroplace.cn/article.asp?id=957",
"https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=2&tn=baiduhome_pg&wd=web%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91&rsv_spt=1&oq=JSON.stringify&rsv_pq=8ba7307400013580&rsv_t=2a02dSXqxXonLrYdUkp9FjCY4PxpOu1kBVqJCbNQxR2jooK1SQEde%2F0yBXLnXmXonlps&rsv_enter=1&rsv_sug3=13&rsv_sug1=11&bs=JSON.stringify"
];
var pattern = /^(http|https):\/\/([^\/]*)(?:$|\/.*$)/
urls.forEach(function(url){
var match = url.match(pattern);
console.log([match[1], match[2]]);
});
match[2]就是最后的域名,只能匹配http或https的schema。
Sublime Text 3 Package Control安装
作者:admin 日期:2015-08-24
Sublime的包管理器可以方便我们安装其它的插件,所以基本上安装好Sublime之后的第一件事就是安装包管理器( Package Control)。其实这个包管理器它自己就是一个插件。
首先是按Ctrl+`调出控制台,然后输入以下命令即可,Sublime2和Sublime3有些不同。
Sublime2
import urllib2,os; pf='Package Control.sublime-package'; ipp = sublime.installed_packages_path(); os.makedirs( ipp ) if not os.path.exists(ipp) else None; urllib2.install_opener( urllib2.build_opener( urllib2.ProxyHandler( ))); open( os.path.join( ipp, pf), 'wb' ).write( urllib2.urlopen( 'http://sublime.wbond.net/' +pf.replace( ' ','%20' )).read()); print( 'Please restart Sublime Text to finish installation')
Sublime3
import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())
Tags: sublime
用sublime 编写Markdown
作者:admin 日期:2015-03-04
最近在做一些开发,需要写一些文档,发现markdown的语法相当的清晰易读,编写方便还可以编译成html,所以就用它了。
markdown的宗旨是易读和易写,github也支持markdown
其实markdown用纯文本编辑器就可以编写,但出于效率的考虑,我还是想找一个好用一些的工具。因为我比较常用sublime,所以就先看看它可不可以满足我的需求。网上找了一下,确实是可以的。
插件:
Markdown Build和Markdown Preview
可以直接在pci(package control install)中安装
Tags: sublime
跟着 8 张思维导图学习 Javascript
作者:admin 日期:2014-11-07
学习的道路就是要不断的总结归纳,好记性不如烂笔头,so,下面将po出8张javascript相关的思维导图。
思维导图小tips:思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ,它简单却又极其有效,是一种革命性的思维工具。思维导图运用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接,思维导图充分运用左右脑的机能,利用记忆、阅读、思维的规律,协助人们在科学与艺术、逻辑与想象之间平衡发展,从而开启人类大脑的无限潜能。思维导图因此具有人类思维的强大功能。
分别归类为:
- javascript变量
- javascript运算符
- javascript数组
- javascript流程语句
- javascript字符串函数
- javascript函数基础
- javascript基础DOM操作
- javascript正则表达式
能够认真看完就是一次对javascript的回顾与提升,可以很好的检验基础。

jQuery表单验证插件
作者:admin 日期:2014-10-29
1. jQuery formValidator
第三方手册 http://shouce.jb51.net/phpcms/PHPCMS/formvalidator.html
2. jQuery.validate
常用排序算法之JavaScript实现
作者:admin 日期:2014-09-02
1、插入排序
1)算法简介
插入排序(Insertion-Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。
2)算法描述和实现
一般来说,插入排序都采用in-place在数组上实现。具体算法描述如下:
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置后;
- 重复步骤2~5。
JavaScript代码实现:
function insertionSort(array) {
if (Object.prototype.toString.call(array).slice(8, -1) === "Array') {
for (var i = 1; i < array.length; i++) {
var key = array[i];
var j = i - 1;
while (j >= 0 && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}
return array;
} else {
return 'array is not an Array!';
}
}
Javascript如何绑定当前的作用域
作者:admin 日期:2014-06-26
说白了就是怎么把当前的this指针传递到内部嵌套的其它函数当中,总的来说,有两种方法。
绑定方法一:
参考这面这篇文章(JS常用代码片段集合), 里面有介绍一种绑定函数的this指针的方法,具体用法大致如下。
JS常用代码片段集合
作者:admin 日期:2014-06-19
JS实现String#repeat
var a = new Array(10+1).join('-');
绑定函数的this指针(scope)
function bind(func, obj)
{
return function(){
func.apply(obj, arguments);
};
}
var obj = {
name : "WEB应用开发",
url : "http://www.zeroplace.cn"
};
var func = bind(function(param){
alert(this.name + " " + this.url + " " + param);
}, obj);
func("很不错的网站");
获取和设置COOKIE
function setCookie(key, value, path, domain, expires, secure)
{
var cookie = [];
cookie.push(key + "=" + escape(value || ""));
if (!value) {
expires = new Date(Date.now() - 1).toGMTString();
}
if (path) {
cookie.push("path=" + path);
}
if (domain) {
cookie.push("domain=" + domain);
}
if (expires) {
cookie.push("expires=" + expires);
}
if (secure) {
cookie.push("expires");
}
console.log(document.cookie = cookie.join(";"));
}
function getCookie(name)
{
var pattern = new RegExp(name + "=(.*?)(?:;|$)");
var arr = document.cookie.match(pattern);
if (arr) {
return arr[1];
} else {
return null;
}
}
Tags: js
Chrome 开发者工具使用技巧
作者:admin 日期:2014-03-19
JavaScript Beautifier
JavaScript 文件在上线前一般都会压缩下,压缩的 JavaScript 几乎没有可读性,几乎无法设定断点。在 Scripts 面板下面有个 Pretty print 按钮(这种符号 {}),点击会将压缩 JavaScript 文件格式化缩进规整的文件,这时候在设定断点可读性就大大提高了。
查看元素绑定了哪些事件
在 Elements 面板,选中一个元素,然后在右侧的 Event Listeners 下面会按类型列出这个元素相关的事件,也就是在事件捕获和冒泡阶段会经过的这个节点的事件。在 Event Listeners 右侧下拉按钮中可以选择 Selected Node Only 只列出这个节点上的事件。
AJAX 时中断
在 Sources 面板右侧有个 XHR Breakpoints,点右侧的 + 会添加一个 XHR 断点, 断点是根据 XHR 的 URL 匹配中断的,如果不写匹配规则会在所有 AJAX,这个匹配只是简单的字符串查找,发送前中断,在中断后再在 Call Stack 中查看时那个地方发起的 AJAX 请求。
HTML5开发手机应用--viewport的作用
作者:admin 日期:2014-01-28
在用HTML5开发手机应用或手机网页时,<head>部分总会有如下一段代码,这段代码到底什么意思呢。在网上,大家会得到很多答案。我从网上搜集了部分介绍,整理一下,以留备用。
<meta name="viewport" content="width=device-width,height=device-height,inital-scale=1.0,maximum-scale=1.0,user-scalable=no;" />
什么是Viewport
手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局),用户可以通过平移和缩放来看网页的不同部分。移动版的 Safari 浏览器最新引进了 viewport 这个 meta tag,让网页开发者来控制 viewport 的大小和缩放,其他手机浏览器也基本支持。
width:控制 viewport 的大小,可以指定的一个值,如果 600,或者特殊的值,如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。
height:和 width 相对应,指定高度。
initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。
maximum-scale:允许用户缩放到的最大比例。
minimum-scale:允许用户缩放到的最小比例。
user-scalable:用户是否可以手动缩放
“viewport”,翻译为中文可以叫做“视区”,大家都知道移动设备的屏幕一般都比PC小很多,webkit浏览器会将一个较大的“虚拟”窗口映射到移动设备的屏幕上,默认的虚拟窗口为980像素宽(目前大部分网站的标准宽度),然后按一定的比例(3:1或2:1)进行缩放。也就是说当我们加载一个普通网页的时候,webkit会先以980像素的浏览器标准加载网页,然后再缩小为490像素的宽度。注意这个缩小是一个全局缩小,也就是页面上的所有元素都会缩小。如下图所示,一个普通的文章页面在移动设备的效果:

页面以980像素加载,没有变形,但是按比例缩放后,很多东西用肉眼基本看不清了。
那么我们能不能人为改变webkit的视区呢?当然能,在<head>与</head>之间加上如下视区代码:
<meta name="viewport" content="width=500"/>

<meta name="viewport" content="width=device-width" />

jQuery的方式实现ajax并发同步
作者:admin 日期:2013-11-25
之前在一篇文章中有讲到js的异步协作,那时候讲的是用了一个库EventProxy(参考: http://www.zeroplace.cn/article.asp?id=859)。这次我说,有实际上jQuery就自带了一个工具就可以很简单的实现类似的功能。
同样是上次说的例子,在网页中数据是ajax的,模板也是ajax获取。
$(function(){
// from http://www.zeroplace.cn
$.when($.getJSON("data.js"), $.get("data.tpl"))
.done(function(arg1, arg2){
var title = arg1[0].title;
var tpl = arg2[0];
var html = tpl.replace("{$title}", title);
$("body").html(html);
});
})
JS的代码还是相当简单的
DNS预获取(dns-prefetch)
作者:admin 日期:2013-10-18
Js异步协作
作者:admin 日期:2013-08-06
文档 http://html5ify.com/eventproxy/api.html
先上上段代码
var EventProxy = require("./eventproxy');
var proxy = new EventProxy();
var add= function (v1, v2, v3){
console.log(v1+v2+v3+'');
};
proxy.assign("v1", "v2", "v3", add);
clinet1.get("key1", function (err, data) {
//do something
proxy.trigger("v1", data);
});
clinet2.get("data", function (err, data) {
//do something
proxy.trigger("v2", data);
});
clinet3.get("l10n", function (err, data) {
//do something
proxy.trigger("v3", data);
});
在JS的编程中经常会有这样的需要: 需要生成一个页面,数据是ajax的,模板也是ajax获取,通常的做法是先发一个ajax请求取数据,等永请求完成再发一个ajax请求取模板,最后再来渲染。
实际上请求数据和请求模板这两个请求同时发起,等两个都返回的时候就可以渲染了。这个eventproxy就是为方便这样做事而写的一个东西。
javascript 函数嵌套调用的效率测试
作者:admin 日期:2013-07-31
Javascript中函数嵌套定义给我们开发带来了很多便利,但是他的效率怎么样呢? 我做了一个简单的测试。
//test
function func1(a, b) {
return (function(a, b){
return (function(a, b){return a+b})();
})();
}
function func2(a, b)
{
var nest1 = function(a, b)
{
var nest11 = function(){
return a+b;
}
return nest11(a+b);
}
return nest1(a,b);
}
function func3(a, b) {
function nest1(a, b){
function nest11(a, b){
return a+b;
}
return nest11(a, b);
}
return nest1(a, b);
}
function nest44(a, b){
return a+b;
}
function nest4(a, b){
return nest44(a, b);
}
function func4(a, b) {
return nest4(a, b);
}
console.time("start1");
for(var i=0; i<1000000; i++) {
func1(1,1);
}
console.timeEnd("start1");
console.time("start2");
for(var i=0; i<1000000; i++) {
func2(1,1);
}
console.timeEnd("start2");
console.time("start3");
for(var i=0; i<1000000; i++) {
func3(1,1);
}
console.timeEnd("start3");
console.time("start4");
for(var i=0; i<1000000; i++) {
func4(1,1);
}
console.timeEnd("start4");
本代码用nodejs看执行,得到如下的结果:
# node test2.js
start1: 190ms
npm常用命令
作者:admin 日期:2013-07-31
npm install <name>安装nodejs的依赖包
例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本,如npm install express@3.0.6
npm install <name> -g 将包安装到全局环境中
但是代码中,直接通过require()的方式是没有办法调用全局安装的包的。全局的安装是供命令行使用的,就好像全局安装了vmarket后,就可以在命令行中直接运行vm命令
npm install <name> --save 安装的同时,将信息写入package.json中
项目路径中如果有package.json文件时,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包
这样代码提交到github时,就不用提交node_modules这个文件夹了。
npm init 会引导你创建一个package.json文件,包括名称、版本、作者这些信息等
npm remove <name>移除
npm update <name>更新
npm ls 列出当前安装的了所有包
npm root 查看当前包的安装路径
npm root -g 查看全局的包的安装路径
npm help 帮助,如果要单独查看install命令的帮助,可以使用的npm help install