文書の過去の版を表示しています。
目次
Set Cookie's expire date
function saveCookie(){ var targetDate = new Date(); var dateInMs = targetDate.getTime(); dateInMs += 60 * 60 * 24 * 1000 * 365; //有効期限1年間 targetDate.setTime(dateInMs); tmp = "多国語対応 non-ascii characters"; document.cookie = "cookieInfo="+escape(tmp)+"; expires=" + targetDate.toGMTString(); }
delete cookie
有効期限を過去にすることでクッキを削除することが可能だ。
function delCookie() { document.cookie = "torqueInfo=; expires=Thu,01-Jan-1970 00:00:01 GMT"; }
Cookie escape Issue
前のsnippetでtmpが多国語(non-ascii文字列)の場合、必ずescapeしなければならない。
IEとFireFoxでテストしてみたが、不思議なごとにIIS-Tomcat連携サーバー(port:80)の環境でFirefoxのテスト結果,[HTTP/1.x 400 Bad Request]というメッセージが返ってきた。
しかし、port:8080(Tomcat default port)なら問題なく動作する。何が起こっているのか。
IISのエラーメッセージを確認してみたら次のとおりだった。1)
#Fields: date time c-ip c-port s-ip s-port cs-version cs-method cs-uri sc-status s-siteid s-reason s-queuename 2008-05-02 00:28:34 192.168.*.*** 1097 192.168.*.** 80 ----- Timer_ConnectionIdle -
はじめてみるTimer_ConnectionIdle エラー。これは何?
早速、Googleに尋ねてみるとrequestヘッダの限界値を超えた場合、Bad Requestが返ってくる場合があるという。
どうも、cookieが怪しいのでhttpヘッダを調べたところ確かに
POST /khkweb/mail/sendMail.do HTTP/1.1 Host: svr2003:8080 Cookie: tmpInfo=.%u682A%u5F0F%u4F1A%u793E.%u5C0F%u539F%u3000%u592A%u90CE..048-255-4871..3320022. %u57FC%u7389%u770C%u5DDD%u53E3%u5E02%u4EF2%u753A%uFF11%uFF13%uFF0D%uFF11%uFF17.1.kohara@khkgears%20co%20jp. .0.0.; cookieInfo=.*>.; JSESSIONID=12E0FCEAA24660B0A3D428B7D482403B
POST /khkweb/mail/sendMail.do HTTP/1.1 Host: svr2003 Cookie: cookieInfo=.*>.; JSESSIONID=12E0FCEAA24660B0A3D428B7D482403B
両方ともcookieをescapeしないでブラウザにセーブした結果である。
port:80で要請した際、cookieがescapeされてない事が分かる。しかしport:8080で要請した場合は勝手にescapseされる。
ちなみに、IEでテストした場合も同様にescapeされる。いまだに、原因は不明だがIISサーバーのポートforwardingと関係がありそうだ。
最後にテスト環境を紹介する。
Web Server | Browser | JDK | OS |
---|---|---|---|
IIS 6.0 Tomcat 5.5 | IE6.0 FireFox2.0 | 1.5 | Windows Server 2003 |
Merge Rowspan
function cellMergeChk(tableObj, rowIndex, cellIndex) { var rowsCn = tableObj.rows.length; if(rowsCn-1 > rowIndex) cellMergeProcess(tableObj, rowIndex, cellIndex); } function cellMergeProcess(tableObj, rowIndex, cellIndex) { var rowsCn = tableObj.rows.length; var compareCellsLen = tableObj.rows[rowIndex].cells.length; //count first rows //initialization var compareObj = tableObj.rows[rowIndex].cells[cellIndex]; var compareValue = compareObj.innerHTML; var cn = 1; var delCells = new Array(); var arrCellIndex = new Array(); for(i=rowIndex+1; i < rowsCn; i++) { var cellsLen = tableObj.rows[i].cells.length; var bufCellIndex = cellIndex //get collIndex of row if(compareCellsLen != cellsLen) { bufCellIndex = bufCellIndex - (compareCellsLen - cellsLen); } cellObj = tableObj.rows[i].cells[bufCellIndex]; if(compareValue == cellObj.innerHTML) { //save the number of cell to delete. delCells[cn-1] = tableObj.rows[i]; //save the index of row cell. arrCellIndex[cn - 1] = bufCellIndex; cn++; } else { //merge compareObj.rowSpan = cn; //delete for(j=0; j < delCells.length; j++) { delCells[j].deleteCell(arrCellIndex[j]); } //initialize compareObj = cellObj; compareValue = cellObj.innerHTML; cn = 1; delCells = new Array(); arrCellIndex = new Array(); } } //merge compareObj.rowSpan = cn; //delete for(j=0; j < delCells.length; j++) { delCells[j].deleteCell(arrCellIndex[j]); } }//
Usage
#merge first <td>
cellMergeChk(document.getElementById(“dataList”), 1, 0);
#merge second <td>
cellMergeChk(document.getElementById(“dataList”), 1, 1);
reference
Add Comma
function addComma(number) { number = '' + number; if (number.length > 3) { var mod = number.length % 3; var output = (mod > 0 ? (number.substring(0,mod)) : ''); for (i=0 ; i < Math.floor(number.length / 3); i++) { if ((mod == 0) && (i == 0)){ output += number.substring(mod+ 3 * i, mod + 3 * i + 3); } else{ output+= ',' + number.substring(mod + 3 * i, mod + 3 * i + 3); } }//end for return (output); }else{ return number; } }
ちなみにカンマを除去するのは次のとおり
function delComma(value){ var str = ''+value; var output=str.replace(/\,/g,''); return output; }
Number validation
function isNumeric(val, msg, item) { var obj = document.forms[0]; oneDecimal = false; strInput = "" + val; var resultStr=""; for (var i=0; i<strInput.length; i++) { var oneChar = strInput.charAt(i); // check minus & plus number if (i == 0 && strInput.length > 1) { if (strInput == "-." || strInput == "+.") { item.blur(); alert(msg); return false; }else if(oneChar =="-" || oneChar=="+"){ resultStr = oneChar; continue; }//end if }//end if if(oneChar !="."){ if (oneChar < "0" || oneChar > "9") { item.blur(); alert(msg); return false; }//end if } resultStr = resultStr + oneChar; } item.value = resultStr; return true; }
Trim function
//full trim String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,""); } //left trim String.prototype.ltrim = function() { return this.replace(/^\s+/,""); } //right trim String.prototype.rtrim = function() { return this.replace(/\s+$/,""); }
space以外にも も対応する場合はregexpの部分を次のように修正すればよい。
this.replace(/^[\s\xA0]+|[\s\xA0]+$/g,"");
calculation the size of textarea
textareaに入力した文字列のサイズを測る為に、次のソースを活用できる。
String.prototype.size = function() { var _len = (!this) ? 0 : this.length; var _size = 0; for (i = 0; i < _len; i++) { c = this.charCodeAt(i); if ((c >= 0x0000) && (c <= 0x007F) ) { _size++; } else if(c > 0x07FF){ _size += 3; } else { _size += 2; }//if~else } return _size; }
demo page
<html> <head> <meta http-equiv=“Content-Type” content=“text/html; charset=UTF-8” /> <title>demo page for form reset using jQuery</title>
<script type=“text/javascript” src=“./test/js/jquery-1.4.2.js”></script>
<script type=“text/javascript”> String.prototype.size = function() {
var _len = (!this) ? 0 : this.length; var _size = 0;
for (i = 0; i < _len; i++) {
c = this.charCodeAt(i);
if 2)
_size++; } else if(c > 0x07FF){ _size += 3; } else { _size += 2; }//if~else }
return _size;} $(function(){
$("textarea[name='q']").focus(function(){ $("#console").text(this.val().size()); });}); </script> <style type=“text/css”></style> </head> <body> <textarea name=“q” cols=“50” rows=“5”></textarea> <br> <div id=“console” style=“display:inline-block;”>0</div>bytes </body> </html> ~~DISCUSSION~~