Search Results for '프로그래밍'
1208 posts related to '프로그래밍'
- 2007/11/22 [소스] 이미지 미리 로딩시켜놓기
- 2007/11/22 [소스] 자막파일(.smi) 싱크밀고 당기기
- 2007/11/22 [소스] 쿠키1년간체크
- 2007/11/22 [소스] 체크한 것만 합계를 표시하는 스크립트
- 2007/11/22 [소스] 클릭시 화면이 위로 올라가는 현상 막아주기
- 2007/11/22 [소스] 클릭한 메뉴 고정하기
- 2007/11/22 [소스] 항상중심에레이어띄우기
- 2007/11/22 [소스] present[다음에서 발췌]
- 2007/11/22 [소스] SHIFT, CTRL, ALT 키를 막는 방법
- 2007/11/22 [소스] 간단한 퀵메뉴
- 2007/11/22 [소스] 링크클릭시 나타나는 점선 없애주기 1
- 2007/11/22 [팁] 타겟(target) 쓰는 법
- 2007/11/22 [소스] 실제 이미지 크기 알아내기
- 2007/11/22 [팁] iframe-사이즈 자동 조절
- 2007/11/22 익스플로러7 팝업창의 주소창 없애기
- 2007/11/22 asp에서 XML파서를 이용한 ajax 한글 처리 방법[펌]
- 2007/11/22 다음주 수요일 구하는 프로그램
- 2007/11/22 windows2003에서 ASP자료실 사용시 200k이상 업로드가
- 2007/11/22 WebEditor 1.53 Build 43
- 2007/11/22 위지윅 툴 추천 ^^
- 2007/11/22 ASP에서 간단히 엑셀/워드 파일 만드는 방법
- 2007/11/22 ASP 트랜잭션 처리
- 2007/11/22 ASP 에러 처리
- 2007/11/22 홈페이지 접속시 바탕화면 아이콘 만들기
- 2007/11/22 중복로그인 방지를 위한 얄팍한 방법
- 2007/11/22 로그인 중복 방지(필요하신 분들을 위해 잠시~)
- 2007/11/22 scriptX 무료기능을 이용한 print() 했는지 여부 확인
- 2007/11/22 Form 태그 공백 없애기
- 2007/11/22 파일객체의 찾아보기 버튼을 이미지로
- 2007/11/22 input type text 에서 refresh 막기
드림위버에 PreLoadImage라는 Behavior가 있는데 잠깐 소개하죠..
출처는 Macromedia사의 드림위버에 삽입된 Behavior 모듈임을 밝힘니다.
<script language="JavaScript" type="text/JavaScript">
<!--
function MM_preloadImages() { //v3.0
var d=document;
if(d.images){
if(!d.MM_p)
d.MM_p=new Array();
var i, j=d.MM_p.length, a= MM_preloadImages.arguments;
for(i=0; i<a.length; i++)
if (a[i].indexOf("#")!=0){
d.MM_p[j]=new Image;
d.MM_p[j++].src=a[i];
}
}
}
//-->
</script>
그리고 <body omload="MM_preloadImages('이미지1','이미지2','이미지3','이미지4','이미지5')">
나참..뭐 대단한 기능이 있다고...(하지만, 전 못만든다죠...^^)
그래서, 간단하게 자막의 싱크를 밀고 당기는 스크립트를 만들었다는...^^
<html><head>
<meta http-equiv="content-script-type" content="text/javascript">
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<meta http-equiv="content-style-type" content="text/css">
<meta http-equiv="content-language" content="ko">
<title> new document </title>
<script>
conv=function(sign){
var time=parseInt(mytime.value);
var src = mysource.value;
var re = /<SYNC Start=(\-?\d+)>/;
var cut = null, t;
while( cut = re.exec( src ) ){
t = time;
if(sign=='+') t = parseInt( cut[1] ) +t;
else t = parseInt( cut[1] ) - t;
src=src.replace(re,"<SYNC Start=+"+t+">");
}
mysource.value=src.replace(/(<SYNC Start=)\+(\-?\d+>)/g,"$1$2");
};
</script></head><body>
<textarea id="mysource" cols="50" rows="20">
<SYNC Start=2262><P Class=KRCC>
<font color=yellow size=14>'프렌즈'</font>
<SYNC Start=6111><P Class=KRCC>
<SYNC Start=7825><P Class=KRCC>
자막제작: 이X호(XXX@lamp.kaist.ac.kr)
<SYNC Start=11038><P Class=KRCC>
<SYNC Start=14510><P Class=KRCC>
출연: 제니퍼 애니스톤 (레이첼)
<SYNC Start=16390><P Class=KRCC>
<SYNC Start=17637><P Class=KRCC>
코트니 콕스 (모니카)
<SYNC Start=19235><P Class=KRCC>
</textarea><BR>
<INPUT id="mytime" TYPE="text" value="1000">
<button onclick="conv('+')">밀기</button>
<button onclick="conv('-')">당기기</button>
</body></html>
function setCookie( name, value, expire ) {
var today = new Date();
today.setDate( today.getDate() + expire );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + today.toGMTString() + ";"
}
function showOrgPage() {
if ( confirm( "Explorer 오류페이지로 전환 하시겠습니까?" ) ) {
setCookie( "isorgpage", "1", 31104000 ); // 1년간 체크
}
}
</script>
function sum(obj) {
var oColl = obj.form.elements;
var total = 0;
for (var i=0; i < oColl.length; i++) {
if (oColl[i].name.substr(0,4)=="item" && oColl[i].checked)
total += parseInt(oColl[i].price);
}
obj.form.total.value = total;
}
</script>
<form>
<input type=checkbox name=item1 price=100 onClick="sum(this)">100원짜리<br>
<input type=checkbox name=item2 price=120 onClick="sum(this)">120원짜리<br>
<input type=checkbox name=item3 price=150 onClick="sum(this)">150원짜리<br>
<input type=text name=total value=0 readonly>
</form>
이럴경우에 'href=#'으로 작업을 하게 되면 클릭시 화면이 상단으로 올라가는 현상이 일어납니다.
OnClick~ 끝 부분에 return false를 입력하여 주면 클릭시 그대로 화면이 멈추어진다.
<a href=# onclick="popup('링크','ntload',820,540); return false;" >
▶ 기능: 클릭한 메뉴 고정하기
---------------------------------------------------------------------------------------->
<html>
<head>
<title>http://www.01code.com[ 클릭한 메뉴 고정하기 ]</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr">
<link rel=stylesheet href="http://www.01code.com/ydhtml/01code.css" type=text/css>
<script language=javascript>
<!--
var FixPoint = ""; //고정된 메뉴 초기화
var muNum = 3; //메인 메뉴 개수
var imgDir = "http://www.01code.com/webedition/images/"; //이미지 경로
if(document.images)
{
mu_1_0_on = new Image(); mu_1_0_on.src = imgDir + "mu_1_0_on.gif"; mu_1_0_off = new Image(); mu_1_0_off.src = imgDir + "mu_1_0_off.gif";
mu_2_0_on = new Image(); mu_2_0_on.src = imgDir + "mu_2_0_on.gif"; mu_2_0_off = new Image(); mu_2_0_off.src = imgDir + "mu_2_0_off.gif";
mu_3_0_on = new Image(); mu_3_0_on.src = imgDir + "mu_3_0_on.gif"; mu_3_0_off = new Image(); mu_3_0_off.src = imgDir + "mu_3_0_off.gif";
}
function ImgOn(imgName){
if(document.images) document[imgName].src = eval(imgName + "_on.src");
}
function ImgOff(imgName)
{
if(document.images) document[imgName].src = eval(imgName + "_off.src");
}
function SetInit()
{
SetFix('');
}
function SetFix(SetPoint)
{
if(SetPoint != ""){ FixPoint = SetPoint; }
for(i=1; i<=muNum; i++){
var imgName = "mu_" + i + "_0";
if(FixPoint == imgName){ ImgOn(imgName); }else{ ImgOff(imgName); }
}
}
//-->
</script>
</head>
<body onLoad="SetFix('mu_1_0')">
<h4>[ 클릭한 메뉴 고정하기 ]</h4>
<a href="#" onfocus=blur() onMouseOver="ImgOn('mu_1_0');" onMouseOut="SetInit();" onClick="SetFix('mu_1_0')"><img border=0 name="mu_1_0" src="http://www.01code.com/webedition/images/mu_1_0_off.gif"></a>
<a href="#" onfocus=blur() onMouseOver="ImgOn('mu_2_0');" onMouseOut="SetInit();" onClick="SetFix('mu_2_0')"><img border=0 name="mu_2_0" src="http://www.01code.com/webedition/images/mu_2_0_off.gif"></a>
<a href="#" onfocus=blur() onMouseOver="ImgOn('mu_3_0');" onMouseOut="SetInit();" onClick="SetFix('mu_3_0')"><img border=0 name="mu_3_0" src="http://www.01code.com/webedition/images/mu_3_0_off.gif"></a>
</body>
</html>
<body onresize="javascript:centerWindow();" onload="centerWindow();">
<script language="JavaScript">
<!--
function centerWindow() {
var xMax = document.body.clientWidth, yMax = document.body.clientHeight;
var xOffset = (xMax-200)/2+20, yOffset = (yMax-150)/2+40;
//중심에서 오른쪽으로 20, 아래로 40픽셀에 항상 위치하는 레이어
var divMenu = document.all['Layer1'].style;
divMenu.top = yOffset;
divMenu.left = xOffset;
}
//centerWindow();
//-->
</script>
<p><div id="Layer1" style="position:absolute; left:200px; top:80px; width:200px; height:150px;
z-index:1">
<table width="200" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" bgcolor=#FFFFFF style="border:#808080 1px solid;" height=150>
<span style="font-family:굴림; font-size:9pt">항상 중심에 뜨는 <br>
레이어 샘플입니다.</span><br>
<img src="http://www.google.co.kr/images/logo_sm.gif" width="150" height="55" alt="배너">
</td>
</tr>
</table>
</div>
</body>
</html>
<!--
var kzone_gift=new Array();
var random_val=new Array();
var imgURL1=
"http://img.messenger.hanmail.net/images/messenger4/mileagegift/200509/";
var imgURL2= ".jpg";
var PRESENTLIST= 16;
for(var i=0; i<PRESENTLIST; i++){
var imgCNT= i + 1;
var temimg= "";
//if(i==5)
// temimg= "_1";
kzone_gift[i]= imgURL1 + imgCNT + temimg + imgURL2;
}
var swidth = 149
var sheight = 141
var show_items = 2
var stop_time = 1500 // 아이템 동작 텀 (1초 = 1000)
var sspeed = 20 // 아이템이 움직이는 시간
var sstep = 50 // 아이템이 픽셀 이동 간격
// 내부 변수
var new_item = show_items
var sstep_tmp = sstep
var only_one = 1;
function gift_left(){
sstep=100;
setTimeout("gift_left0()", 1000)
}
function gift_left0(){
sstep=5;
}
function random_start()
{
var len = kzone_gift.length;
if( only_one == 1){
for (i=0; i<len; ){
rand = parseInt(Math.random() * len );
// rand = i;
len2 = random_val.length;
for (j=0; j<len2 ; j++){
if(random_val[j] == rand)
break;
}
if( j == len2){
random_val[i] = rand;
i++;
}
}
only_one=2;
}
}
// 동작 시작 함수
function move_left_start()
{
for (i=0; i<=show_items; i++){
setTimeout("move_left("+i+", "+swidth+")", stop_time)
}
}
// 아이템 개별 이동 함수
function move_left(id, cnt){
obj = eval('slider_'+id)
obj.style.pixelLeft-=sstep
cnt -= sstep
if (cnt > 0){
setTimeout("move_left("+id+", "+cnt+")", sspeed)
}else if (obj.style.pixelLeft < -sstep){
obj.style.pixelLeft = show_items * swidth
new_item++
if (new_item == kzone_gift.length) new_item=0
obj.innerHTML= '<img src="'+kzone_gift[random_val[new_item]]+'"></a>';
move_left_start()
}
}
//-->
</script>
<table width="476" height="148" background="http://img.messenger.hanmail.net/images/messenger4/giftbg01.gif" border="0" cellpadding="0" cellspacing="0">
<tr>
<td valign="top" style="padding: 2,5,0,15">
<script language="javascript">
<!--
random_start();
move_left_start();
if (document.all){
document.writeln('<div align=center onmouseover="sstep=0;" onmouseout="sstep='+sstep_tmp+';" style="position:absolute;width:100%;height:'+(sheight)+';clip:rect(0 100% '+(sheight)+' 0); ">')
var tleft = 0
for (i=0; i <= show_items; i++) {
if (i > 0) {
tleft += eval('slider_'+(i-1)+'.style.pixelWidth')
}
document.writeln('<div align=center id="slider_'+i+'" style="position:absolute;left:'+i*swidth+';width:'+swidth+';top:1;">')
document.writeln('<img src="'+kzone_gift[random_val[i]]+'"></a>');
document.writeln('</div>')
}
document.writeln('</div>')
}else{
document.writeln('<br style="line-height:2px;">');
document.writeln('<table><td widht="20" nowrap> </td><td>');
for (i=0; i <3; i++) {
document.writeln('<img src="'+kzone_gift[random_val[i]]+'" height="140">');
}
document.writeln('</td></table>');
}
//-->
</script>
</td>
</tr>
</table>
event.shiftKey
event.altKey
event.ctrlKey
다른 키보드와 함께 이 SHIFT, CTRL, ALT키가 눌려졌는지 체크하려면 위에 언급한 속성들이 true인지를 체크만 하면 된다. 위의 예는 인터넷 익스플로러의 예이다. 넷스케이프에서는 modifiers란 하나의 속성에서 이 값들을 관리한다. 넷스케이프에는 Event 객체에 이와 관련한 다음과 같은 상수 값을 가지고 있다.
SHIFT_MASK
ALT_MASK
CONTROL_MASK
META_MASK
만일 넷스케이프에서 다른 키보드와 이 SHIFT, CTRL, ALT키가 눌려졌는지 체크하려면 비트와이즈(bitwise) AND 연산자를 사용하여 알아내면 된다. 예를 들어 ALT 키가 눌려졌는지 체크하려면 다음과 같이 하면 된다.
e.modifiers & Event.ALT_MASK
실제 예를 살펴보자.
<BODY ... onKeyPress="handlePress(event)">
<SCRIPT LANGUAGE="JavaScript">
<!--
function handlePress(e) {
var shiftPressed = (window.Event) ? e.modifiers & Event.SHIFT_MASK : e.shiftKey
if (shiftPressed) {
alert("현재 페이지에서 SHIFT키는 사용할 수 없습니다!");
return false;
}
else return true;
}
// -->
</SCRIPT>
...
...
</BODY>
위의 소스 코드에서 인터넷 익스플로러와 넷스케이프를 구분하는 코드는 '(window.Event) ?' 부분이다. 이 값이 참이면 넷스케이프이고 거짓이면 인터넷 익스플로러로 간주한다.
다른 ALT키와 CTRL키도 위와 같은 방법으로 잡아낼 수가 있다.
근데 아쉽게도 파폭에선 안되네요... 그동안 잘 안 쓴 이유도 그때문인데 그럼에도 불구하고 오늘 어떤 사이트에 적용했다가 (찾아보니 다른건 거의 플래시용이라) 팁으로도 올립니다.
그누에 적용하시려면 아래 소스를 따로 /g4/js/qmenu.js 등의 이름으로 저장한 다음
head.sub.php에서
<script language="javascript" src="<?=$g4['path']?>/js/common.js"></script>
<script language="javascript" src="<?=$g4['path']?>/js/ajax.js"></script>
<script language="javascript" src="<?=$g4['path']?>/js/qmenu.js"></script>
<body topmargin="0" leftmargin="0" <?=isset($g4['body_script']) ? $g4['body_script'] : "";?>>
<a name="g4_head"></a>
이런 식으로 추가해주면 됩니다.
///////////////여기부터 퀵메뉴 소스
document.write('<div id=floater style=\"position:absolute; left:1000px; top:300px; z-index:100;\">');
document.write('<a href=\"#g4_head\" onfocus="this.blur()">Top</a><br>');
document.write('<a href=\"javascript:history.go(-1)\" onfocus="this.blur()">Back</a></div>');
self.onError=null;
currentX = currentY = 0;
whichIt = null;
lastScrollX = 0; lastScrollY = 0;
NS = (document.layers) ? 1 : 0;
IE = (document.all) ? 1: 0;
<!-- STALKER CODE -->
function heartBeat() {
if(IE) {
diffY = document.body.scrollTop;
diffX = 0;
}
if(NS) { diffY = self.pageYOffset; diffX = self.pageXOffset; }
if(diffY != lastScrollY) {
percent = .1 * (diffY - lastScrollY);
if(percent > 0) percent = Math.ceil(percent);
else percent = Math.floor(percent);
if(IE) document.all.floater.style.pixelTop += percent;
if(NS) document.floater.top += percent;
lastScrollY = lastScrollY + percent;
}
if(diffX != lastScrollX) {
percent = .1 * (diffX - lastScrollX);
if(percent > 0) percent = Math.ceil(percent);
else percent = Math.floor(percent);
if(IE) document.all.floater.style.pixelLeft += percent;
if(NS) document.floater.top += percent;
lastScrollY = lastScrollY + percent;
}
}
if(NS || IE) action = window.setInterval("heartBeat()",1);
////////////여기까지
function autoblur() {
if(event.srcElement.tagName == "A") document.body.focus();
}
document.onfocusin = autoblur;
g4/js/common.js 맨아래에 위의 내용을 추가해줍니다.
(익스플로러에서만 되내요)
1. frame_name.location = 'url.php';
또는 frame_name.location.href = 'url.php';
또는 frame_name.location.replace('url.php')
2. parent.frame_name.location = 'url.php';
3. opener.parent.frame_name.location = 'url.php';
새창을 열게해준 창의 주소를 바꾸고 새창을 끈다.
<script>
opener.location.href = 'url.php';
self.close();
</script>
새창을 열게해준 창의 주소를 새로고침하고 새창을 끈다
<script>
opener.location.reload();
self.close();
</script>
다른 프래임의 주소를 바꾸게 하려면
<script>
frame_name.location.href = 'url.php';
</script>
프래임 구조상 상위 프래임의 주소를 바꾸게 하려면
<script>
parent.location.href = 'url.php';
</script>
타겟이 지정된 프레임을 바꾼다.(타겟하나)
<script>
parent.target(타겟).location.href = 'url.php';
</script>
타겟이 지정된 프레임을 바꾼다.(타겟둘)
<script>
parent.target1(타겟1).location.href = 'url1.php';
parent.target2(타겟2).location.href = 'url2.php';
</script>
타겟이 지정된 프레임을 바꾼다.(타겟셋)
<script>
parent.target1(타겟1).location.href = 'url1.php';
parent.target2(타겟2).location.href = 'url2.php';
parent.target3(타겟3).location.href = 'url3.php';
</script>
타겟이 지정된 프레임두개를 클릭으로 바꾸려면
<script>
function target_frame(url1, url2)
{
parent.top_frame.location.href = url1;
parent.main_frame.location.href = url2;
}
</script>
<a href="javascript:target_frame('main_menu.html', '$go_url');"> 확인 </a>
로그인페이지 에선
<script>
parent.top_frame.location.href = '../main.html'; //main.html는 로그인페이지 보다 상위디렉토리에 있다.
parent.main_frame.location.href = '$go_url';
</script>
로그인페이지를 새창으로 띄웠다면
<script>
opener.parent.top_frame.location.href = '../main.html';
opener.parent.main_frame.location.href = '$go_url';
self.close();
</script>
[펌] http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=5317&sfl=&stx=&sst=wr_hit&sod=desc&sop=and&page=36
<script language=javascript>
function get_image_size(id) {
img = document.body.appendChild(document.createElement('img'))
img.src = id.src;
var w = img.offsetWidth;
var h = img.offsetHeight;
document.body.removeChild(img);
return {width:w,height:h};
}
function how_size(img) {
var size = get_image_size(img);
alert('width:'+size.width+',height:'+size.height);
}
</script>
<iframe src="sub_4_1.php" frameborder="0" width="620" name="youknow" scrolling="no"></iframe> <--iframe name 설정
불러올 페이지
<script>
function initsize() {
self.resizeTo(document.body.scrollWidth, document.body.scrollHeight);
}
</script>
<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" onLoad="initsize();">
설정
-----------------------------------------------------------------------------------
수정~
<script>
function initsize() {
self.resizeTo(document.body.scrollWidth , document.body.scrollHeight + 10);
}
</script>
<body topmargin="0" leftmargin="0" marginwidth="0" marginheight="0" onLoad="initsize();">
newWin = window.open(""+url+"","show","width="+width+",height="+height+",toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars="+scrollbars+",resizable=no");
}
요즘 ajax를 좀끄적이다 보니 괜찮은 자료가 있어서 올려놓는다..
좋은 자료인거같다.. 샘플구하기가 쉽지많은 않다..
//XMLHttpRequest 객체생성
var oXmlHTTP = getXmlHttp();
if (window.XMLHttpRequest)
{
oXmlHttp = new XMLHttpRequest();
}else{
oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
oXmlHTTP.open("POST", "AJAX.asp", false); // 동기방식으로 연결
//리퀘스트 내용을 XML문자열로 만든다. ASP는 기본적으로 EUC-KR로 처리하기 때문에 따로 정의할필요는 없습니다.
//한글을 전송할때는 태그내용을 <![CDATA[ ]]>로 선언해야 합니다.
var strXML = "";
strXML = strXML + "<gwinaemi>";
strXML = strXML + "<strList><![CDATA[내용]]></strList>";
strXML = strXML + "</gwinaemi>";
//리퀘스트 전송
oXmlHTTP.send(strXML);
//받아온 XML문자열에서 에서 strList태그의 내용을 추출 viewText객체의 innerHTML 로 넣는다.
eId("viewText").innerHTML = oResXML.getElementsByTagName("strList").item(0).firstChild.nodeValue;
--------------------------------------------------------------------------------------------------------------
'''''AJAX.asp파일쪽의 처리
'''''받아온 XML문자열을 Request.BinaryRead로 읽어서
'''''microsoft.xmldom 파서로 읽어 Scripting.Dictionary객체로 반환
'''''필요한 리퀘스트 내용은 딕셔너리에서 호출한다.
Dim vntPostedData, lngCount
lngCount = Request.TotalBytes
vntPostedData = Request.BinaryRead(lngCount)
Dim oXMLDom
Set oXMLDom = Server.CreateObject("microsoft.xmldom")
oXMLDom.load(vntPostedData)
Dim oDicXMLRequest
set oDicXMLRequest = Server.CreateObject("Scripting.Dictionary")
If oXMLDom.parseError = 0 Then
Dim objNode
Set objNode = oXMLDom.documentElement
set oXMLDom = nothing
Dim i
For i = 0 To objNode.childNodes.length - 1
oDicXMLRequest.Add objNode.childNodes.Item(i).nodeName, objNode.childNodes.Item(i).Text
Next
set objNode = nothing
else
set oXMLDom = nothing
End if
Response.ContentType = "text/xml"
Response.Charset = "ks_c_5601-1987"
''''''''''''''''XML문서의 형태로 돌려보낸다. encoding을 ASP의 기본엔코딩인 ks_c_5601-1987로 지정한다.
Response.write "<?xml version=""1.0"" encoding=""ks_c_5601-1987""?>" & chr(13) & chr(10)
''''''''''''''''oDicXMLRequest에서 strList의 내용을 불러낸다.
Response.write "<gwinaemi><strList><![CDATA[" & oDicXMLRequest("strList") & "]]></strList></gwinaemi>"
<%
'// 수요일 구하는 프로그램
SELECT Case Weekday(Now)
Case "1" '// 일요일
tmp = 3
Case "2" '// 월요일
tmp = 2
Case "3" '// 화요일
tmp = 1
Case "4" '// 수요일
tmp = 0
Case "5" '// 목요일
tmp = 6
Case "6" '// 금요일
tmp = 5
Case "7" '// 토요일
tmp = 4
End Select
Response.Write tmp & "<br>"
If tmp = 0 Then '// 수요일이므로 해당사항 없음
newDate = Now()
LastDate = DateAdd("d",2,newDate) '// 금요일 구하기
Else
newDate = DateAdd("d",tmp,Now())
LastDate = DateAdd("d",2,newDate) '// 금요일 구하기
End If
Response.Write NewDate
%>
'// 매주 수요일 구하는 프로그램 따라해 봅시다~
C:\WINDOWS\system32\inetsrv\MetaBase.xml
886라인에 보면..기본값으로..
AspMaxRequestEntityAllowed="204800"으로 되어있습니다.
단위는 byte단위죠. 즉 200k..
이 값을 변경시켜주면. 200k이상도 업로드가 됩니다
1.관리도구->서비스에서->IIS Admin Service를 중지시킵니다.(HTTP,SMTP등 서비스가 같이 중단됨)
2.C:\WINDOWS\system32\inetsrv\MetaBase.xml를 편집기(메모장등)으로 열고.
886라인 또는 Ctrl+F로 찾기로.. AspMaxRequest로 검색하면,
AspMaxRequestEntityAllowed="204800"이 숫자값을 변경시켜주시면 됩니다.
2메가 로 하시려면, 2048000으로 하시면 되구요. 적당히.. 변경해주시면 됩니다.
수정하시고, 저장합니다. 저장이 안되면, 1번과정을 해주세요.
3. 서비스에서 IIS Admin Service를 다시 시작합니다.
iis를 열어서.. 웹서비스,SMTP등을 시작하십시오..
이제 자료실 파일 첨부시, 200k 이상이 잘 됩니다..
|
예 : 웹문서 루트디렉토리(이하 루트, 최초 index.html 파일이 위치한 곳)에다가 복사
또한 거의 모든 디렉토리 설정은 루트를 기준("/")으로 설정을 합니다.
- class.WebEditorGenerator.js을 오픈을 합니다. (모든 설정은 이 파일에서 할수 있습니다.)
/////////////////////////////////////////////////////////////////////////////////////////////////
// config Start
/////////////////////////////////////////////////////////////////////////////////////////////////
// Basic Directory
var WebEditor_Basic_Dir = '/WebEditor'; -- ①
// Basic Btn Lists
// '|' is separator
// '-' is new line
var WebEditor_Btns = {
'Basic' :['Source','|','Cut','Copy','Paste','|','Undo','Redo','|','Bold',....
'Extend' :['FontName','FontSize','ForeColor','BackColor','|','CreateLink',...
'Advanced' :['Table','TableProperties','TdProperties','|',...
};--②
// Emoticon Popup Size(Width, Height);
var WebEditor_Emoticon_popup_size = new Array("700px", "500px");--③
// Emoticon Icon Directory
var WebEditor_Emoticon_Dir = WebEditor_Basic_Dir + "/emoticon/fun";--④
// Emoticon Icon, Row Print Icon Number;
var WebEditor_Emoticon_Num = 10;--⑤
// UpLoad Directory
var WebEditor_Upload_Dir = '/_data/user_imgs';--⑥
// UpLoad Size
var WebEditor_Upload_Size = 2048; // KB (1MB = 1024KB)--⑦
// User CSS & Preview CSS
var WebEditor_User_CSS = '/css/style.css';--⑧
// P tag to br tag
var WebEditor_Convert_Tag_P = true;--⑨
/////////////////////////////////////////////////////////////////////////////////////////////////
// End
/////////////////////////////////////////////////////////////////////////////////////////////////
① WebEditor가 위치한 디렉토리 (예 : "/WebEditor")
② 툴바에 포함된 버튼 리스트 편집
'|' -> 세로 구분자
'Basic', 'Extend', 'Advanced' 는 행을 나타냅니다. 각행에 포함된 버튼들은 서로 다른행으로 이동가능합니다.
'About' 는 삭제를 하실 수 없습니다. (위치 변경은 가능합니다.)
③ 이모티콘 팝업 사이즈를 설정 (가로픽셀, 세로픽셀)
④ 이모니콘 디렉토리 위치를 설정 (해당디렉토리의 모든 이미지파일을 이모티콘으로 쓸수 있습니다.)
⑤ 한줄에 출력되는 이모티콘의 개수를 설정을 합니다.
⑥ 이미지 삽입시 업로드를 할 경우 업로드 디렉토리를 설정을 합니다. 역시 루트부터 시작을 하며,
타인에 대해 쓸수 있도록 퍼미션 설정을 하셔야 합니다.
가령 /data 가 파일을 저장하는 공간이라면 var WebEditor_Upload_Dir = '/data';입니다.
* upload directory 는 서버에 관련된 부분이므로 user의 게정에 따라 다릅니다. 설정에러가 날경우는. 질/답란에 질문을 올려 주세요
⑦ 업로드 할 수 있는 사이즈를 결정합니다. (KB 단위 | 1메가(MB) = 1024KB) 입니다.
⑧ WebEditor과 미리보기시 적용할 스타일 시트를 설정합니다.
⑨ 엔터키 입력시 2줄 이면 false, 한줄이면 true
지금부터는 WebEditor를 삽입해 보도록 하겠습니다.
- 루트의 /test/test.html 에 삽입을 한다면.
- test.html을 오픈을 합니다.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Untitled Document</title>
<script language="javascript" src="/WebEditor/class.WebEditorGenerator.js"></script>
</head>
<body>
</body>
</html>
<textarea id='WebEditor'>TEST</textarea>
<script language="javascript">
var e = new WebEditorGenerator('WebEditor', "100%", "200px");
e.generate();
</script>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Untitled Document</title>
<script language="javascript" src="/WebEditor/class.WebEditorGenerator.js"></script>
</head>
<body>
</body>
</html>
<textarea id='WebEditor'>TEST</textarea>
<script language="javascript">
var e = new WebEditorGenerator('WebEditor');
e.generate();
</script><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<title>Untitled Document</title>
<script language="javascript" src="/WebEditor/class.WebEditorGenerator.js"></script>
</head>
<body>
</body>
</html>
<textarea id='WebEditor'>TEST</textarea>
<script language="javascript">
(new WebEditorGenerator('WebEditor')).generate();
</script>
이제는 브라우져를 통해서 확인하실 수 있습니다.
개발자를 위한 몇 가지 메소드
WebEditor는 사용 편의상 몇가지 외부에 제공되는 메소드를 포함합니다.
WebEditor의 값을 얻는다거나 또는 TEXTAREA로의 변경 및 focus 이동등을 하실 수 있습니다.
또한 WebEditor 값을 확인하여 자바스크립트의 값 체크등으로 사용하실 수 있습니다.
void WebEditorGenerator(String id, Int width, Int height) |
|
void generate(void) |
|
void setMode(String sMode) |
|
String getMode(void) |
|
String getValue(void) |
|
void focus(void) |
|
출처 - http://home.mytnt.co.kr
홈페이지 http://www.interspire.com/devedit/
데모 http://www.interspire.com/devedit/demo.php
CHEditor (쓸만한데 설치 하는데 좀 막히는 부분이 있다.)
홈페이지 http://www.chcode.com
데모 http://www.chcode.com/cheditor/demo.html
WebEditor V 1.53 Build 41 (마우스 오른쪽으로 테이블, 이미지등 편집 가능. 쓸만하다.)
홈페이지 http://mytnt.co.kr/
데모 http://mytnt.dnip.net:8080/develop/?p=preview (늦게 뜨면 아래 링크 사용)
데모 http://web.gso.co.kr/~sea88/bbs/WebEditor/example.html
basic (쓸만함 HTMLarea와 비슷하다.)
홈페이지 http://www.basic.pe.kr/
데모 http://www.basic.pe.kr/bbs/zboard.php?id=basic_board (자게 글쓰기 클릭)
데모 http://web.gso.co.kr/~sea88/bbs/zboard.php?id=community (우리집 게시판중에 수정해서 쓰고있음. 글쓰기 클릭)
FCKeditor (걍 그저 그렇습니다. 근데 글자 색은 바꿀수 없는거야?)
홈페이지 http://sourceforge.net/projects/fckeditor
데모 : http://www.fredck.com/FCKeditor/Demo/
HTMLarea (가장 많이 쓰는것 같습니다. 쓸만함. htmlarea 3.0 버전은 모질라에서도 익스랑 똑같이 작동 한답니다.)
홈페이지 http://sourceforge.net/projects/itools-htmlarea
데모 : http://www.interactivetools.com/products/htmlarea/index.html#demo
SPAW (보기는 좋지만...엄청 늦게 떠서 탈....약간 비추.)
홈페이지 http://sourceforge.net/projects/spaw/
데모 : http://www.solmetra.com/spaw/demo/demo.php
hypertextare (버튼이 묵직한것이...아마고쳐 써야 할듯...에러의 압박. 비추비추)
홈페이지 http://sourceforge.net/projects/hypertextarea
데모 : http://www.muckum.de/ht
RichText-editor (그저 그렇다. 비추비추비추)
홈페니지 http://sourceforge.net/projects/richtext
데모 : http://richtext.sourceforge.net
aynHTML (소스 보기 하니 컬러로 나옵띠다. ;; 따운 받는데가 어딘지...)
홈페이지 http://sourceforge.net/projects/aynhtml
데모 : http://www.aine.be/aynhtml
web-based WYSIWYG HTML editor (아직 안써봤는데 스샷으로 대신...)
스샷,다운 http://www.unica.edu/uicfreesoft/wysiwyg_web_edit/info_wysiwyg_web_edit_eng.html
RichTextBox™ v2.0
홈페이지 http://richtextbox.com/Default.aspx
데모 http://richtextbox.com/richtextbox/demos/0/
XsDhtmlEdito (이건 안써봐서 모름)
홈페이지 http://sourceforge.net/projects/xsdheditor
데모 없음
bpEditor (이것도 안써봤는데....)
홈페이지 http://sourceforge.net/projects/bpeditor
ASP를 이용하여 엑셀 파일을 만드는 방법에는 여러 가지가 있다. 여기에는 웹 서버 쪽에서 작업을 하게 하는 방법도 있고, 클라이언트 쪽에서 작업을 하게 하는 방법이 있다. 이 중 여기서는 클라이언트 쪽에서 작업을 하게 하는 방법에 대해 살펴볼 것이다. 이 방법은 아주 간단하면서도 필요할 경우 유용하게 사용할 수 있다.
이 강좌의 내용을 배우고 나면 다음과 같은 결과물을 만들 수 있을 것이다.
우선 해야할 일은 엑셀 파일에 삽입할 표를 하나 만드는 것이다. 다음과 같은 내용이 들어 있는 HTML 코드를 작성해 보도록 하자.
회사 주소록
ASP에서 엑셀 파일을 만드는 방법에 대한 예제입니다.
날짜 | 이름 | 내선번호 | 부서 | 주소 |
---|---|---|---|---|
2001.08.01 | Daniel Joe | 4286 | 미디어 사업부 | 서울시 서초구 서초동 1306-6 |
2001.08.02 | Peter Lee | 4285 | 연구소 | 서울시 서초구 방배 2동 1234-56 |
2001.08.14 | Tapestry | 4280 | 전략 기획실 | 경기도 과천시 원문동 2번지 |
이제 위에서 작성한 HTML 태그 앞에 다음과 같은 ASP 코드를 삽입하도록 하자.
<% |
이렇게 해서 만들어진 결과물은 다음과 같다:
엑셀 프로그램이 설치되어 있을 경우 위 링크를 클릭하면 브라우저 상에서 직접 엑셀 파일로 열어볼 수가 있다. 만일 설치되어 있지 않다면 클라이언트 컴퓨터로 다운로드 받을 수 있다. 이렇듯 웹 페이지의 내용을 동적으로 엑셀 파일로 만들어 낼 수가 있다.
이렇게 해서 실행된 결과 화면은 다음과 같다:
이와 관련된 전체 ASP 코드를 살펴 보면 다음과 같다:
<% |
마찬가지로, ASP 코드로 삽입된 MIME 타입을 약간만 수정하면 웹 페이지의 내용을 워드 파일이나 파워포인트 파일로 생성해 낼 수 있다.
워드 파일 <% 파워 포인트 파일 <% |
위의 MIME 타입을 바꾼 결과를 직접 확인하려면 아래 링크를 클릭해 보기 바란다.
지금까지 살펴 본 방법은 응용하기에 따라 간단하면서도 유용한 팁이 될 수 있다. 만일 데이터베이스와 결합하여 사용한다면 좀 더 유용할 것이다.
지금 현재 보고 있는 웹 페이지 앞 부분에 Response.ContentType = "application/msword" 부분만 삽입하여 동적으로 워드 파일을 만든 결과는 다음과 같다.
<object runat="server" progid="ADODB.Recordset" id="rs"></object>
<object runat="server" progid="ADODB.Recordset" id="oRs"></object>
<object runat="server" progid="ADODB.Connection" id="dbCon"></object>
<object runat="server" progid="CDONTS.NewMail" id="objMail"></object>
<%
Response.Expires = -1
Response.AddHeader "Pragma", "no_cache"
Response.AddHeader "cache-control", "no_cache"
Const dbConStr = "Provider=SQLOLEDB.1;Initial Catalog=BIZ_INFO;Data Source=localhost;User ID=User;PWD=PW"
dbCon.Open("dbConStr")
dbCon.BeginTrans '트랜잭션을 시작
SQL = "insert into office(idx, o_name,addr) values "
SQL = SQL & " (" & request("id") & ""
SQL = SQL & ",'" & request("name") & "'"
SQL = SQL & ",'" & request("addr") & "'"
dbCon.execute SQL
If dbCon.errors.count > 0 then
dbCon.RollbackTrans '에러일 경우 이전상태로 복구
Response.write "<script language='javascript'>"&chr(13)
Response.write " alert('데이터를 저장하는중 에러가 발생하였습니다.\n관리자에게 문의하시기 바랍니다.');"&chr(13)
Response.write " history.back();"&chr(13)
Response.write "</script>"&chr(13)
dbCon.Close
Response.end
Else
dbCon.CommitTrans '에러가 없을 경우 완료
Response.write "<script language='javascript'>"&chr(13)
Response.write " alert('데이터가 성공적으로 처리되었습니다.');"&chr(13)
Response.write "</script>"&chr(13)
dbCon.Close
End If
Response.Redirect "office_list.asp
%>
◇ ASP에러 처리의 처음과 끝
JSP가 갖고 있는 장점중의 하나가 Exception(Error)처리가 뛰어 나다는 것입니다. 철저한 Exception Class를 상속해 가면서 마치
작은 그물에서 큰 그물로 이어가는 에러 처리 기법은 프로그래머를 매우 정신적으로 여유있게 해주는 기능 중에 하나 입니다.
ASP의 경우 3.0으로 업그레이드 되면서 ASPError객체를 제공함으로써 기존의 Err객체의 단점을 개선하기는 했지만 이 역시도
내부서버오류 앞에서는 전혀 무용지물입니다.
아쉽지만 그래도 에러를 잡아 낼 수 있는 방법이 무엇이 있는지 알아 보도록 하겠습니다.
(참고로 자바스크립트 에러는 웹브러우저가 자동으로 에러를 찾아 줍니다.)
1. Response.End를 이용한 에러 잡아 들이기
에러를 잡는 가장 고전적인 방법입니다.
ASP코드의 중간에
Response.Write "여기 까지는 이상이 없습니다." Response.End |
라고 사용하면 에러가 발생되는 라인을 알아 낼 수 있는 방법입니다.
하지만 이 방법은 프로그램의 라인이 많으면 반복해서 사용해야 함으로 효율이 떨어지고 IE의 버퍼에
문제 있는 코드가 있다면 계속 오류 발생하여 버퍼를 다 지우고 IE를 모두 닫았다가 열어야 하는 번거로움이 있습니다.
하지만 위의 방법은 가장 간단하고 별 다른 코드 입력이 없기 때문에 아직도 많이 쓰여지고 있습니다.
특히 SQL문 실행 과정에서 에러가 나는 부분은 아래처럼 함으로 확인 할 수 있습니다.
esponse.Write sql Response.end |
2. Err객체를 이용한 에러 처리하기
아래와 같이 에러가 있는 파일을 작성합니다.
Err.asp로 저장하고 불러 옵니다. <HTML><BODY> |
위의 에러의 경우 전 두대의 컴퓨터로 테스트를 해보았습니다.
서버상에서의 결과 화면
다른 클라이언트에서의 결과 화면 입니다.
같은 에러에 대해서 다른 화면이 보이고 있습니다. 어떤 때는 에러의 원인이 보이고 어떤 때에는
골치아픈 HTTP 500 내부 서버 오류가 나오고 있습니다. IIS를 정지하고 버퍼를 지우고 다 해보았지만 결과는 같았습니다.
위의 경우 해결 방법은 Response.end를 중간 중간에 심어서 테스트 하는 1번의 방법을 이용하면 찾아 낼 수 있습니다.
이런 상황이 계속 되면 성질 급한 사람은 포기를 하던 아니면 오기로 매달리는 겁니다.밤 새도록...
이번에는 Err객체를 이용해서 에러를 잡아 보겠습니다. 아래의 소스처럼 수정하고 실행시킵니다.
Err2.asp로 저장하고 불러 옵니다. <% su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2 Response.Write "두수의 더하기 : " & hap & "<BR>" If Err.Number > 0 then %> </BODY></HTML> |
아래는 2대의 컴퓨터의 결과 화면입니다. 자세히 원인은 모르지만 페이지 자체적으로 Err객체는 에러를 알아 내고 있습니다.
Option Explicit 는 변수 선언 확인문 입니다. 선언되지 않은 변수는 사용할 수 없어서 변수로 인한 오류를 막을 수 있는좋은 방법입니다.
On Error Resume Next문은 에러가 나도 계속 진행하라는 선언문입니다. 그래야 에러 원인을 알 수 있습니다.
Err.Number는 에러가 난 갯수를 갖고 있는 객체 입니다. 따라서 에러가 발생하면 에러 갯수로 에러를 알 수 있습니다.
Err.Clear는 반드시 선언해야 합니다. 에러를 Err객체 목록에서 지우는 역활을 합니다.
아래와 같이 소스를 수정하고 테스트 합니다.
Err3.asp로 저장하고 불러 옵니다. <% su1=100 : su2=0 : hap=su1+su2 : div = su1 / su2 Response.Write "두수의 더하기 : " & hap & "<BR>" If Err.Number > 0 then %> </BODY></HTML> |
결과는 아래와 같습니다. 좀더 자세한 결과가 출력 되었습니다.
Err객체의 경우 어느 라인에서 에러가 났는지 알아낼 방법이 없습니다.
3. IE의 기능을 이용한 에러 잡기(HTTP 500 내부서버 오류 잡아냄)
아래처럼 소스를 작성하고 IE에서 확인 합니다. ("%>" ASP표식이 빠져있습니다.)
Err4.asp로 저장하고 불러 옵니다. <HTML><BODY>
|
아래는 결과 화면입니다. 역시 HTTP 500 - 내부 서버 오류가 뜹니다.
IE를 열고 [도구]메뉴의 [인터넷 옵션]을 클릭합니다.
[고급]탭의 [HTTP 오류 메시지 표시] 체크를 풀어 줍니다.
[확인]을 누르고 페이지를 다시 불러 온 결과입니다. 내부 서버 오류의 원인이 보이고 있습니다.
이 방법은 DB관련 내부서버 오류도 잡아 내는 기능을 갖고 있습니다.
위의 방법 중에서 3번이 가장 정확히 HTTP 500 - 내부 서버 오류를 찾아 냈습니다. 3번의 방법은 한번만 설정해 두면 편리할 것입니다.
평상시에 Option Explicit문을 선언하는 습관을 갖으셨으면 좋겠습니다.
그리고 Err객체도 완전한건 아니지만 많은 도움이 될 것입니다.
4. IIS에 사용자가 에러 페이지 만들어 추가하기
1. 아래의 내용을 error500.asp 로 해서 IIS 기본 웹사이트에 등록할 경우 c:\winnt\Help\iisHelp\common폴더에 저장합니다.
<%Set objError = Server.GetLastError%>
<html>
<body bgcolor=#fcffef>
<h4>에러 이름 : 500 내부 서버 오류입니다.</h4>
<hr>
ASPError.Number : 0x<%= Hex(objError.Number) %><br>
<font color="red">
ASPError.Source : <%= Server.HTMLEncode(objError.Source) %><br>
</font>
ASPError.Category : <%= objError.Category %><br>
ASPError.File : <%= objError.File %><br>
<font color="blue">
ASPError.Line : <%= objError.Line %><br>
ASPError.Column : <%= objError.Column %><br>
</font>
ASPError.Description : <%= objError.Description %><br>
<hr>
<input type="submit" value="다시 읽기" onclick="location.reload()">
<input type="submit" value="돌아가기" onclick="history.back()">
</body>
</html>
2. 에러를 적용하려는 프로젝트를 선택하고 [등록정보]로 들어갑니다.
3. [사용자 정의 오류]탭을 선택하고 500;100을 선택하고 [등록 정보 편집] 버튼을 클릭합니다.
4. 메시지 형식을 [URL]로 바꿉니다.
5. 메시지 형식을 URL로 지정하고 URL은 같은 사이트의 가상 디렉토리를 지정합니다.
실제로 저는 기본 웹사이트를 사용함으로 IIS에서 열어보면 [/IISHelp/common/]이라는 폴더를 발견할 수 있습니다.
이 가상 디렉토리는 실제로 c:\winnt\Help\iisHelp\common로 매핑 되어 있습니다.
6. 정상적으로 등록된 것이 보입니다.
7. 잘못된 ASP파일을 작성합니다. test.asp로 저장합니다.
<%
option explicit
Dim str
str = "<body>안녕하세요..?"
& " 반갑습니다."
Response.Write str
%>
8. 에러 원인이 자세하게 출력 되었습니다.
9. 에러를 수정하고 다시 읽기 버튼을 누르면 결과가 제대로 보입니다.
수정된 test.asp파일
<%
option explicit
Dim str
str = "<body>안녕하세요..?" _
& " 반갑습니다."
Response.Write str
%>
10. 정상적으로 출력 되었습니다.
약간의 꽁수로 자신의 홈페이지에 방문하는 분들에게 내 홈의 아이콘을
|
허접이긴 한데요... 그래도 중복로그인을 어느정도는 차단할 수 있는 것 같기에 제 경험을 올려봅니다.
아니다 싶으면 과감하게 꾸짖어주세요..
맨처음 드리고 싶은 말씀은 중복로그인을 막으려면 일단 ActiveX를 통해서 처리할 수 밖에는 없다는 것을 말씀드리고 싶습니다.
그것은 ASP 에서는 Global.asa 에서 Session_OnEnd 이벤트를 통해서 세션종료를 처리하는데 웹사이트에서 로그아웃을 하지 않고 웹브라우저를 종료했을때는 일단 종료한 시점부터 Session.TimeOut 으로 설정한 시간동안 유저의 이벤트가 없는 것으로 처리해서 그 시간이 지나야만 세션을 종료처리합니다.
따라서 Session.TimeOut 에서 30분으로 설정한다면 30분동안 재접속할때는 그것이 중복로그인인지 정상로그인인지 파악이 안된다는 것이지요.
그래서 저는 ActiveX를 통해서 다음의 두가지 기능을 추가했습니다.
하나는 사용자의 랜카드 mac address를 가져와서 체크하는 것이고요.
다른 하나는 Inet 방식으로 ActiveX에서 웹서버의 특정파일에 POST 방식으로 정보를 보내는 것입니다.
먼저 랜카드 mac address를 가져오는 것입니다.
다음은 모듈부분입니다.
-----------------------
Option Explicit
Option Base 0
Private Declare Function GetNetworkParams Lib "IPHlpApi" (ByRef pFixedInfo As Any, ByRef pOutBufLen As Long) As Long
Private Declare Function GetAdaptersInfo Lib "IPHlpApi" (IpAdapterInfo As Any, pOutBufLen As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Const ERROR_BUFFER_OVERFLOW = 111&
Private Const MAX_ADAPTER_NAME_LENGTH As Long = 260
Private Const MAX_ADAPTER_ADDRESS_LENGTH As Long = 8
Private Const MAX_ADAPTER_DESCRIPTION_LENGTH As Long = 132
Private Const DEFAULT_MINIMUM_ENTITIES As Long = 32
Private Const MAX_HOSTNAME_LEN As Long = 128
Private Const MAX_DOMAIN_NAME_LEN As Long = 128
Private Const MAX_SCOPE_ID_LEN As Long = 256
Private Const MIB_IF_TYPE_OTHER As Byte = 1
Private Const MIB_IF_TYPE_ETHERNET As Byte = 6
Private Const MIB_IF_TYPE_TOKENRING As Byte = 9
Private Const MIB_IF_TYPE_FDDI As Byte = 15
Private Const MIB_IF_TYPE_PPP As Byte = 23
Private Const MIB_IF_TYPE_LOOPBACK As Byte = 24
Private Const MIB_IF_TYPE_SLIP As Byte = 28
Private Type typIPStrs
tNext As Long
IpAddress As String * 16
IpMask As String * 16
Context As Long
End Type
Private Type typFixedInfo
Hostname As String * 132
DomainName As String * 132
CurrentDnsServer As Long
DnsServerList As typIPStrs
NodeType As Long
ScopeId As String * 260
EnableRouting As Long
EnableProxy As Long
EnableDns As Long
End Type
Private Type typIpAdapterInfo
tNext As Long
ComboIndex As Long
AdapterName As String * MAX_ADAPTER_NAME_LENGTH
Description As String * MAX_ADAPTER_DESCRIPTION_LENGTH
AddressLength As Long
Address(MAX_ADAPTER_ADDRESS_LENGTH - 1) As Byte
Index As Long
tType As Long
DhcpEnabled As Long
CurrentIpAddress As Long
IpAddressList As typIPStrs
GatewayList As typIPStrs
DhcpServer As typIPStrs
HaveWins As Boolean
PrimaryWinsServer As typIPStrs
SecondaryWinsServer As typIPStrs
LeaseObtained As Long
LeaseExpires As Long
End Type
Public Type typIPAdapter
AdapterName As String
AdapterType As String
Description As String
MacAdress As String
IpAddressCount As Long
IpAddress() As String
End Type
Public Type typAdapters
Count As Long
Item() As typIPAdapter
End Type
'/** GetIPAdapters
' * gets the adapters installed on local machine
' *
' * @returns typAdapters ,
' */
Public Function GetIPAdapters() As typAdapters
Dim returnAdp As typAdapters
Dim Error As Long
Dim AdapterInfoSize As Long
Dim i As Long
Dim PhysicalAddress As String
Dim AdapterInfo As typIpAdapterInfo
Dim Adapt As typIpAdapterInfo
Dim AddrStr As typIPStrs
Dim Buffer As typIPStrs
Dim pAddrStr As Long
Dim pAdapt As Long
Dim Buffer2 As typIpAdapterInfo
Dim AdapterInfoBuffer() As Byte
AdapterInfoSize = 0
Error = GetAdaptersInfo(ByVal 0&, AdapterInfoSize)
If Error <> 0 Then
If Error <> ERROR_BUFFER_OVERFLOW Then
Debug.Print "GetAdaptersInfo sizing failed with error " & Error
Exit Function '>---> Bottom
End If
End If
ReDim AdapterInfoBuffer(AdapterInfoSize - 1)
Error = GetAdaptersInfo(AdapterInfoBuffer(0), AdapterInfoSize)
If Error <> 0 Then
Debug.Print "GetAdaptersInfo failed with error " & Error
Exit Function
End If
CopyMemory AdapterInfo, AdapterInfoBuffer(0), Len(AdapterInfo)
pAdapt = -1
returnAdp.Count = 0
Do While pAdapt <> 0
returnAdp.Count = returnAdp.Count + 1
ReDim Preserve returnAdp.Item(returnAdp.Count)
With returnAdp.Item(returnAdp.Count - 1)
pAdapt = AdapterInfo.tNext
CopyMemory Buffer2, AdapterInfo, Len(Buffer2)
Select Case Buffer2.tType
Case MIB_IF_TYPE_ETHERNET
.AdapterType = "Ethernet adapter"
Case MIB_IF_TYPE_TOKENRING
.AdapterType = "Token Ring adapter"
Case MIB_IF_TYPE_FDDI
.AdapterType = "FDDI adapter"
Case MIB_IF_TYPE_PPP
.AdapterType = "PPP adapter"
Case MIB_IF_TYPE_LOOPBACK
.AdapterType = "Loopback adapter"
Case MIB_IF_TYPE_SLIP
.AdapterType = "Slip adapter"
Case Else
.AdapterType = "Other adapter"
End Select
.AdapterName = Buffer2.AdapterName
.Description = Buffer2.Description
For i = 0 To Buffer2.AddressLength - 1
PhysicalAddress = PhysicalAddress & Hex$(Buffer2.Address(i))
If i < Buffer2.AddressLength - 1 Then
PhysicalAddress = PhysicalAddress & "-"
End If
Next i
.MacAdress = PhysicalAddress
.IpAddressCount = 0
pAddrStr = -1
Do While pAddrStr <> 0
.IpAddressCount = .IpAddressCount + 1
pAddrStr = Buffer2.IpAddressList.tNext
ReDim Preserve .IpAddress(.IpAddressCount - 1)
CopyMemory Buffer, Buffer2.IpAddressList, LenB(Buffer)
.IpAddress(.IpAddressCount - 1) = Left$(Buffer.IpAddress, InStr(Buffer.IpAddress, Chr$(0)) - 1)
pAddrStr = Buffer.tNext
If pAddrStr <> 0 Then
CopyMemory Buffer2.IpAddressList, ByVal pAddrStr, Len(Buffer2.IpAddressList)
End If
Loop
End With
pAdapt = Buffer2.tNext
If pAdapt <> 0 Then
CopyMemory AdapterInfo, ByVal pAdapt, Len(AdapterInfo)
End If
Loop
GetIPAdapters = returnAdp
End Function
--------- 모듈부분 끝----
--------- 다음은 UserControl에 추가하는 함수입니다. ------
Public Function MacAddr() As String
Dim a As typAdapters
Dim tmpVal As String
Dim i As Integer
a = GetIPAdapters
For i = 0 To a.Count
tmpVal = tmpVal & a.Item(i).MacAdress
Next
MacAddr = tmpVal
End Function
위에 있는 mac address를 가져오는 방식은 제가 구상한 것이 아니라 어느 곳인지는 잘 모르지만, 다른 사이트에서 퍼온 것입니다. 어디에서 가져온 것인지 생각이 나지 않네요..
그리고 다음은 Inet 방식으로 ActiveX에서 웹서버의 특정파일에 POST 방식으로 정보를 보내는 것입니다.
Public Sub quitSession()
URL = "http://www...../chkInUser.asp"
strPostData = "UserCode=" & m_UserCode & "&mode=OUTWEB"
strPostData = StrConv(strPostData, vbFromUnicode)
strHeader = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
If Len(m_UserCode) > 0 Then
Inet1.Execute URL, "POST", strPostData, strHeader
While Inet1.StillExecuting
DoEvents
Sleep 1
Wend
End If
End Sub
Public Sub keepSession()
URL = "http://www...../chkInUser.asp"
strPostData = "UserCode=" & m_UserCode & "&mode=INWEB"
strPostData = StrConv(strPostData, vbFromUnicode)
strHeader = "Content-Type: application/x-www-form-urlencoded" & vbCrLf
If Len(m_UserCode) > 0 Then
Inet1.Execute URL, "POST", strPostData, strHeader
While Inet1.StillExecuting
DoEvents
Sleep 1
Wend
End If
End Sub
자.. 여기에서 m_UserCode 라는 변수는 유저의 ID 값인데요...
이것은 ASP에서 ActiveX Object를 구성할때 <PARAM name="UserCode" value="2">
로 추가하는 것입니다.
이를 위해서는
Const m_def_UserCode = "0"
'속성 변수:
Dim m_UserCode As String
Private Sub UserControl_InitProperties()
m_UserCode = m_def_UserCode
End Sub
'저장소에서 속성값을 로드합니다.
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
m_UserCode = PropBag.ReadProperty("UserCode", m_def_UserCode)
End Sub
'속성값을 저장소에 기록합니다.
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
Call PropBag.WriteProperty("UserCode", m_UserCode, m_def_UserCode)
End Sub
형태로 PARAM 의 UserCode 값을 m_UserCode 로 받습니다.
일단 이렇게 되면
기본적인 함수들의 구성은 끝났고요...
Private Sub UserControl_Show()
Call keepSession
End Sub
Private Sub UserControl_Terminate()
Call quitSession
End Sub
이렇게 UserControl이 시작될때하고 끝날때 keep 하고 Quit 정보가 웹서버로 전송되게 합니다.
그리고 웹서버의 chkInUser.asp에서는
mode가 INWEB일때는 INUSER 라는 테이블에 UserCode를 로그인 상태로 해놓고
mode가 OUTWEB일때는 INUSER 라는 테이블에 UserCode를 로그아웃 상태로 해놓습니다.
이렇게해놓으면 한가지 단점이 있습니다.
그것은 웹브라우저 종료가 아니라 웹페이지가 이동할때도 Usercontrol_Terminate 이벤트가 작동된다는 것입니다.
그래서 페이지가 로딩될때 UserControl_Show 가 작동되고 페이지를 클릭해서 지금페이지에서 다른페이지로 이동할때 Usercontrol_Terminate 가 되기 때문에 DB에 수시로 업데이트가 된다는 것입니다.
그런데 그런 단점도 iframe이나 기타의 방식으로 통제할 수 있을 꺼라고 봅니다.
QnA에서 힌트를 얻어서...만들었습니다...
필요하신 분은 참고하세요~
우선 두개의 테이블을 만들었습니다...
checklog Table
- ip(접속 ip)
- id(사용자 id)
- loginTime(로그인 시간)
duplicatelog Table (중복접속이 일어났을 경우 로그기록을 남기기 위해서 존재)
- id(사용자 id)
- date(날짜)
- ip(접속 ip)
자주 쓰는 테이블은 checklog Table 하나면 됩니다. 중복체크를 로그기록으로 남기지 않으시면, duplicatelog 테이블은 필요 없습니다.
그래서, 로그인 할때 마다
'로그인 중복 방지#################################################################
' 현재날짜 구하기
strYear = Year(now)
strMonth = cint(Month(now))
strDay = cint(Day(now))
if cint(strMonth) < 10 then
strMonth = "0" & strMonth
end if
if cint(strDay) < 10 then
strDay = "0" & strDay
end if
cur_date = strYear & "/" & strMonth & "/" & strDay
' 현재날짜 구하기 끝
ip = Request.Servervariables("REMOTE_ADDR")
Set dblog=Server.CreateObject("ADODB.Connection")
dblog.open("logEvent")
sql = "select * from checklog where id='" & id & "'"
set rsLog = dblog.execute(sql)
'
if rsLog.EOF or rsLog.BOF then '중복 로그인이 아님
sql = "insert into checklog (id, ip, loginTime) values ('"&id&"', '"&ip&"', '"&cur_date&"')"
dblog.execute sql
else '중복 로그인
sql = "update checklog set id='"&id&"', ip='"&ip&"', loginTime='"&cur_date&"'"
dblog.execute sql
end if
'
' 사용자 id로 된 데이터가 없으면 insert를 id로 된 데이터가 있으면 update를 시킵니다.
dblog.close
set dblog = nothing
'##############################################################################
그리고, 현재 id와 ip가 맞는지 검사 해주면 되겠죠.
중복 방지가 필요한 페이지에서
'로그인 중복 방지#################################################################
ip = Request.Servervariables("REMOTE_ADDR")
Set dblog=Server.CreateObject("ADODB.Connection")
dblog.open("logEvent")
sql = "select * from checklog where id='" & session("mem_id") & "'"
set rsLog = dblog.execute(sql)
if rsLog.EOF or rsLog.BOF then '로그온 안되거나 update 안됨
else
if rsLog("ip") <> ip then
sql = "insert into duplicatelog (id, ip, date) values ('" & session("mem_id") & "', '" & ip & "', '" & rsLog("loginTime") & "')"
dblog.execute sql
%>
<script>
alert("동일 아이디의 사용자가 접속하여 세션이 종료됩니다.");
location.class='MIME' href="include/login_ok.asp?sw=logout&returnUrl=<%=Request.ServerVariables("URL")&"?"&Request.ServerVariables("QUERY_STRING")%>";
// 강제로 로그아웃
</script>
<%
end if
end if
dblog.close
set dblog = nothing
'로그인 중복 방지#################################################################
저장된 ip와 클라이언트의 ip가 다르면 duplicatelog Table에 기록을 하고, 경고창을 내보내면서...강제로 로그아웃 시킵니다.
그러면 새로 접속된 세션은 살아있으면서 기존에 있던 세션이 끊어지게 되겠죠...기존에 세션이 있다면요...
그리고, 별 필요는 없지만...깔끔하게 정리하기 위해
로그아웃 버튼이 눌렸을때
'로그인 중복 방지#################################################################
Set dblog=Server.CreateObject("ADODB.Connection")
dblog.open("logEvent")
sql = "delete from checklog where id='" & session("mem_id") & "'"
dblog.execute sql
'#################################################################################
만들어진 레코드를 지워놓습니다.
물론, 안 지워도 상관은 없구요~
그럼, 도움이 되셨길...^-^;;;
javascript의 window.print()는 인쇄창(프린터 선택하는 화면)을 여는 기능외에 다른 커스터마이징이 불가능합니다. 인쇄를 하지 않고, 창을 닫았을 때, 처리 방법이 있으면 좋은데..
activeX로 해야할 것 같습니다. activeX로는 scriptX를 이용해 볼만 한데... advanced 기능은 유료로 구매한 경우에만 가능해서 그렇게 추천할 수는 없군요..
다만, scriptX의 기본 기능(무료)중에, 인쇄창을 열었는데... 고객이 인쇄를 하지 않고, 인쇄창을 닫아버리면 return value로 false를 돌려주는 기능이 있습니다.
페이지에서 인쇄창을 열고, 만약 return값이 false면 "인쇄안함"으로 다시 처리하고, true이면 "인쇄됨" 처리하면 100%는 아니지만, 근접한 결과를 얻을 수 있을 것입니다. (각종 프린터 오류가 있어 프린트가 안된 경우는 print에서 결과값을 return 받아야 하는데.. 그러려면, 유료기능을 사용해야 할 듯합니다)
아래에서는 printresult.asp?result=0(실패시) printresult.asp?result=1(성공시)로 처리했는데, 이를 통한 db 작업은 잘 알아서 하시면 되겠습니다..
참고로 scriptx의 기본기능(무료)를 이용하면 프린트 결과물의 header footer 위/아래/좌/우 여백 가로/세로출력 등을 설정할 수 있습니다.
참고 소스는
<OBJECT id="factory" style="DISPLAY: none"
codeBase="http://www.meadroid.com/scriptx/smsx.cab#Version=6,2,433,14"
classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814" viewastext>
</OBJECT>
<script>
function printPage(){
factory.printing.header = ""; //머릿말 설정
factory.printing.footer = ""; //꼬릿말 설정
factory.printing.portrait = true; //출력방향 설정: true-가로, false-세로
factory.printing.leftMargin = 1.0; //왼쪽 여백 설정
factory.printing.topMargin = 1.0; //위쪽 여백 설정
factory.printing.rightMargin = 1.0; //오른쪽 여백 설정
factory.printing.bottomMargin = 1.0; //아래쪽 여백 설정
a = factory.printing.Print(true); //출력하기
if (!a) {
window.location.href="printresult.asp?result=0" // 인쇄없이 닫은 경우 처리url get방식
}
else {
window.location.href="printresult.asp?result=1" // 인쇄한 경우 처리url get방식
}
}
</script>
<body onload="printPage();">
인쇄할 내용
</body>
form 태그를 사용하면 form이 종료되는 시점에서 공백이 발생하지요.
*이젠 더이상 Table 태그 사이에 끼워넣지 하지 말아요
<style>
form { display : inline; }
</style>
이런게 있었다니 지금까지도 몰랐네...
<input type="file" name="fl" style="display:none">
<input type="text" name="fileName"><img src="fileSearch.gif" onclick="document.bodyForm.fl.click()">
</form>
<form name="frm8" method="post" action="someFile.jsp">
<input type="text" name="myCtrl">
</form>
위와 같이 form tag 안에 element가 한개만 있을경우, "myCtrl"에서 enter를 눌렀을때 화면이 refresh가 된다.
이것을 막기 위해 아래와 같이 <input type="text" style="width:0; visibility:hidden;">를 추가해 주면 된다.
<form name="frm8" method="post" action="someFile.jsp">
<input type="text" name="myCtrl">
<input type="text" style="width:0; visibility:hidden;">
</form>
사실 꽁수다...
좋은 자료라서 올림..