XML Parser javascript class v1.0.0

ITWeb/개발일반 2010. 5. 11. 12:34
XMLHttpRequest 와 더불어 유용할 것 같아서 만들었습니다.
역시 다른데 코드는 제 스타일도 아니고 읽기도 힘들고 그래서.. 후다닥 만들었다는..
recursive call 을 하기는 하지만 나름 쉽게 작성했습니다.
코드 가지고 태클은 금지.. ㅎㅎ



/*
 * XMLParser Control Module
 *
 * @package
 * @path
 * @filename    xmlparser.js
 * @author      
 * @date        2010/05/03
 *
 * Change History
 * Date         Engineer                Type        Description
 * ----------   ------------------      ---------   --------------------
 * 2010/05/03 Henry Jeong  create  initialize
 */
/*
 *
 * XMLParser module object
 *
 */
var JXmlParser = function() {
};
/*
 *
 * xml parser variables
 */
JXmlParser.prototype.vars = {
 parser : null,
 doc : null,
 xmldata : null,
 root : null,
 xml : null
}
JXmlParser.prototype.init = function() {
 if (window.DOMParser) {
  JXmlParser.vars.parser = new DOMParser();
  JXmlParser.vars.doc = JXmlParser.vars.parser.parseFromString(
    JXmlParser.vars.xmldata, "text/xml");
  JXmlParser.vars.root = JXmlParser.vars.doc.childNodes.item(0);
 } else {
  JXmlParser.vars.doc = new ActiveXObject("Microsoft.XMLDOM");
  JXmlParser.vars.doc.async = "false";
  JXmlParser.vars.doc.loadXML(JXmlParser.vars.xmldata);
  JXmlParser.vars.root = JXmlParser.vars.doc.documentElement;
 }
 JXmlParser.vars.xml = new Object();
 JXmlParser.vars.xml["length"] = JXmlParser.vars.root.childNodes.length;
}
JXmlParser.prototype.setXml2Array = function(pobj, node) {
 var len = node.length;
 if (window.DOMParser) {
  for ( var i = 0; i < len; i++) {
   if (node[i].nodeName.charAt(0) == "#") {
    continue;
   }
   pobj[i] = new Object();
   pobj[i][node[i].nodeName] = new Object();
   pobj[i][node[i].nodeName]["value"] = node[i].textContent;
   pobj[i][node[i].nodeName]["length"] = node[i].childNodes.length;
   pobj[i][node[i].nodeName]["attributes"] = new Object();
   if (node[i].attributes && node[i].attributes.length > 0) {
    var loop = node[i].attributes.length;
    for ( var j = 0; j < loop; j++) {
     pobj[i][node[i].nodeName]["attributes"][node[i].attributes[j].nodeName] = node[i].attributes[j].nodeValue;
    }
   }
   if (node[i].childNodes.length > 0) {
    JXmlParser.setXml2Array(pobj[i][node[i].nodeName],
      node[i].childNodes, node[i].childNodes.length);
   }
  }
 } else {
  for ( var i = 0; i < len; i++) {
   if (node[i].nodeName.charAt(0) == "#") {
    continue;
   }
   pobj[i] = new Object();
   pobj[i][node[i].nodeName] = new Object();
   pobj[i][node[i].nodeName]["value"] = node[i].text;
   pobj[i][node[i].nodeName]["length"] = node[i].childNodes.length;
   pobj[i][node[i].nodeName]["attributes"] = new Object();
   if (node[i].attributes && node[i].attributes.length > 0) {
    var loop = node[i].attributes.length;
    for ( var j = 0; j < loop; j++) {
     pobj[i][node[i].nodeName]["attributes"][node[i].attributes[j].nodeName] = node[i].attributes[j].text;
    }
   }
   if (node[i].childNodes.length > 0) {
    JXmlParser.setXml2Array(pobj[i][node[i].nodeName],
      node[i].childNodes, node[i].childNodes.length);
   }
  }
 }
}
JXmlParser = new JXmlParser();
/*
 * <script type="text/javascript"> <!-- var objDivDebug =
 * document.getElementById("divDebug");
 *
function run() {
 JXmlParser.vars.xmldata = "<?xml version='1.0' encoding='UTF-8'?><parser><totalcount type='number'><total>A</total><total>B</total></totalcount><items name='user' type='image'><item><seq>1</seq><id><![CDATA[jjeong****]]></id><originalImage><![CDATA[http://www.naver.com]]></originalImage><viewImage><![CDATA[http://www.naver.com]]></viewImage><thumbImage><![CDATA[http://www.naver.com]]></thumbImage><cheerMessage><![CDATA[한국어 테스트.]]></cheerMessage><register><![CDATA[20100503175621]]></register></item><item><seq>2</seq><id><![CDATA[layd****]]></id><originalImage><![CDATA[http://www.naver.com]]></originalImage><viewImage><![CDATA[http://www.naver.com]]></viewImage><thumbImage><![CDATA[http://www.naver.com]]></thumbImage><cheerMessage><![CDATA[CHEER MESSAGE]]></cheerMessage><register><![CDATA[20100503175621]]></register></item></items></parser>";
 
 JXmlParser.init();
 JXmlParser.setXml2Array(JXmlParser.vars.xml, JXmlParser.vars.root.childNodes); 
 
 objDivDebug.innerHTML += JXmlParser.vars.xml.length +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"].value +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"].attributes.type +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"].length +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"][0]["total"].value +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"][0]["total"].length +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"][1]["total"].value +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[0]["totalcount"][1]["total"].length +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"].value +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"].attributes.name +  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"].length +  "<br>"; 
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"][0]["item"] .length+  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"][0]["item"][0]["seq"] .value+  "<br>";
 objDivDebug.innerHTML += JXmlParser.vars.xml[1]["items"][0]["item"][1]["id"] .value+  "<br>";
}
 * //--> </script>
 */
*/

:

XMLHttpRequest javascript 용 class v1.0.0

ITWeb/개발일반 2010. 5. 11. 12:26
여기 저기 널린 코드들은 많은데 맘에 드는 코드가 별로 없어서 기냥 만들었습니다.
도대체 코드를 보기 힘들게 작성하는 이유는 무슨 심리 인지.. 좀 쉽게 작성 하면 어디 덧나나.. ㅡ.ㅡ;;
참고 사이트 : http://www.w3.org/TR/XMLHttpRequest/

뭐 아래 코드가 잘 짜진것도 아니지만.. 보기 쉽게 하려고 쬐금 노력은 했다는.. ㅎㅎ
이것도 보기 힘들다면.. 패스~



/*
 * XMLHttpRequest Control Module
 *
 * @package
 * @path
 * @filename    xhr.js
 * @author      
 * @date        2010/05/03
 *
 * Change History
 * Date         Engineer                Type        Description
 * ----------   ------------------      ---------   --------------------
 * 2010/05/03 Henry Jeong  create  initialize
 */
/*
 *
 * XMLHttpRequest module object
 *
 */
var JXhr = function() {
};
/*
 *
 * xmlhttprequest variables
 */
JXhr.prototype.vars = {
 xhr : null,
 onreadystatechange : null,
 onload : null,
 onerror : null,
 onresponse : null,
 contenttype : "text/xml",
 overridemimetype : "text/xml",
 method : "GET",
 callUrl : "",
 async : true,
 header : [], // setRequestHeader
 responsedata : "XML", // responseText, responseXML
 params : ""
}
JXhr.prototype.init = function() {
 if (window.XMLHttpRequest) {
  JXhr.vars.xhr = new XMLHttpRequest();
  JXhr.vars.xhr.onreadystatechange = JXhr.vars.onreadystatechange;
 } else if (window.ActiveXObject) {
  try {
   JXhr.vars.xhr = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (e) {
   JXhr.vars.xhr = false;
  }
  if (JXhr.vars.xhr) {
   JXhr.vars.xhr.onreadystatechange = JXhr.vars.onreadystatechange;
  }
 }
}
JXhr.prototype.open = function() {
 var openUrl = JXhr.vars.callUrl;
 if (JXhr.vars.method == "GET") {
  if (JXhr.vars.params != "") {
   openUrl += "?" + JXhr.vars.params;
  }
 }
 JXhr.vars.xhr.open(JXhr.vars.method, openUrl, JXhr.vars.async);
}
JXhr.prototype.send = function() {
 switch (JXhr.vars.method) {
 case "GET":
  JXhr.vars.xhr.send(null);
  break;
 case "POST":
  JXhr.vars.xhr.setRequestHeader("Content-type",
    "application/x-www-form-URLencoded");
  JXhr.vars.xhr.setRequestHeader("Content-length",
    JXhr.vars.params.length);
  JXhr.vars.xhr.setRequestHeader("Connection", "close");
  JXhr.vars.xhr.send(JXhr.vars.params);
  break;
 }
}
JXhr = new JXhr();
/*
 * <script type="text/javascript"> <!-- function getReadyStateChage () { if (
 * JXhr.vars.xhr.readyState == 4 ) { if ( JXhr.vars.xhr.status == 200 ||
 * JXhr.vars.xhr.statusText == "OK" ) { JXhr.vars.onresponse(); } else {
 * document.getElementById("divDebug").innerHTML = JXhr.vars.xhr.statusText + "<br>" +
 * document.getElementById("divDebug").innerHTML; } } }
 *
 * function getResponseData () { if ( JXhr.vars.responsedata == "XML" ) {
 * JXhr.vars.xhr.responseXML; } else { JXhr.vars.xhr.responseText; } }
 *
 * function run() { JXhr.vars.onreadystatechange = getReadyStateChage;
 * JXhr.vars.onresponse = getResponseData; JXhr.vars.method = "GET";
 * JXhr.vars.callUrl = "http://HOSTNAME/test.txt";
 * JXhr.vars.async = true; JXhr.vars.responsedata = "TEXT"; JXhr.vars.params =
 * "";
 *
 * JXhr.init(); JXhr.open(); JXhr.send(); } //--> </script>
 */

:

flickr 에 내 사진 세트 몽땅 날라 갔다.. 이거 어쩔거야..

Legacy 2010. 5. 10. 09:57
아침 부터 이렇게 황당할 수가..
flickr 에 6-7년간 정리해 놓은 나의 사진 세트들이 몽땅 다 날라갔다..
아주 최근에 올려 놓은 4개의 세트만 남아 있고 나머지는 홀라당..

이거 어쩔거야.. 누가 책임을 질거야.. 아 정말..
:

팝업 차단 alert 띄우기.

ITWeb/개발일반 2010. 5. 7. 20:31
내용에 오류가 있어서 수정 합니다.
크롬이 좀 문제가 있더군요.
크롬의 경우 팝업창을 차단 하기는 하지만 내부적으로 차단된 팝업창이 모두 로딩 된 상태로 유지 되기 때문에 모든 요소에 접근이 가능 하더군요.
왜 이렇게 만들었는지 짧은 생각으로는 사실 좀 이해가 안가긴 합니다.

var objWin = window.open(URL, WINDOWNAME, OPTIONS);
 
 if ( navigator.userAgent.indexOf("Chrome") > -1 ) {
   // chrome 의 경우 최초 한번은 감지가 가능 하나 두번째 부터는 이미 팝업창이 로딩된 상태이기 때문에 감지가 안됩니다.
 } else {
  // FF, IE, Safari, Opera 감지 가능
  if( typeof(win) == "undefined" || win == null || typeof(win.name) == "undefined"){
   alert("팝업 차단됨");
  }
 }

Chrome 의 경우 팝업차단 감지를 완벽하게 하는 방법을 아시는 분은 정보 공유 좀 부탁 드려요.. ^^;

Tip.
팝업차단은 사용자에 의한 1차 클릭과 액션에 의한건 모두 허용 됩니다.
다만 사용자의 1차 액션이후에 자동으로 발생 하게 되는 액션에 대해서는 모두 차단 됩니다.
역시 사용자의 액션이 아닌 자동으로 발생 하게 되는 액션에 대해서도 모두 차단 됩니다.

 



window.open 을 사용 하다 보면.. popup block 으로 정상적인 실행이 안될 때가 있죠..
이런 경우 popup block 에 예외 항목 등록을 해 달라는 alert 을 띄워 주면 단편적인 방법으로는 해결을 할 수 있을 듯 합니다.

각 브라우저 별로 popup block 방법이 좀 다릅니다.
아래 조건절 순서에 맞게 등록 하시면 거의 대부분 브라우저에서 alert 메시지를 띄울 수 있습니다.

테스트 브라우저 : IE, FF, CHROME, SAFARI, OPERA

var objWin = window.open(URL, WINDOWNAME, OPTIONS);

if ( typeof(objWin) == "undefined" ||
    objWin == null ||
    typeof(objWin.name) == "undefined" ||
    typeof(objWin.document.READATTR) == "undefined" ) {
    alert("팝업이 차단 되었습니다. \n ABCD.COM을 등록해 주세요.");
}

여기서 typeof(objWin.document.READATTR) 이 부분은 chrome 때문에 들어간 부분 입니다.
실제 chrome 에서는 objWin 이 object로, objWin.name 이 string 으로 objWin.document 가 object 로 return 해줍니다.
즉 window 객체는 가지고 있으나 실제 페이지 로딩은 되지 않았기 때문에 해당 페이지내 elements 나 attributes 를 read 하면 undefined 로 떨어집니다.
꼭 이렇게 해야 하는건 아니지만 이런 식으로 하면 된다 정도로 이해 하시면 될 것 같내요.. ㅎㅎ

위 코드는 팝업차단이 설정된 경우에만 테스트 된 코드 입니다.
팝업 차단이 해제된 경우에는 아직 테스트를 못한 코드이니 ㅎㅎ 감안하셔서 보세요.
:

탄천 점심 마실

Legacy 2010. 4. 23. 22:47
봄 맞이 팀 전체 탄천 점심 마실~
원본 사진 : http://www.flickr.com/photos/26089147@N00/sets/72157623895033542/

분명 초상권을 이유로 다들 싫어 할텐데.. 그럼에도... ㅎㅎ
아주 즐거운 한때를 보냈기에.. ^^*
가끔 이런것도 해야 직장 생활도 재밌고.. 얼마전에.. 분당 서현으로 망향비빔국수를 먹으러 13명이 차타고 뎅겨 왔다는..
담에는 좀 더 맛난 곳으로.. 고고씽을 해봐야 겠내요.

IMG_5384 IMG_5385 IMG_5386 IMG_5387 IMG_5388 IMG_5389 IMG_5390 IMG_5391
IMG_5392 IMG_5393 IMG_5394 IMG_5395 IMG_5396 IMG_5397 IMG_5398 IMG_5399
IMG_5400 IMG_5401 IMG_5402 IMG_5403 IMG_5404 IMG_5405 IMG_5406 IMG_5407
IMG_5408 IMG_5409 IMG_5410 IMG_5411 IMG_5412 IMG_5413 IMG_5414 IMG_5415
IMG_5416 IMG_5417 IMG_5418 IMG_5419 IMG_5420 IMG_5421 IMG_5422 IMG_5423
IMG_5424 IMG_5425 IMG_5426 IMG_5427 IMG_5428 IMG_5429 IMG_5430 IMG_5431
IMG_5432 IMG_5433 IMG_5434 IMG_5435 IMG_5436 IMG_5437 IMG_5438 IMG_5439
IMG_5440 IMG_5442 IMG_5443 IMG_5444 IMG_5445 IMG_5446 IMG_5447 IMG_5448
IMG_5449 IMG_5450 IMG_5451 IMG_5452 IMG_5453 IMG_5454 IMG_5455 IMG_5456
IMG_5457 IMG_5458 IMG_5459 IMG_5460 IMG_5461 IMG_5462 IMG_5463 IMG_5464
IMG_5465 IMG_5466 IMG_5467 IMG_5468 IMG_5469 IMG_5470 IMG_5471 IMG_5472
IMG_5473 IMG_5474 IMG_5475 IMG_5476 IMG_5477 IMG_5478 IMG_5479 IMG_5480
IMG_5481 IMG_5482 IMG_5483 IMG_5484 IMG_5485 IMG_5486 IMG_5487 IMG_5488
IMG_5489 IMG_5490 IMG_5491 IMG_5492 IMG_5493 IMG_5494 IMG_5495 IMG_5496
IMG_5497 IMG_5498 IMG_5499 IMG_5500 IMG_5501 IMG_5502 IMG_5503 IMG_5504
IMG_5505 IMG_5506 IMG_5507
: