循环中ajax请求全局变量问题

循环中异步ajax请求用到全局变量如果不做特殊处理不会得到预想的结果,这里的全局变量指的是ajax回掉外边在循环内定义的变量。

因为是异步请求,所以基本是在循环完毕之后才会执行,这时候会调中用到的全局变量是最后一次循环后的那个变量。

解决办法就是必须把当前循环中的变量传递到一个封闭空间中,比如以参数形式传递到函数中。

参考

http://stackoverflow.com/questions/2687679/jquery-ajax-inside-a-loop-problem

svn diff 命令行输出格式详解

main.c文件的内容如下

  1 #include <stdio.h>
  2 #include "add.h"
  3 #include "sub.h"
  4
  5 int main()
  6 {
  7         printf("5 + 10 = %d.n",add(5,10));
  8         printf("15 - 10 = %d.n",sub(15,10));
  9         //kris's test
 10         printf("kris: 12 + 28 = %d.n",add(12,28));
 11         //sally's test
 12         printf("sally: 60 - 33 = %d.n",sub(60,33));
 13         return 0;
 14 }

下面,我们做一些修改,具体如下

  1 #include <stdio.h>
  2 #include "add.h"
  3 #include "sub.h"
  4
  5 int main()
  6 {
  7         printf("5 + 10 = %d.n",add(5,10));
  8         printf("15 - 10 = %d.n",sub(15,10));
  9         //kris's test
 10         printf("kris: 32 + 28 = %d.n",add(32,28));
 11         printf("kris: 15 - 10 = %d.n",sub(15,10));
 12         //sally's test
 13         printf("sally: 60 - 33 = %d.n",sub(60,33));
 14         return 0;
 15 }

修改完后,调用svn diff命令,会有如下的输出,下面就说说输出中各部分的意思。

root@letuknowit:/home/kris/calc/trunk# svn diff main.c
Index: main.c
===================================================================
--- main.c      (revision 8)
+++ main.c      (working copy)
@@ -7,7 +7,8 @@
        printf("5 + 10 = %d.n",add(5,10));
        printf("15 - 10 = %d.n",sub(15,10));
        //kris's test
-       printf("kris: 12 + 28 = %d.n",add(12,28));
+       printf("kris: 32 + 28 = %d.n",add(32,28));
+       printf("kris: 15 - 10 = %d.n",sub(15,10));
        //sally's test
        printf("sally: 60 - 33 = %d.n",sub(60,33));
        return 0;

Index: main.c

svn diff可以查看当前工作拷贝中所有的被修改的文件,对于每个文件的diff输出部分由Index: 文件名的形式进行区分。
等于号后面的内容就是关于main.c文件的diff情况了。

--- main.c      (revision 8)
+++ main.c      (working copy)

— 打头的是原始文件,也就是版本库中的最新版本,或者理解为修改前的文件
+++ 打头的是目标文件,这个就是你修改后的版本

@@ -7,7 +7,8 @@

这里的-和+分别表示原始文件和目标文件,7,7表示从第7行开始的7行,-7,7就是原始文件的从第7行开始的7行内容,+7,8的意思类似,表示目标文件从第7行开始的8行内容。结合起来理解就是:
目标文件从第7行开始的8行内容和原始文件的从第7行开始的7行内容之间存在差异

        printf("5 + 10 = %d.n",add(5,10));
        printf("15 - 10 = %d.n",sub(15,10));
        //kris's test
-       printf("kris: 12 + 28 = %d.n",add(12,28));
+       printf("kris: 32 + 28 = %d.n",add(32,28));
+       printf("kris: 15 - 10 = %d.n",sub(15,10));
        //sally's test
        printf("sally: 60 - 33 = %d.n",sub(60,33));
        return 0;

这个就是具体的差异情况了,前面的-号表示需要从原始文件中删除的行,+号表示目标文件中将要增加的行,-号开头的部分只属于原始文件,+号开头的部分只属于目标文件,其余的是两者相同的部分。

  7   1   1         printf("5 + 10 = %d.n",add(5,10));
  8   2   2         printf("15 - 10 = %d.n",sub(15,10));
  9   3   3         //kris's test
 10   4     -       printf("kris: 12 + 28 = %d.n",add(12,28));
 11       4 +       printf("kris: 32 + 28 = %d.n",add(32,28));
 12       5 +       printf("kris: 15 - 10 = %d.n",sub(15,10));
 13   5   6         //sally's test
 14   6   7         printf("sally: 60 - 33 = %d.n",sub(60,33));
 15   7   8         return 0;

为了进一步了解@@ -7,7 +7,8 @@的意思,上面加上了行号等信息,第一列的数字是行号,后面两列的数字表示第几行。经过标注可以清晰的看出原始文件第7行开始的7行和目标文件第7行开始的8行内容了。

参考
http://www.letuknowit.com/archives/avn-diff-output-interpreter



jQuery 获取当前节点的html

在开发过程中,jQuery.html() 是获取当前节点下的html代码,并不包含当前节点本身的代码,然后我们有时候确需要,找遍jQuery api文档也没有任何方法可以拿到。

看到有的人通过parent().html(),如果当前元素没有兄弟元素还行,如果有那就行不通了。后台实验发现有一个jQuery的一个方法可以解决,而且非常简便,如下:

jQuery.prop("outerHTML");

<div class="test"><p>hello,你好!</p></div>
<script>
$(".test").prop("outerHTML");
</script>

输出结果为:<div class="test"><P>hello,你好!</p></div>

因为原生JS DOM里有一个内置属性 outerHTML (看清大小写哦,JS是区分大小写的)用来获取当前节点的html代码(包含当前节点),所以用jQuery的prop()能拿到,经过实验attr()方法是拿不到的,不信的话,大家也可以尝试尝试,谢谢。

当然也有人用jQuery的 clone() 函数配合append() 来创建一个只有一个子元素的节点,然后来拿节点的html,这样也是可行的,但是代码繁琐。

Bash比较版本号

Linux下bash直接用sort -V实现,Mac下的bash没有-V选项,研究之后有两种方式可以实现,第一种纯sort命令方式,第二种自行写逻辑。

第一种:

sort -n -t . -k 1,3 version.txt

结果:

1.01.2
1.1.0
1.12.3
1.2.5
2.4

第二种,来自(stackoverflow)

#!/bin/bash
vercomp () {
    if [[ $1 == $2 ]]
    then
        return 0
    fi
    local IFS=.
    local i ver1=($1) ver2=($2)
    # fill empty fields in ver1 with zeros
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
    do
        ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++))
    do
        if [[ -z ${ver2[i]} ]]
        then
            # fill empty fields in ver2 with zeros
            ver2[i]=0
        fi
        if ((10#${ver1[i]} > 10#${ver2[i]}))
        then
            return 1
        fi
        if ((10#${ver1[i]} < 10#${ver2[i]}))
        then
            return 2
        fi
    done
    return 0
}

testvercomp () {
    vercomp $1 $2
    case $? in
        0) op='=';;
        1) op='>';;
        2) op='<';;
    esac
    if [[ $op != $3 ]]
    then
        echo "FAIL: Expected '$3', Actual '$op', Arg1 '$1', Arg2 '$2'"
    else
        echo "Pass: '$1 $op $2'"
    fi
}

# Run tests
# argument table format:
# testarg1   testarg2     expected_relationship
echo "The following tests should pass"
while read -r test
do
    testvercomp $test
done << EOF
1            1            =
2.1          2.2          <
3.0.4.10     3.0.4.2      >
4.08         4.08.01      <
3.2.1.9.8144 3.2          >
3.2          3.2.1.9.8144 <
1.2          2.1          <
2.1          1.2          >
5.6.7        5.6.7        =
1.01.1       1.1.1        =
1.1.1        1.01.1       =
1            1.0          =
1.0          1            =
1.0.2.0      1.0.2        =
1..0         1.0          =
1.0          1..0         =
EOF

echo "The following test should fail (test the tester)"
testvercomp 1 1 '>'
$ . ./vercomp
The following tests should pass
Pass: '1 = 1'
Pass: '2.1 < 2.2'
Pass: '3.0.4.10 > 3.0.4.2'
Pass: '4.08 < 4.08.01'
Pass: '3.2.1.9.8144 > 3.2'
Pass: '3.2 < 3.2.1.9.8144'
Pass: '1.2 < 2.1'
Pass: '2.1 > 1.2'
Pass: '5.6.7 = 5.6.7'
Pass: '1.01.1 = 1.1.1'
Pass: '1.1.1 = 1.01.1'
Pass: '1 = 1.0'
Pass: '1.0 = 1'
Pass: '1.0.2.0 = 1.0.2'
Pass: '1..0 = 1.0'
Pass: '1.0 = 1..0'
The following test should fail (test the tester)
FAIL: Expected '>', Actual '=', Arg1 '1', Arg2 '1'

参考:

http://stackoverflow.com/questions/4023830/how-compare-two-strings-in-dot-separated-version-format-in-bash