Hot For Coding
jQuery替换标签函数replaceWith()的使用

jQuery中,有一个强大的替换函数replaceWith(),使用非常简单,如:

// 把所有p标签替换为“##”
$('p').replaceWith('##');

利用这个replaceWith,我们可以把所有p标签替换为b标签,内容不变:

$('p').each(function(){
  $(this).replaceWith('<b>'+$(this).html()+'</b>');
});

如果你开发的是一个多语言的网站,甚至可以利用这个特性,比如,在你需要翻译的文字上加上i标签,然后遍历翻译替换。

...

READ ALL

JavaScript深度比较两个对象是否相等

在JavaScript中比较两个对象的成员是否相等有点麻烦,如果只是第一层比较,很容易,但子对象里的属性可能又是一个对象,所以只能递归。

代码:

// 去重
Array.prototype.unique = function () {
  this.sort();
  var re = [this[0]];
  for (var i = 1; i < this.length; i++) {
    if (this[i] !== re[re.length-1]) {
      re.push(this[i]);
    }
  }
  return re;
}

var objectDeepEqual = function(o1, o2) {
  if(typeof o1 != typeof o2){
    return false;
  }

  if(typeof o1.length != typeof o2.length ){
    return false;
  }

  var bool = true;

  var keyArr1 = [];
  var keyArr2 = [];
    
  for (var i in o1) {
    keyArr1.push(i);
  }

  for (var i in o2) {
    keyArr2.push(i);
  }

  if (keyArr1.length != keyArr2.length) {
    return false;
  }

  for(var i = 0, k = keyArr2.length; i < k; i++){
    keyArr1.push(keyArr2[i]);
  }

  var keyArr = keyArr1.unique();

  for(var i=0,k=keyArr.length;i<k;i++){
    if ((keyArr[i] in o1) && (keyArr[i] in o2)) {
      if (typeof o1[keyArr[i]] == 'object' && typeof o2[keyArr[i]] == 'object' ) {
        bool = objectDeepEqual(o1[keyArr[i]], o2[keyArr[i]]);
      } else if (o1[keyArr[i]] !== o2[keyArr[i]]){
        return false;
      }
    }else{
      return false;
    }
  }

  return bool;
};

...

READ ALL

看看这些程序是如何盗取站点数据的

翻了一下Nginx的log,发现这些傻逼天天使用程序不停的想要盗取我站点资料

14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /wwwroot.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /wwwroot.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:01] "HEAD /www.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /bbs.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /bbs.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /web.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /web.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.qttc.net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www.qttc.net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www_qttc_net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /www_qttc_net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /wwwqttcnet.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /wwwqttcnet.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:02] "HEAD /qttc.net.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.net.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.rar HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"
14.114.23.72 - [23/Jul/2013:16:40:03] "HEAD /qttc.zip HTTP/1.1" 405 0 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)"

...

READ ALL

阻止IE8下右键菜单的弹出

今天写一个自定义右键菜单功能,要实现这个功能需要捕获右键事件,这个很容易,几乎没有任何兼容。标签上添加 oncontextmenu 事件就好。下来就是阻止事件传播以及阻止系统右键弹出菜单的功能。于是我这么干

var e = evt || window.event;
 
if (e.preventDefault) {
  e.preventDefault();
}
     
if (e.stopPropagation) {
  e.stopPropagation();
} else {
  e.cancelBubble = true;
}

...

READ ALL

Nginx配置proxy_cache后缓存目录里没有生成缓存文件

之前一直都使用memcached做缓存,最近想尝试一下Nginx的proxy_cache缓存方式,proxy_cache可以根据指定key的组合方案生成MD5哈希把页面结果存储在磁盘上,跟大多综合站点的生成静态页的缓存方式一样。proxy_cache方式跟memcached内存级别的缓存还是不能比拟,但Nginx目前还不能做memcached的write动作,所以简单配置proxy_cache也能抵挡不少鸭梨。

没有配置好proxy_cache

但在网络上搜索几篇文章以后,发现大家写的很模糊,很多文章都是抄袭复制品。所以按照网络上的教程,我一开始是这么配置的,在http段增加:

...

READ ALL

狡猾的几道PHP试题,试试看看你会不会也掉入陷阱

这几道题是在网上看到的,感觉挺有意思,拿来给大家分享其中的陷阱,看看你会不会掉入其中。

第一题

$arr = array(0 => 1, "aa" => 2, 3, 4);

foreach($arr as $key=>$val){
  print($key == "aa" ? 5 : $val);
}

输出结果是多少?如果的答案是1534就掉入陷阱了。

先看看这个数组最终形成的结构:

Array
(
  [0] => 1
  [aa] => 2
  [1] => 3
  [2] => 4
)

然后遍历每一个元素的key看等不等于aa,等于就用5替代。当我告诉你答案是5534的时候,你会不会有点惊讶!难道0等于"aa"吗?是的,0就等于"aa",这道题重点就考你这个。在PHP中两个值进行逻辑判断时,如果两个值的类型不一致PHP会自动把右边的值转换到左边的类型,然后再进行判断。因此"aa"转换整形等于0,自然也就等于左边的0了。你可以使用全等于避免这种该情况,也就是如果你写成

...

READ ALL

MySQL IFNULL函数判断字段值为NULL时使用默认值

在使用left join等联表查询时,常遇到某些字段为null,一般都在程序处理使用if a==null判断做处理,其实MySQL本身也有一个IFNULL函数可以处理。

name:

mysql> select * from name;
+------+-----------+
| id   | user      |
+------+-----------+
|    1 | xiaoqiang |
|    2 | lisi      |
|    3 | xiaowu    |
|    4 | laoliu    |
+------+-----------+
4 rows in set (0.00 sec)

...

READ ALL

Nginx支持.htaccess

Nginx和Apache的.htaccess自然是一点关系都没有,然而由于历史原因非常多的Apache用户正在逐步使用Nginx,同样是WebServer,部分规则特性都是相通的,要想在Nginx使用.htaccess目前最简单的方法是把.htaccess翻译到nginx.conf。显然已经有人这么干了,并且还推出了网页版

打开这个网页,把你的.htaccess内容粘贴到文本框中,点Convert按钮即可生成nginx.conf,并且这个工具还支持格式检查,非常好用。当然了,毕竟是程序翻译的,最好还是检查一下转换结果再使用。

...

READ ALL

Git常用命令

Git是一个分布式版本控制软件,目前非常流行,尤其是去中心化,相比SVN我更觉得Git更加好用

# 它可以将当前目录初始化一个Git仓库
$ git init

# 克隆一个远程的仓库,这个地址一般有两种协议
# 1、http
# 2、ssh
$ git clone [remote repo url]

# 查看改了哪些文件
$ git status

# 添加修改的文件,后面的点表示添加所有文件
$ git add .

# 提交代码
$ git commit -m "first commit"

# 查看所有记录
$ git log

# 设置远程仓库
$ git remote set-url origin [url]

# 同步远程代码到本地
$ git pull

# 推送到远程分支
$ git push -u origin master

# 查看所有tag
$ git tag

# 打tag
$ git tag v1.0.0

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 如果本地和远程都要列出来
$ git branch -a

# 新建一个分支并切换
$ git branch -b [branch name]

# 切换回master分支
$ git checkout master

# 合并dev分支到master分支
$ git merge --no-ff dev

# 删除分支
$ git branch -d dev

...

READ ALL

推荐一个JavaScript的变种脚本语言CoffeeScript

首先,为什么会有CoffeeScript这种东西,原因特别简单,为了弥补JavaScript的不足。它的运行原理特别简单,按照它的语法编写程序,在丢到浏览器运行之前需要使用它的编译器编译成JavaScript代码。理论上,也属于编译语言,只不过传统上我们认识的编译语言都是编译成二进制

使用之前需要安装

npm install coffeescript

...

READ ALL