2010년 3월 17일 수요일

[자바스크립트] 자바스크립트 이벤트 처리

⑴ 이벤트

    ① 이벤트의 역할

        사용자가 무슨 일을 했는지, 또는 페이지가 언제 로드 되었는지와 같은 정보를 제공해주는 것


    ② 이벤트와 객체의 관련성

        동작 중인 브라우저에 구현된 DOM에 가장 큰 영향을 받는 것으로 객체와 가장 밀접한 관계를 가지고 있다.


    ③ 이벤트의 기본 처리 방식

        (X)HTML 객체 태그나 자바스크립트 코드 블록 또는 파일 내에서 이루어진다.


    ④ w3c는 이벤트 개념

        ㉠ 사용자 인터페이스 (마우스 , 키보드)

        ㉡ 논리(처리 결과)

        ㉢ 변경(문서를 수정하는 일)


    ⑤ 이벤트 관련 객체
    

사용자 삽입 이미지


⑵ DOM  레벨 0의 이벤트 핸들러

    - 최초의 이벤트 시스템은 Events 또는 DOM 레벨 0라고 불린다.

    - DOM 레벨 0 이벤트

       현재의 모질라 / 파이어폭스에 해당하는 구 넷스케이프와 IE로 나눈다.

    - 객체 이벤트에 이벤트 핸들러를 통해서 새로운 기능이나 개선된 기능을 추가하는 방식      

    - 이벤트 핸들러

       객체 프로퍼티 중 하나로 구문은 onevent

    - 이벤트 핸들러의 이름은 'on'으로 시작하며 그 뒤에 이벤트명(load,  click 등)이 붙는다.           

    - 객체에 직접 이벤트 핸들러를 추가하는 방법              

       <body onload = 'var i = 23 ; i  *=3 ; alert(i);'> // 이벤트 핸들러 이름을 객체 태그의 속으로 넣는다.

                                                                       // 해당 이벤트가 발생했을 때 실행 할 코드를 지정해주는 것


    - 인라인 모델(inline model) 또는 인라인 등록 모델(inline registration model)

       이벤트를 HTML 엘리먼트의 속성으로 추가하는 방식 , 여러개의 함수를 호출하는 경우는 ;(세미콜론)으로 구분한다.


      <body onload = 'javascript:함수1();함수2()'>        

  

    - 이벤트 핸들러를 객체의 프로퍼티로 취급하여 직접 접근도 가능하다.

       window.onload = 함수객체   // 제거하기 위해서는 null

   

    - 기본 모델(traditional model) 또는 기본 등록  모델(traditional registration model)

       이벤트 핸들러를 객체의 프로퍼티로 취급하여 함수를 배정하는 방식  

       

        function Msg_Event(){
            var strMsg = 'Thank you';
            alert(strMsg);
        }
     
        window.onload = Msg_Event();          
   
       <body onload = 'javascript:Msg_Event();'>


   

    ① 이벤트 객체


       -  IE나 파이어 폭스 공통으로 사용되는 Event 프로퍼티


           ① altKey

               이벤트가 발생한 시점에서의  Alt 키의 눌림 여부


           ② clientX

               클라이언트의 X좌표


           ③ clientY

               클라이언트의 Y좌표


           ④ ctrlKey

               이벤트가 발생한 시점에서 ctrl 키의 눌림 여부


           ⑤ keyCode

               눌린 키의 코드값(숫자)


           ⑥ screenX

               이벤트가 발생한 스크린 X 좌표


           ⑦ screenY

               이벤트가 발생한 스크린 Y 좌표


           ⑧ shiftKey

               이벤트가 발생한 시점에서 shift 키의 눌림 여부


           ⑨ type

               이벤트 종류


           ⑩ fromElement (IE) , relatedTarget(파이어 폭스, 넷스케이프)

               onMouseOver나 onMouseOut 이벤트를 사용할 경우의 마우스 객체                


           ⑪ toElement(IE) , currentTarget(파이어 폭스, 넷스케이프)

               마우스 포인터 위치해 있는 객체 설정 혹은 현재 접근하는 엘리먼트               


           ⑫ scrElement(IE) , target(파이어 폭스, 넷스케이프)

               이벤트를 발생한 객체 설정 혹은 이벤트를 직접 받는 객체


           ⑬ 이벤트 프로퍼티 기타 목록

                  

                 ㉠ bubbles

                     이벤트가 DOM을 통해서 버블링 되었는지의 여부


                 ㉡ button

                     마우스 버튼의 상태(눌림 여부)


                 ㉢ cancelBubble

                     버블링의 취소 여부


                 ㉣ cancelable

                     이벤트의 취소 여부


                 ㉤ detail

                     이벤트의 세부 사항


                 ㉥ eventPhase

                     이벤트의 진행 단계


                 ㉦ isChar

                     이벤트가 문자를 발생시키는지의 여부


                 ㉧ layerX , layerY

                      position 프로퍼티가 absolute인 경우,

                      현재 레이어에서의 상대 x(y) 좌표  


                 ㉨ metaKey

                    메타 키 (ctrl/alt/shift 키) 의 상태 (눌림 여부)                      


                 ㉩ pageY , pageX

                     페이지 내의 상대 x(y) 좌표

                   

                 ㉪ timeStamp

                     이벤트가 발생한 시각


                 ㉫ view

                     이벤트가 생성된 AbstractView ( 무슨 말이지 모르겠네요)


                 ㉬ which

                     눌린 키의 유니코드 값


         - IE 에서는 Event가 window 객체의 프로퍼티로 이벤트가 발생하면 그에 따른 데이터가 프로퍼티에  담긴다.

       

             function mouseDown(){
                 var locStr = 'x = ' + window.event.screenX + ' y = ' + window.event.screenY;
                 alert(locStr);
            }
     
            document.onmousedown = mouseDown;         


         -  파이어 폭스는 nsEvent 이벤트 객체로 이벤트가 발생하여 그에 따른 데이터가 프로퍼티에 담긴다.

     

             function mouseDown(nsEvent){
                  var locStr = 'x = ' + nsEvent.screenX + ' y = ' + nsEvent.screenY;
                  alert(locStr);
             }
     
             document.onmousedown = mouseDown;


        - 크로스 브라우저 코드

           여러 브라우저에서 호환되는 코드 , 즉 DOM 레벨 0 이벤트가 IE와 파이어 폭스(넷스케이프)로 나누어져 있으므로

           자바스크립트 코드를 작성할 코드 호환되도록 작성하는 코드


           function mouseDown(nsEvent){
                var theEvent = nsEvent ? nsEvent : window.event;
                var locStr = 'x = ' + theEvent .screenX + ' y = ' + theEvent .screenY;
                alert(locStr);
           }
     
           document.onmousedown = mouseDown;        

         

    ② 이벤트 버블링(IE) , 이벤트 캡처링(넷스케이프 , 파이어폭스)

        하나의 이벤트가 하나의 엘리먼트에만 영향을 미치는 것이 아니라 여러 개의 엘리먼트에 영향을 미칠 경우를 말함.

         

         <script type = 'text/javascript'>
              function mouseDown(nsEvent){
                  var theEvent = nsEvent ? nsEvent : window.event;
                  var locString = 'X = ' + theEvent.screenX + ' Y = ' + theEvent.screenY;
                  var theSrc = theEvent.target ? theEvent.target : theEvent.srcElement;
     
                  alert(locString + ' ' + theSrc);

                 

                  /*

                       버블 이벤트 종료 시키기 아래 함수를 호출하기 위해 이벤트  버블을 하지 않는다.

                  */

                  // document.onmousedown = stopEvent;              

             }
         
             document.onmousedown = function(evnt){
                  var theEvnt = evnt ? evnt : window.event;
                  alert('*' + theEvnt.type);
             }
     
             window.onload = setupEvents;  
     
             function setupEvents(){
                 document.getElementById('1st').onmousedown = mouseDown;
                 document.getElementById('2st').onmousedown = function () {
                        alert('Second event handler');
                 }
             }


             /* 버블 함수를 종료시키기 위한 함수 */

             /*

             function stopEvent(evnt){
                if(evnt.stopPropagation){
                    evnt.stopPropagation();   // 넷스케이프의 경우
                }else{
                   evnt.cancelBubble = true; // IE의 경우
                }
             }          

             */
         </script>

         ****************************************************************************

          <div id = '1st' style='padding : 20px ; background-color : #feb ; width : 150px'>
                <div id = '2st' style='background-color : #f00; width : 100px ; height : 100px'>
               </div>
          </div>

         *****************************************************************************


    ③ 이벤트 핸들러와 this

         이벤트  핸들러 함수나 객체 메소드 내에서 엘리먼트의 프로퍼티에 접근하기 위해 this를 사용한다.

        

         window.onload = setupObjects;
 
         function setupObjects() {
              document.personData.firstName.onblur = testValue;
         }
 
         function testValue() {
             alert('Hi ' + this.value); // 폼 필드값  
         }        

         *****************************************************************************

         <form name = 'personData'>
               First Name : <input type='text' name = 'firstName' /> <br /> <br />
               Second Name : <input type = 'text' name = 'secondName' />
         </form>

         *****************************************************************************

        

         ※ DOM 레벨 2  이벤트 모델과 이전 버전과의 차이점

             - 특정 이벤트 핸들러 프로퍼티에 의존적이지 않음.

             - 하나의 이벤트나 객체 다수의 이벤트 핸들러를 등록이 가능함.

             - 이벤트 핸들러의 프로퍼티 외에 각 객체는 세가지 메소드를 가지고 있음.


                ㉠ addEventListener

                    이벤트 리스너를 추가하기 위한 메소드

                    예)

                    object.addEventListener('이벤트명' , '이벤트 함수', true|false);

                   

                     - 이벤트명  : click 이나 onload 등등...

                     - 이벤트 함수명 : 개발자가 작성한 함수명

                     - true | false { 케스케이드다운(cascade-down)과 버블업(bubble-up)의 두 가지 방식)}

                               true : 케스케이드 다운 방식

                               false : 버블 방식


                ㉡ removeListener  

                    기존 리스너를 제거하기 위한 메소드  


                ㉢ dispatchListener  

                    이벤트를 신속히 처리하기 위한 메소드

                

                 [넷스케이프 , 파이어폭스 전용] , IE에서는 에러  

                 function writeX(evnt){
                      alert('Capturing : ' + evnt.target + ' ' + evnt.currentTarget);
                      return true;
                 }
 
                  function writeY(evnt){
                      alert('Bubbing : ' + evnt.target + ' ' + evnt.currentTarget);
                      return true;
                 }
 
                 window.onload = setup;
 
                 function setup(evnt){
                      // 이벤트 캡처
                       document.addEventListener('click', writeX, true);
                       document.forms[0].addEventListener('click',writeX,true);
                       document.froms[0].elements[0].addEventListener('click',writeX,true);
   
                      // 이벤트 버블업 - 실행되지 않음 .....        
                     document.addEventListener('click',writeY,false);

                     document.forms[0].addEventListener('click',writeY,false);
                     document.forms[0].elements[0].addEventListener('click',writeY,false);
                 }               


                 ※ AddEventListener를 IE 7에서는 지원하지 않음


                 ***********************************************************************************

                  AddEventListener를 사용하지 못할 경우 아래 와 같은 방법을 사용한다.

                  크로스 브라우저 코드

                 ***********************************************************************************

                 

                  function clickMe(evnt){
                       evnt = evnt ? evnt : window.event;
                       alert(evnt.target + ' ' +  evnt.type);
                       alert('Can be canceled? ' + evnt.cancelable);
                       alert('Bubbling? ' + evnt.bubbles);
                       alert(evnt.timeStamp);
                 }
  
                 window.onload = setup;


                 /*
                 윈도우 unload 이벤트를 캡처해서 detachEvent로 설정된 이벤트들을 제거해야 한다.
                 윈도우의 메모리 낭비를 막기위해 사용된다. 
                 */


                 window.onunload = cleanup;
  
                 function setup(evnt){
                        var evtObject = document.getElementById('clickme');
    
                        // 객체 모델 테스트
                       if(evtObject.addEventListener){
                              document.addEventListener('click',clickMe,false);
                        }else if(evtObject.attachEvent){
                              evtObject.attachEvent('onclick',clickMe);
                       }else if(evtObject.onclick){
                              evtObject.onclick = clickMe;
                       }
                }
  
                // 이벤트 핸들러 제거 (IE이 경우 적용)
                function cleanup(){
                      var evtObject = document.getElementById('clickme');
                       if(evtObject.detachEvent){
                             evtBoject.detachEvent('onclick', clickMe);
                       }
                }                 

              

    ④ 이벤트 생성

        특정 시점에 이벤트를 발생시키는 경우에 사용된다. (대표적으로 focus() 메소드를 사용하는 경우 사용한다.)

       
         window.onload = setObjects;
 
         function setObjects() {
              document.personData.lastName.focus();
         }

        <form name = 'personData'>
              First Name : <input type = 'text' name  = 'firstName' /><br /> <br />
              Last  Name : <input type = 'text' name  = 'lastName' />
        </form>


2010년 3월 15일 월요일

[자바스크립트] PHP의 explode() 함수와 같은 기능을 하는 split() 함수 문자열 분할

<script>

var str = "a-b-c";

var arrString = str.split("-");

alert(arrString[0]+arrString[1]+arrString[2]);

</script>


결과화면
a-b-c

간단한 PHP+AJAX 예제

모든 파일은 utf-8로 작성되었습니다.

index.php

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<head>
    <title> new document </title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <script type="text/javascript" src="example.js"></script>
</head>
<body>
<div id="head"> hello, guest!</div>
<input type="text" id="name" value="" onkeyup="change()"/>
</body>
</html>



example.js
//XmlHttpRequest 객체 생성
if (typeof ActiveXObject != 'undefined')
{
    XMLHttpRequest = function ()
    {
        return new ActiveXObject(navigator.userAgent.indexOf('MSIE 5') >-1 ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP');
    };
}
var xhr = new XMLHttpRequest();

// 객체 생성하고 함수 생성
function change()
{
    var name = document.getElementById("name").value;
    var url = "exam.php?name="+name;
    xhr.open("Get",url,true);
    xhr.onreadystatechange = callback;
    xhr.send();
}
function callback()
{
    if (xhr.readyState == 4)
    {
        if (xhr.status == 200)
        {
            var txt = xhr.responseText;
            document.getElementById('head').innerHTML = txt;
        }
    }
}


exam.php :
<?php
header("Content-Type: text/html; charset=UTF-8");
$name = $_REQUEST["name"];
echo "welcome ".$name."!!";
?>


[이미지 출처 : http://compstat.chonbuk.ac.kr/JavaScript/]
참고사이트 http://compstat.chonbuk.ac.kr/JavaScript/

[AJAX] Ajax 데이터로드하기 서버로 데이터 전달 php

Ajax 데이터로드하기 서버로 데이터 전달 php

앞서본 포스팅한것들을 정적인 파일들이였다. html,스크립트 파일 단순한 텍스트(text)등으로 이정도는 ajax방법이 아니고도 가능하다.이번엔 동적인 데이타 전송을 살펴보자

동적 데이타파일

ajax를 이용한것은 동적데이타의 경우 브라우저에서 받은 입력값에따라 비동기적으로 되돌려주게 되어있다. 이런 동적파일은 php,java,asp가 있다.여기서 가장 편히 쓰이고 쉽게 할수있는 php로 예를들어보겠다.

php 데이타요청

먼저데이타 파일을 보자 내용은 하나가아닌 여러가지로 분류되어 있다

01.$entries = array(
02.   'HTML'=> array(
03.   'definition' => 'HyperText Markup Language',
04.   'explantion' => '어쩌고 저쩌고',
05.   ),
06.   'XML'=> array(
07.   'definition' => 'extensible markup language',
08.   'explantion' => '어쩌고 저쩌고',
09.   ),
10.  );

위에서 세가지를 설명해주고 있다.여기서 php의 문법에 대해선 자세히 알아보지 않겠지만 위의 정도이면 대충 알아봇것이라본다. $는 변수지정 그리고 array는 C언어에서 흔히 배운 행렬에대한 정의방식이다

이번엔 메인페이지에 html을 만들어보자.백과사전 처럼 리스트에서 하나를 클릭할경우 위의 데이타중 소속된것을 불러오도록 할 것이다.

1.<UL>
2. <LI><A href="#">HTML</A
3. <LI><A href="#">XML</A>
4.</LI></UL>
5.<DIV id=content> <P>로드된 데이터가 들어올자리</P> </DIV>

앞선데이타 파일과 그리고 메인페이지는 만들어졌다. 그럼 데이타 파일을 html형식으로 만들어줄 스크립트와 불러줄 스크립트 소스가있으면 되겠다.

클릭시 다음과 같이 나오도록 생각해보자

1.<H3>HTML</H3>
2.<H4>HyperText Markup Language</H4>
3.<P>어쩌고 저쩌고</P>

그럼 이걸 소스로 짜준다면은

01.if (isset($entries[$_REQUEST['words']])) {
02.  //변수 entries가 있는지 확인한다
03.  $entry = $entries[$_REQUEST['words']];
04.  //entry란 변수로 entries에 나열된것들을 요청
05.  //인자로 words를 사용했다.
06.  $html .= '<H3>';
07.  $html .= $_REQUEST['words'];
08.  $html .= '</H3>';
09.  $html .= '<H4>';
10.  $html .= $entry['definition'];
11.  $html .= '</H4>';
12.  $html .= '<P>';
13.  $html .= $entry['explantion'];
14.  $html .= '</P>
15.<P>';  
16.  print($html);//출력
17.}
18.</P>

메인페이지에 가서 요청할 하이퍼링크를 다시보자

1.<UL>
2. <LI><A href="ajax_part/server.php?words=HTML">HTML</A>
3. <LI><A href="ajax_part/server.php?words=XML">XML</A>
4.</LI></UL>

li엘리먼트의 각주소는 php파일의 데이타의 일부를 호출하고있다. 첫번쨰는 html,두번째는 json..

마지막으로 볼것을 이들을 작동시킬 스크립트이다.

01.$(document).ready(function() {
02.  $('a').click(function() {
03. $.get('./ajax_part/server.php',
04.  {'words': $(this).text()}, function(data) {
05. //get함수로 php파일을 부른다, 인자는words 
06.      $('#content').html(data);
07.      //콘텐트에 첨가
08.    });
09.    return false; });});

위의 방법은 get함수를 이용한것이다 post방식 역시 별반다를반 없다.

1.$.post('./ajax_part/server.php',
2. {'words': $(this).text()}, function(data) {

마지막으로 볼것은 더간단한 .load사용하는방법이다

1.$('#content').load('e.php', {'term': $(this).text()});

요약

php에 익숙하지않은 사람은 소스가 이해가지않은수있다. 하지만 정적파일을 로드했을때와 모습은 별차이없었다.이제까지 알아본걸 되돌아보면

  • 메인페이지작성
  • 메인페이지에 데이타가 들어올 자리 구성
  • 데이터 마련(html,JSON, php...등
  • 데이타를 html형식으로 바꿔줄 스크립트작성
  • 작동시킬 스크립트작성

마지막으로 덧붙임, 이예제는 php형식의 예제이다. 동적이란것은 서버가 있을때 주고 받음으로서 작동되는 것이다. 따라서 APM으로 로컬로 개인 pc에 서버가 구축되어있지않거나, 별도 마련된 서버에 업로드시켜 확인하지않고 그냥 브라우저로는 당연히 작동되지않는다.맣은사람들이 왜안되냐고 묻곤하는데 동적파일 php임을 생각하자

마지막을 완성된 예제를 직접보자면 아래를 클릭

http://sianasiatiger.cafe24.com/study/A_ajax_server.html

출처 : http://siana.tistory.com/108

2010년 3월 12일 금요일

[HTML/JAVASCRIPT] 레이어 팝업

<?
if('211.174.235' == substr($_SERVER['REMOTE_ADDR'],0,11))  { ?>

<HTML>
<HEAD>
<STYLE type=text/css>
BODY {FONT-SIZE: 9pt; BACKGROUND: #ffffff; COLOR: #787878; FONT-FAMILY: 굴림,tahoma}
</STYLE>
</HEAD>

<BODY>
<script language=javascript>

        var IE5=(document.getElementById && document.all)? true : false;
        var W3C=(document.getElementById)? true: false;
        var currIDb=null, currIDs=null, xoff=0, yoff=0; zctr=0; totz=0;

        function trackmouse(evt){
                if((currIDb!=null) && (currIDs!=null)){
                        var x=(IE5)? event.clientX+document.body.scrollLeft : evt.pageX;
                        var y=(IE5)? event.clientY+document.body.scrollTop : evt.pageY;
                                currIDb.style.left=x+xoff+'px';
                                currIDs.style.left=x+xoff+10+'px';
                                currIDb.style.top=y+yoff+'px';
                                currIDs.style.top=y+yoff+10+'px';
                        return false;
                }
        }

        function stopdrag(){
                currIDb=null;
                currIDs=null;
                NS6bugfix();
        }

        function grab_id(evt){
                xoff=parseInt(this.IDb.style.left)-((IE5)? event.clientX+document.body.scrollLeft : evt.pageX);
                yoff=parseInt(this.IDb.style.top)-((IE5)? event.clientY+document.body.scrollTop : evt.pageY);
                currIDb=this.IDb;
                currIDs=this.IDs;
        }

        function NS6bugfix(){
                if(!IE5){
                        self.resizeBy(0,1);
                        self.resizeBy(0,-1);
                }
        }

        function incrzindex(){
                zctr=zctr+2;
                this.subb.style.zIndex=zctr;
                this.subs.style.zIndex=zctr-1;
        }

        function createPopup(id, title, width, height, x , y , isdraggable, boxcolor, barcolor, shadowcolor, text, textcolor, textptsize, textfamily ){
                if(W3C){
                        zctr+=2;
                        totz=zctr;
                        var txt='';
                                txt+='<div id="'+id+'_s" style="position:absolute; left:'+(x+7)+'px; top:'+(y+7)+'px; width:'+width+'px; height:'+height+'px; background-color:'+shadowcolor+'; filter:alpha(opacity=50); visibility:visible"> </div>';
                                txt+='<div id="'+id+'_b" style="border:outset '+barcolor+' 2px; position:absolute; left:'+x+'px; top:'+y+'px; width:'+width+'px; overflow:hidden; height:'+height+'px; background-color:'+boxcolor+'; visibility:visible">';
                                txt+='<div style="width:'+width+'px; height:16px; background-color:'+barcolor+'; padding:0px; border:1px"><table cellpadding="0" cellspacing="0" border="0" width="'+(IE5? width-4 : width)+'"><tr><td width="'+(width-20)+'"><div id="'+id+'_h" style="width:'+(width-20)+'px; height:14px; font: bold 12px Tahoma; cursor:move; color:'+textcolor+'"> '+title+'</div></td><td align="right"><a onmousedown="document.getElementById(\''+id+'_s\').style.display=\'none\'; document.getElementById(\''+id+'_b\').style.display=\'none\';return false"><img src="http://www.blueb.co.kr/SRC/javascript/image/close.gif" border="0" height="15" width="15"></a></td></tr></table></div>';
                                txt+='<div id="'+id+'_ov" width:'+width+'px; style="margin:5px; color:'+textcolor+'; font:'+textptsize+'pt '+textfamily+';">'+text+'</div></div>';
                                document.write(txt);
                                this.IDh=document.getElementById(id+'_h');
                                this.IDh.IDb=document.getElementById(id+'_b');
                                this.IDh.IDs=document.getElementById(id+'_s');
                                this.IDh.IDb.subs=this.IDh.IDs;
                                this.IDh.IDb.subb=this.IDh.IDb;
                                this.IDh.IDb.IDov=document.getElementById(id+'_ov');
                                if(IE5){
                                        this.IDh.IDb.IDov.style.width=width-6;
                                        this.IDh.IDb.IDov.style.height=height-22;
                                        this.IDh.IDb.IDov.style.scrollbarBaseColor=boxcolor;
                                        this.IDh.IDb.IDov.style.overflow="auto";
                                }
                                else{
                                        this.IDh.IDs.style.MozOpacity=.5;
                                }
                                this.IDh.IDb.onmousedown=incrzindex;
                                if(isdraggable){
                                        this.IDh.onmousedown=grab_id;
                                        this.IDh.onmouseup=stopdrag;
                                }
                        }
                }

        if(W3C)document.onmousemove=trackmouse;
        if(!IE5 && W3C)window.onload=NS6bugfix;       
       
</script>

<script language=javascript>

        createPopup( 'popup1', 'popup 1' ,  300, 120, 50, 50, true, '#ebebeb' , '#787878' , '#cccccc' ,  '<font color="#787878">You can drag and drop these boxes by using the titlebar as the handle if dragging has been enabled.<br>Dragging has been disabled for this box.</font>' , '#ffffff' , 8 , 'Tahoma');

<!-- 이부분은 팝업창을 두개 이상할때를 보여주기 위한 부분입니다 -->
        createPopup( 'popup2', 'popup 2' ,  220, 130, 50, 250, true, '#c0c0c0' , '#555555' , '#c0c0c0' ,  'The HTML in these boxes will wrap if they need to. In NS6, any HTML past the bottom will get chopped off (because of some weird stuff NS6 does while dragging scrollable DIVs), while IE will display a scrollbar to scroll down.<br><br>' , '#f3f3f3' , 10 , 'Arial');


<!-- 이부분은 팝업창을 두개 이상할때를 보여주기 위한 부분입니다 -->
        createPopup( 'popup3', 'popup 3' ,  320, 130, 250, 80, true, '#c0c0c0' , '#555555' , '#c0c0c0' ,  '이곳에 팝업내용을 삽입하세요.        ' , '#f3f3f3' , 10 , 'Arial');

</script>
</P>

</BODY>
</HTML>


<?
}
?>

2010년 2월 26일 금요일

[리눅스] 웹호스팅 업체 SSH로 접속해서 계정 사용량 보기

계정에서 올라갈수 있는 최상위 루트 폴더에서 아래 명령어를 치면
각 폴더별 사용량을 체크할 수 있다.

~ >  du -sh *

2010년 2월 23일 화요일

[자바스크립트] SELECT 박스 값 제어하기

셀렉트 콤보 박스가 있고
체크박스 클릭시 셀렉트 박스의

<select name="month">
<option>선택</option>
<option>1</option>
<option>2</option>
<option>3</option>
<option>4</option>
<option>5</option>
<option>6</option>
<option>7</option>
<option>8</option>
<option>9</option>
<option>10</option>
<option>11</option>
<option>12</option>
</select>

3개월 신청<input type="checkbox" onClick="update()" name="box_check" value="3">

위와 같이 셀렉트 박스랑 체크박스가 있는데요
체크 박스를 체크했을때
현재 달에서 3을 더해서 ex) 지금이 1월이면 4월이 selected 되도록
하려고 하는데 onupdate() 함수를 어떻게 써줘야할지
간단하게나마 답변 부탁드립니다.

답변>
onClick="update(this)"
<select id="month">

function update(obj){
 var value = obj.value || 1;
 var selectObj = document.getElementById("month");

 value = parseInt(obj.value, 10)+3;
 
 for(vari=0; i<selectObj.options.length;i++ ){
  if( selectObj.options[i].text == value){
    selectObj.options[i].selected = "selected";
    break;
  }
 }
}

2010년 2월 10일 수요일

[플래시+jquery] 멀티업로더

출처 : http://up.webhard.cctoday.net/

[플래시+PHP] 플래시 멀티 업로더

지우님(http://www.ziwoo.net)이 만드신 플래쉬 멀티 업로더를 개조해서 제가 쓸려고 만든 플래쉬 멀티 업로더.

그런대로 여러 플젝에서 사용했었는데 나름 나쁘지 않음 ㅎㅎ

머 필요한 사람은 다운받아서 사용해도 되고 수정해서 사용해도 됨.

단! 출처는 밝힙시다 ^^

아! 지금은 PHP에서만 사용가능하다는것!

지우님이 만든 부분
--------------------------------------------
>플래시8부터 제공되는 파일업로드 기능을 응용한
>업로드입니다.
>만들어 놓은지는 반년 쯤 넘은것 같은데..
>오늘 서버에 폴더 정리하다가 발견해 올려봅니다.
>
>[설치/사용법]
>압축파일을 풀면 fu폴더 안에 다음과 같이 파일이 들어있습니다.
>
>fu
>- files 디렉토리 : 임시업로드 파일이 저장되는곳. (필히 chmod 777로 조정)
>- index.php 테스트를 할 수있는 메인페이지.
>- multi_upload.fla 다중업로드가 가능한 플래시 원본
>- multi_upload.swf 다중업로드가 가능한 쇽웨이브 파일
>- single_upload.fla 싱글업로드만 가능한 플래시 원본
>- single_upload.swf 싱글업로드만 가능한 쇽웨이브 파일
>- swf_upload.js 플래시가 호출하는 자바스크립트 함수 모음
>- upload.php 플래시 업로드가 필요로하는 php 업로드 파일
>
>서버의 적당한곳에 압축풀고..
>files 폴더에 쓰기 가능하도록 접근권한 변경하시고..
>http://위의 적당한URL/fu 로 접속해보시면 됩니다.
>
>코딩을 하다보면 멀티업로드만 필요한 경우도 있지만,
>싱글파일이 여러개 필요한 경우도 많지요..
>상황에 알맞게 index.php를 참고하여 수정해서 쓰시면 됩니다.
>
>지우넷에서 테스트 해보시려면
>http://www.ziwoo.net/fu 를 클릭!
-------------------------------------------------
내가 추가한 부분
-----------------------------------------------------
- multi_upload2.fla 다중업로드(갯수제한 및 파일순서변경)가 가능한 플래시 원본
- multi_upload2.swf 다중업로드(갯수제한 및 파일순서변경)가 가능한 쇽웨이브 파일

- multi_upload3.fla 다중업로드(갯수제한, 파일순서변경, 기존파일 수정)가 가능한 플래시 원본
- multi_upload3.swf 다중업로드(갯수제한, 파일순서변경, 기존파일 수정)가 가능한 쇽웨이브 파일

- single_upload2.fla 싱글업로드(수정모드)만 가능한 플래시 원본
- single_upload2.swf 싱글업로드(수정모드)만 가능한 쇽웨이브 파일

테스트 페이지 (http://handsome.hosting.paran.com/fu--/index.php)

사용법은 index.html 에..

다음 스마트에디터 파일첨부 예제

사진 첨부하기 너무 어렵네요.
혹시 튜토리얼을 가지신 분이나 간단하게 설명해주실 분~?

Comment 1 by rockmkd, Sep 21, 2009
네 처음 보시는 분들은 생소하실 듯 하지만 전혀 어렵지 않습니다^^;
여기서는 파일 첨부를 예로 들겠습니다.(이미지첨부는 파일첨부와 95.23423% 비슷합니다.)

[파일]버튼을 클릭하면 첨부를 위한 팝업창이 나타나고 이 팝업을 통해 에디터로의 파일첨
부가 이루어집니다. 팝업창은 소스트리에서  pages/popup/file.html에서 확인하실 수 있는
데요. 이 파일의 상단부분에 있는데 20줄가량이 javascript가 파일첨부의 핵심입니다.

일반적으로 웹상에서의 파일업로드는 php나 jsp같은 serverside만을 통해 이루어집니다. 
multipart-form에 file을 올린 후 서버쪽 모듈로 업로드 시키고 필요하다면 file메타정보들
을 남기는 식으로 말이죠. 다음에디터에서는 에디터와의 연동을 위해 이와 같이 serverside
모듈에 추가적인 javascript가 더 들어가게 됩니다. php 코드로 예를 들어보겠습니다.

[일반적인 경우]
=========== upload_form.html ==============
<form method="post" enctype="multipart/form-data" action="uploader.php">
제목 : <input type="text" name="subject">
<input type="file" name="upload_file">
<input type="submit">
</form>

=========== uploader.php ===================
<?php
$subject = $_POST['subject'];
$tmpfilename = $_FILES['upload_file']['tmp_name'];
$filename = $_FILES['upload_file']['filename'];
$filetype = $_FILES['upload_file']['type'];
$filesize= $_FILES['upload_file']['size']
$destination = "/upload/" . $filename;
$fileurl = "http://my.homepage.com/upload/" . $filename;
move_uploaded_file ( $tmpfilename, $destination );
write_into_db_filemeta($filename, $desination, $filesize, $filetype, $fileurl); //업
로드한 이름과 파일의 사이즈나 mime/type들을 읽어서 DB에 저장하는 사용자 함수 
?>
<script type="text/javascript">
alert('파일 업로드가 성공되었습니당~~');
</script>
=================================================================

위와같이 사용자에게 파일을 입력받을 폼 파일과 입력받은 파일을 서버에 저장하고 서버모
듈이 일반적인 경우입니다. 위의 예제에서는 약간의 수정을 가한것이 서버모듈이 실행된후
사용자에게 업로드가 완료되었음을 알려주는 alert창을 띄워보았습니다.
에디터와 연동되는 javascript는 저 부분에 들어가면 됩니다. alert창 대신 서버에 올라간
파일의 데이터를 에디터에 전달해주는 스크립트를 삽입하는것이지요.

============== uploader.php =========================
//여기까지는 위와같습니다.
write_into_db_filemeta($filename, $desination, $filesize, $filetype, $fileurl); 
?>
<script type="text/javascript">
if (typeof(execAttach) == 'undefined') { //Virtual Function
    return;
}
	
var _mockdata = {
    'attachurl': '<?=$fileurl?>',
    'filemime': '<?=$filetype?>',
    'filename': '<?=$filename?>',
    'filesize': <?=$filesize?>
};
execAttach(_mockdata);
closeWindow();
</script>
=====================================================
php에서 받은 파일의 정보를 javascript의 execAttach 함수에 넘겨주기만 하면 됩니다.
그전에 업로드 창에서는 에디터 객체를 알고 있어야 하기 때문에 다음과 같은 초기화 구문
이 필요합니다.

=======================초기화 구문(uploader.php 포함됨) =========
var _opener = PopupUtil.getOpener();
var _attacher = getAttacher('file', _opener);
registerAction(_attacher);
=======================================================================

요약하자면  file.html 을 위에서 만든 upload_form.html로 대체한 후 uploader.php 으로
업로드 모듈을 넣어주고 file.html 에서 쓰던 에디터 연동용 javascript코드를
uploader.php에서 실행시켜 주면 간단하게 업로드를 구현하실 수 있습니다.

스마트에디터 BEST 8 모음

1. CKEditor, FCKEditor

 

사이트 :: http://ckeditor.com/

데모 : http://ckeditor.com/demo

 

현존현존 하는 위지윅 에디터 중 가장 많이 사용되고 있으며 강력한 기능을 가진가진 CKEditor와 FCKEditor입니다. 이름에서 알 수 있듯이 CKEditor는 FCKEditor의 업데이트 버전으로 웹표준과웹표준과 접근성향상 그리고 디자인적인 발전등 날로 발전해 나가고 있는 프로그램입니다.

 

특징 : 툴바, 스킨등 개인에 맞게 설정 가능. 크로스 브라우징 가능.
언어 : 기본 영어, 한글 가능.
라이센스 : 오픈소스 라이센스 및 상업용 라이센스.
최종버전 : ckeditor - 3.0.1, fckeditor - 2.6.5
추천도 : ★★★★★

 

 

2. TinyMCE

 

CKEditor와 함께 가장 많이 사용되고 있는 위지윅 에디터 하나로 개인설정과 플러그인 설정으로

아주 강력한 기능을 가진 에디터입니다. jQuery버전도jQuery버전도 따로 존재하며 wiki도 존재하여 개인설정과 사용이 아주 간편한 편입니다.

  

사이트 : http://tinymce.moxiecode.com

데모 : http://tinymce.moxiecode.com/examples/full.php

 

특징 : 툴바, 스킨,플러그인등 개인에 맞게 설정 가능. jQuery 버전 존재. 크로스 브라우징 가능.
언어 : 기본 영어, 한글 가능.
라이센스 : 오픈소스 라이센스
최종버전 : 3.2.7
추천도 : ★★★★★


 

3. 다음 오픈 에디터에디터

 

얼마 전 다음이 구글코드를 통해 공개한 공개용공개용 다음 오픈 에디터입니다. 개발자들에 의하면 시멘틱 정보 웹 에디터라는 개념을 도입하여도입하여 사용자가 생산하는 콘텐츠에 데이터간 상호 연결성을 더해주는 웹 정보를 포함시켜 시멘틱시멘틱 검색 기술과 데이터 연결이라는 데이터 생태계를 구현했다고 합니다. 구글 코드 포럼을포럼을 통해 사용자들의 의견을 수렴하여 계속해서 업데이트되고 있어 미래가 기대되는 에디터 하나입니다.

 

사이트 : http://code.google.com/p/daumopeneditor/

데모 :: http://uie.daum.net/openeditor/sample/5.2.0/editor.html

 

특징 : 국내 최대 포탈사이트중 하나인 다음에서 공개한 오픈 에디터. 초보자가 사용하기 용이함.
언어 : 한글
라이센스 : 오픈소스 라이센스
최종버전 : 5.3.0
추천도 : ★★★★☆

 

 

4. 스마트 에디터

 

네이버에서 공개한 위지윅 에디터인 스마트 에디터입니다. 웹폰트 지원, 초보 사용자가 사용하기 용이한 점등이 특징이지만 웹표준 및 브라우저 접근성에서 떨어져 원성을 사고 있기도 합니다.

 

사이트사이트 : http://dev.naver.com/projects/smarteditor

미리보기 : http://dev.naver.com/projects/smarteditor/wiki/SmartEditorBasicUserInterfacePreview

 

특징 : 웹폰트 사용가능(IE전용). 초보자가 사용하기 용이함.
언어 : 한글
라이센스 : 오픈소스 라이센스
최종버전 : 0.3.17
추천도 : ★★★☆


 

5. 알디터

 

사이트 : http://www.alik.info/

데모 : http://www.alik.info/alditor/sample.html

  

알릭님께서 제작한 알디터입니다. 간단한 인터페이스와 심플함으로 제로보드 및 그누보스 사용자들이사용자들이 많이 사용하고 있으며 비표준 및 접근성이 떨어지는 점만 제외하면 쓸만한 에디터입니다.에디터입니다. 그러나 따로 소스를 배포하지 않고 업데이트가 끊긴 점을 생각해 볼때 그리그리 추천하지는 않습니다.

 

특징 : 심플함.
언어 : 한글
라이센스 : 비영리목적 사용가능. 소스 수정/배포 금지. 상업적 목적 사용시 제작자에 연락.
최종버전 : 06년 9월 23일
추천도 : ★★

 

 

6. Xinha

 

사이트 : http://trac.xinha.org/

데모 : http://xinha.raimundmeyer.de/x_examples/ext_example.html

 

이번에 위지윅 에디터에에디터에 관해 알아보면서 알게된 Xinha 라는 에디터입니다. 한글사용은 안되는듯 보이지만 크로스 브라우징도브라우징도 지원하며 플러그인도 사용가능한듯 보이며 위지윅 에디터로 사용하기엔 좋은듯 싶습니다.

  

특징 : 위지윅 에디터 기능에 충실, 플러그인 사용가능.
언어 : 영어
라이센스 : 오픈소스 라이센스
최종버전 : 0.95
추천도 : ★★☆

 

 

7. openWYSIWYG

 

사이트 : http://www.openwebware.com/

데모 : http://www.openwebware.com/wysiwyg/demo.shtml

 

사용이 간편하면서도 다양한 언어를 지원하는 위지윅 에디터입니다.

 

특징 : PHP, Perl, ASP, ASP.net, Java 등 다양한 언어 지원. 사용이 간편함.
언어 : 영어
라이센스 : 오프소스 라이센스
최종버전 : 1.4.7
추천도 : ★★☆


 

8. Richtext Editor

 

사이트 : http://rtef.info

데모 : http://rtef.info/demo.htm

 

가볍고 쓸만한 위지윅 에디터입니다. 다양한 브라우저에서 사용가능하다는게사용가능하다는게 장점입니다.

 

특징 : 가벼운 인터페이스. 크로스 브라우징 지원.
언어 : 영어
라이센스 : 오픈소스 라이센스(MIT)
최종버전 : 0.007
추천도 : ★★☆