因为你在这使用了g匹配模式,第一次匹配成功后,lastIndex没有重置,造成第二次匹配失败
然后lastIndex被重置,这样计数交替进行...把你原来的g匹配模式去掉就可以了.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>test</title>
</head>
<body>
<script type="text/javascript">
function $(id){
return document.getElementById(id);
} function textCounter(theField,theCharCounter)
{
    
    var strTemp = "";
    var reg = "";
    var osel1 = document.getElementById("source1");
    
    if(osel1.value=='Chinese'){
        reg=/[\u4E00-\u9FA5]/;
    }else if(osel1.value=='English'){
        reg=/[a-zA-Z]/;
    }else{
        reg="~!@#$%^&*()_+|`-=\{}[]:\";\<>?,./";
    }
    
        //这里打印的都是 reg=/[a-zA-Z]/g;
        var strCharCounter0 = 0;
    
    for (var i=0; i < theField.value.length ; i++)
    {
        var strChar = theField.value.substring(i, i + 1);
        //alert("loop:"+ theField.value.length+ "strChar:"+strChar);//这里只要一输入一个字母, 就不停的弹出这个对话框。
        if(reg.test(strChar)){
                strCharCounter0 = strCharCounter0+1;
        }else{
                //alert("no");
        }
    }
    theCharCounter.value = strCharCounter0;
    
}
</script>
<form name="form1" method="post" action="index.php">
<table >
<tr>
    <td >语言1:</td>
    <td >
    <input text="source1" id="source1" value="English"/>
    </td>
</tr>
<tr>
    <td >语言2:</td>
    <td >
    <input text="source2" value="Chinese"/>
    </td>
</tr>
<tr>
    <td class="label">&nbsp;</td>
    <td class="field">
    <div id="remand">
    你已输入
    <input id=numOfword name=numOfword type=text value="0" size=5 maxlength=5 readonly>
    字
    </div>
    </td>    
</tr>
<tr>
    <td class="label">内容:</td>
    <td class="field"><textarea name="content" cols="40" rows="20" onkeyup="textCounter($('content'),$('numOfword'));"  id="content"></textarea></td>
</tr>
<tr>
    <td class="field" align="center" colspan="2">
    <div class="control">
    <input type="submit" value='submit'></input> &nbsp;&nbsp;
    </div>
    </td>
</tr>
</table>
</form>
</body>
</html>