script.aculo.us의 Sortable로 드래그앤드롭(DragNDrop) 사용하기
Script.aculo.Us에서는 드래그앤드롭(Drag N Drop)을 쉽게 구현할 수 있는 클래스가 있는데 Draggable(Droppables)과 Sortable 2개의 클래스이다. 둘다 드래그앤드롭을 위한 클래스인데 Draggable는 객체를 드래그 가능하게 만드는 클래스이고 Sortable은 드래그앤드롭이 되면서 정렬이 가능하도록 하는 클래스이다. 정렬을 하고자 한다면 Sortable을 사용하는 것이 편하고 여기서 정리하려는 것은 Sortable이다.
Sortable.create('id_of_container',[options]);
위 코드이 Sortable을 사용하는 기본 문법이다. id_of_container에 드래그앤드롭을 가능하게 할 엘리먼트의 id를 주고 options에 드래그앤드롭에 대한 옵션을 JSON형태로 던져주면 바로 정렬가능한 드래그앤드롭을 사용가능하다. id_of_container이라고 쓴 것처럼 드래그할 객체가 아니라 드래그할 객체들을 담고 있는 container의 id를 주면 되고 options는 안주면 디폴트옵션으로 동작하게 된다.
위와같이 작성하면 dnd_1, dnd_2객체가 바로 드래그앤드롭이 가능하다. (이 얼마나 간단하단 말인가. ㅎㅎㅎ)
이제 옵션을 보자. 자유롭게 사용하려면 옵션을 주어서 원하는 형태로 사용하여야 한다. 옵션은 Draggable과 공통적인 것도 있고 아닌것들도 있다.(아직 Script.aculo.us의 API리스트는 솔직히 좀 아쉽다.) API와 내가 테스트해본걸 바탕으로 적었지만 빠진 부분이 있을수도 있다.
tag : 여기에 HTML태그명을 주면 해당 태그에 대해서 Sortable이 동작하게 된다. 디폴트는 li태그이고 container아래 한단계 밑까지만 동작한다. 쉽게 말해 li안에 li가 또 들어있다고 하더라도 안에 있는 li에는 드래그앤드롭이 동작하지 않는다. Block엘리먼트에만 가능하고 table같은걸 블가능하다.
only : 이 옵션을 주고 여기서 class명을 지정하면 tag에 설정한 태그명이라고 할지라도 only에서 준 class명과 맞지 않으면 드래그앤드롭이 동작하지 않는다.
overlap : 가로 리스트는 horizontal, 세로 리스트는 vertical로 설정하라는데 정확한 동작은 잘 모르겠다.
constraint : horizontal, vertical, false 3가지가 있고 드래그앤드롭의 방향을 설정한다. horizontal/vertical로 설정할 경우에는 가로/세로로만 이동하며 false나 옵션을 주지 않았을 경우에는 어떤 방향이든지 이동이 가능하다.
containment : 이곳에 container 리스트를 지정하고 이곳에 지정한 container간에는 드래그앤드롭이 가능하다.
handle : 드래그앤드롭을 할 엘리먼트에서 전체가 아닌 특정부분만을 이용해서 드래그앤드롭이 가능하도록 하고 싶을때 handle이용한다. 이곳에 id 혹은 class명을 지정하면 핸들러로 사용할 수 있다.
delay : 드래그앤드롭으로 반응할 시간을 미리세컨단위로 설정할 수 있고 기본은 0이다. 너무 민감하게 반응하지 않기를 바랄때는 delay의 숫자를 크게 지정할 수 있다.
dropOnEmpty : true로 설정하면 container가 비어있을때도 drop이 가능하다. false일 경우에는 container에 다른 드래그앤드롭객체가 있을때만 드롭이 가능하다. 기본은 false
scroll : 기본으로는 지정되어 있지 않으며 window로 설정할 경우에는 드롭할 container가 화면밖에 있을경우에 드래그객체가 화면밖으로 나가면 자동으로 스크롤한다.
scrollSensitivity : 기본은 20이고 스크롤이 되게 하기 위해서 넘어가야하는 크기를 지정한다.
scrollSpeed : 스크롤 속도이고 픽셀로 지정하면 기본은 15이다.
onChange : 콜백함수로 드래그앤드롭을 시작하는 등 객체의 위치가 변경되면 계속 발생한다.
onUpdate : 콜백함수로 드래그앤드롭을 하여 실제 순서의 변화가 생겼을때만 발생한다.
아주 간단한 예제를 만들었다. 동작과 소스코드를 보면 쉽게 이해할 수 있을꺼라고 생각한다. 최근 작업을 하면서 몇가지 주의점(?)을 발견한 거라면...
container의 id에 언더바(_)가 들어가면 동작하지 않는다.
Sortable.serialize를 사용하려면 드래그앤드롭 엘리먼트의 아이디가 언더바(_)로 이어져야 한다. 언더바 뒤쪽에 있는 문자만 표시된다.
IE에서는 왼쪽 콘테이너에서 오른쪽 콘테이너로 갈때 드래그엘리먼트가 컨테이너 뒤쪽으로 가는 문제가 생긴다. 드롭하기 위해서 반이상 넘어갈 경우에는 위로 올라오는데 이건 IE의 z-index버그때문에 생기는 문제로 예상되는데 정확한 해결책은 아직 찾지 못했다.
Sortable.serialize는 해당 컨테이너에 있는 드래그앤드롭객체를 순서대로 보여준다. 이것은 위치정렬을 한 후에 Ajax등을 통해서 새로 정렬한 위치를 서버에 저장할 수 있도록 하는 역할을 한다.
그리고 예제의 소스를 보면 알겠지만 기본적으로는 드래그앤드롭을 할 때 해당위치의 공간은 표시하지만 따로 표시되지는 않는다. 이 문제를 해결하기 위해 더미 엘리먼트를 만들었다. OnChage가 발생할 때 해당 엘리먼트의 바로 앞쪽에 더미엘리먼트를 만들어서 insert한다. 이렇게 함으로써 드롭했을때 떨어질 위치가 명시적으로 보일수 있도록 하고 OnChange는 계속 발생하기 때문에 처음에 더미엘리먼트를 지우고 다시 넣어주기 때문에 다른 컨테이너로 넘어가는 순간 더미엘리먼트도 적절하게 이동된다. 깔끔한 해결책은 아닌듯 하지만 일단 동작은 한다.
초창기에 개발에 대해 전혀 모를때 인터넷에 있는 많은 정보들을 볼 때 가장 답답한 부분중 하나가 설명하는 사람이 당연히 내가 알꺼라고 생각하고 그냥 넘어가는 부분을 정작 나는 몰라서 그사람의 설명이나 소스까지 도달하기도 어려웠다는 것이지요. 머 그렇다고 항상 모든 것을 다 설명한다는 것도 어렵겠지만 블로그에서는 최대한 자세하게 쓰려고 하고 있기는 하지만 좀 초심을 잃어버린 생각이 들었습니다. 그리고 새로 알게된걸 항상 포스팅으로 하게되지는 않고 그러다 보면 포스팅타이밍을 놓쳐버린 것들도 많죠.
쿡이님의 질문을 받으면서 생각난 김에 JS로 엘리먼트를 다룰때 가장 많이 사용할 추가, 삭제에서 prototype.js가 지원하는 부분에 대해서 다시 한번 정리합니다.
prototype.js에는 Element 클래스가 있습니다. HTML의 DIV, INPUT, LI같은 엘리먼트에 관련된 클래스입니다. Element의 API문서를 보면Element클래스가 지원하는 많은 메서드를 볼 수 있습니다. 엘리먼트와 관련된 속성에 대한 것이라든지, 추가, 삭제, 생성등등의 기능을 지원하고 있습니다.
var obj = document.getElementById("testDivision");
obj.innerHTML = obj.innerHTML + htmlStr;
사실 설명할 내용도 없긴 하지만 innerHTML은 이름 그대로 해당 엘리먼트의 안에 있는 HTML을 의미하고 있습니다. 내부 HTML을 새로지정하면 새로 지정하는 내용으로 replace가 됩니다. 기본의 innerHTML값과 새로추가할 HTML스트링을 문자열로 이어붙혀서 다시 innerHTML으로 할당해서 HTML의 구조를 동적으로 바꾸는 것입니다. js를 실행하면 HTML이 아래와 같은 모습이 됩니다.
두번째 방법은 DOM입니다. DOM은 Document Object Model의 약자로 표준이 정해져 있고 대부분의 브라우저가 지원하고 있습니다. 엘리먼트를 추가/삭제같은 DOM Level 2에 정의가 되어 있습니다.(DOM Level 1에서 추가확장되어 현재는 대부분 Level 2를 지원하고 있는 것으로 알고 있습니다.) 이름대로 DOM을 다루기 위해서 만들어진 것이기 때문에 다양한 메서드를 제공하고 있고 좀 더 세련된 느낌의 사용법을 가지고 있습니다.
같은 기능을 DOM으로 구현한 것입니다. 엘리먼트 만들고 속성추가하고 TextNode만들어서 A엘리먼트 안에 넣은 다음에 추가한 것입니다. 메서드로 다양하게 다룰 수 있기는 하지만 저 간단한 소스도 소스로는 꽤 복잡하게 작성되고 있고 한눈에 어떻게 동작할 것인지를 파악하기가 쉽지 않고 복잡한 HTML의 경우에는 훨씬 복잡하게 됩니다. innerHTML에 비해서 특정엘리먼트만 지우는 remove관련 메서드도 지원하고 있기는 하지만 브라우져의 따라 DOM Level 1/2의 지원차이가 있습니다.
너무 간단한 코드라서 그냥 한 코드블럭에 다 썼습니다. 첫줄 insert만으로 위에서 설명했던 기능과 동일한 기능을 합니다. update는 replace의 기능을 합니다. 2번째 줄을 실행하면 Div안에 link2만 존재하게 되겠고 remove를 실행하면 testDivision DIV자체가 삭제되어버립니다. 간단한 기능만 소개했지만 그외에도 Element관련 다양한 기능을 제공하고 있습니다. prototype.js내부적으로 크로스 브라우징을 지원하기 때문에 브라우저호환에 대해서 큰 걱정없이 사용할 수 있습니다.
복잡한 사용방법이 있고 여러 특수문자와의 조합으로 배우기가 쉽지 않아 간단한 예제를 통해 설명한다.
1. 각 문자와 숫자는 해당 문자 또는 문자열이 테스트할 문자열에 있을경우 true 가된다.
<script> // 'a' 가 있는 문자열 모두가 TRUE (대소문자 구분) var filter = /a/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
<script> // "about" 가 있는 문자열 모두가 TRUE (대소문자 구분) var filter = /about/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
2. 대소문자 구분없이 해당 문자 또는 문자열을 검색할 경우 끝에 i 를 붙인다.
<script> // 'a' 또는 'A' 가 있는 문자열 모두가 TRUE (대소문자 구분 안함) var filter = /a/i if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
3. 여러개의 이어지는 내용들을 검색할 경우는 '-' 를 넣어 표현한다.
<script> // 'a' 에서 'z' 까지중 하나만 있으면 모두가 TRUE (대소문자 구분) var filter = /[a-z]/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
4. 여러가지의 문자 또는 문자열을 검색할 경우 '|' 를 넣는다.
<script> // 'a' 또는 'b' 또는 'c' 가 있는 문자열 모두가 TRUE (대소문자 구분) var filter = /a|b|c/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
<script> // 'a' 에서 'z' 까지 또는 '0' 에서 '9' 까지중 하나만 있으면 모두가 TRUE (대소문자 구분) var filter = /[a-z]|[0-9]/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
5. 해당 문자또는 문자열이 없는 경우를 검색할 경우 브래킷('[', ']') 안에 '^' 를 넣는다.
<script> // 'a' 에서 'z' 까지의 문자가 아닌 문자가 있을 경우 TRUE (대소문자 구분) var filter = /[^a-z]/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
6. 문자열의 첫번째 글자가 일치해야할 경우는 '^' 를 브래킷('[', ']') 밖에 넣는다.
<script> // 'a' 에서 'z' 까지의 문자로 시작하는 문자열일 겨우 TRUE (대소문자 구분) var filter = /^[a-z]/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
7. 문자열의 끝쪽 글자가 해당 문자 또는 문자열과 일치해야할 경우는 '$' 를 넣는다.
<script> // 'a' 에서 'z' 까지의 문자로 끝나는 문자열일 겨우 TRUE (대소문자 구분) var filter = /[a-z]$/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
8. 특수문자('\', '^', '$', '*', '+', '?', '.', '(', ')', '|', '{', '}', '[', ']')를 검색할 경우는 '\' 를 넣는다.
<script> // '\' 가 있는 문자열일 겨우 TRUE (대소문자 구분) var filter = /\\/ if (filter.test("some test words") == true) { alert("ok"); } else { alert("fail"); } </script>
[JavaScript] IE6 웹에서 png 투명파일 출력하기
Internet Explorer 7부터는 알파 PNG 이미지를 지원하기때문에 상관이 없지만 대다수가 아직 Internet Explorer 6 버전을 사용하고 있기에 종종 부자연스러운 이미지를 발견할 수 있다. 스크립트와 CSS를 이용하여 알파 PNG 이미지의 투명도를 설정할 수 있다. (ex.이미지의 클래스는 png24로 지정한다.)
다음과 같이 CSS를 정의한 후에 png 이미지의 클레스를 지정해 주면 png 파일도 웹에서 출력할 수 있다.
<script language="javascript"> function setPng24(obj) { var request_os = window.navigator.userAgent; var os_array = request_os.split(";");
/////////////////////// HTML / Javascript ////////////////////////
1. 용어 정리 (1) HTML (Hypertext Markup Language) 웹페이지를 표시하는 기본언어 최신의 HTML 표준은 4.01이지만 HTML을 XML과 결합한 XHTML(eXtensible Hypertext Markup Language)이 권고안으로 나와있다.
(2) CSS(Cascading Style Sheets) CSS 는 사용자 정의의 디자인 속성, 즉 글꼴, 크기, 색상, 이벤트 등을 지정할 수 있으며 CSS 를 사용한 모든 페이지는 기존 버전과의 호환성 되게 어떤 브라우저에서도 내용을 열 람할 수 있다. CSS 를 이용하여 설계자는 서로 다른 화면 해상도와 브라우저 상에서, 테이 블 없이도 동일하게 보여질 수 있는 페이지를 생성할 수 있다.
(3) XML(eXtensible Markup Language) XML(eXtensible Markup Language)은 HTML이나 CSS로서 표현되지 못하는 영역을 DTD를 이용하여 정의하여 사용자 정의의 태그를 생성하여 제작할 수 있는 메타 마크업 언어이다.
(4) DOM(Document Object Model) DOM(Document Object Model)은 웹페이지에 표현되는 모든 속성에 대해 객체화 하여 이를 자유 자재로 사용할 수 있도록 만든 것이다.
(5) ECMAScript (Javascript) 자바 스크립트는 W3C 표준으로 제정된 것은 아니다. 자바 스크립트는 주석 코드를 사용하여 비 호환성의 웹 브라우저로부터 숨겨져야 한다. 자바 스크립트는 HTML 문서의 Head 내에 위치해야 제대로 동작한다 따라서 문서의 Body 내에 자바 스 크립트를 위치시키는 것은 피해야 한다.
5. 일반 형식(Transitional)과 엄격한 형식(Strict) HTML 4.01 Transitional은 예전에 있었거나 없어진 태그도 지원하며, <font>에 지정된 스타일도 제대로 표현하여 준다.
HTML 4.01 Strict은 HTML을 엄격하게 적용한다. <font> 태그에 적용된 스타일 보다는 CSS파일에서 지정된 스타일을 지켜 표현 해야 한다.
가장 최상의 브라우저 호환성을 제공해 주는 문서 형식은 XHTML 1.0 Transitional을 사용하는 것이다.
6. XHTML 일반 문법 준수 (1) 정확한 문서 구조 준수 문서의 루트 요소는 html이 되어야 하며, 이 html 요소는 XHTML 네임스페이스를 지정해야 한다. <html xmlns="http://www.w3.org/1999/xhtml"> 표준 문서에는 head, title 및 body 구조 요소가 포함되어야 한다. 프레임 세트 문서에는 head, title 및 frameset 구조 요소가 포함되어야 한다
(2) 모든 요소는 완벽하게 중첩되어야 한다. <p>This is a <i>bad example.</p></i> <p>This is a <i>good example.</i></p>
(3) 모든 속성 값은 인용 부호(“나 ‘)로 묶어야 한다. <a href=http://sample.com>틀린 경우</A> <a href="http://sample.com">맞는 경우</a>
(1) CSS의 선언 <1> Selector 와 선언부 (p.text : Selector, {} : 선언부) p.text { margin: 0; } <2> Selector는 ,로 구분할 수 있다. p.text, span.name { color: #666; } <3> 일반 선택자 - 공용 선택자 * : 모든 태그 지정 div.search * { vertical-align: middle } --> div.search 안의 모든 엘리먼트가 다 적용 - 타입 선택자 A : 태그 A 지정 - 클래스 선택자 .A : 클래스가 A인 태그를 지정 - ID 선택자 #A : 아이디가 A인 태그를 지정 <4> 복합 선택자 - 하위 선택자 A B : 태그 A로 감싸져 있는 모든 태그 B 지정 <ul id="list"> <li><a href="list.html?id=34&type=blah">item 34</a></li> <li><a href="list.html?id=35&type=blah">item 35</a></li> ... ... <li><a href="list.html?id=99&type=blah">item 99</a></li> </ul> --> a 태그에 속성 지정시 ul#list a:link, ul#list a:visited { color: #999; } ul#list a:hover, ul#list a:active { color: #000; } --> 한방에 해결 - 자식 선택자 A > B : 태그 A로 감싸져 있는 바로 하위단계 B만 지정 <ul class="depth1"> <li> <a href="about.html">Company</a> <ul class="depth2"> <li> <a href="overview.html">Overview</a> </li> <li> <a href="ceo.html">Ceo.html</a> </li> </ul> </li> </ul> ul.depth1 li { background: #f9f9f9; border-bottom: 1px solid #ddd; } ul.depth1>li { background: #f9f9f9; border-bottom: 1px solid #ddd; } - 인접 선택자 A + B : 태그 A와 B가 연속으로 나와 있는 것을 지정 <h2>브라우져 워</h2>
<p>웹스탠다드를 보다 잘 이해하기 위해서는 브라우져 워에 대해서 짚어볼 필요가 있습니다.</p>
<h2>어쩌고 저쩌고</h2>
<p>또다시 어쩌고 저쩌고</p>
--> 제목 뒤 첫글자만 크게 하고 싶다면?? h2+p:first-letter { float: left; font-size: 2.2em; } <5> 가상 클래스 선택자 - :first-child선택자 A:first-child : 태그 A로 감싸져 있는 가장 처음 태그 지정 - 언어선택자 A:lang(B) : 태그 A중 언어가 B인 태그 지정 - 링크선택자 A:link : 태그 A중 링크가 걸려있는 것 지정 A:visited : 태그 A중 링크가 걸려있고, 사용자가 이미 클릭한 태그 지정 - 동적선택자 A:active : 태그 A중 사용자가 마우스를 누르고 있는 태그 지정 A:hover : 태그 A중 사용자가 마우스 포인터를 위에 올려놓은 태그 지정 A:focus : 태그 A중 사용자의 키보드 입력을 받는 태그 지정 <6> 동적 선택자 - :first-line선택자 A:first-line : 태그 A의 문단중 첫번째 줄 지정 - :first-letter선택자 A:first-letter : 태그 A의 문단중 첫번째 글자 지정 - :before선택자 A:before : 태그 A의 문단 앞을 지정 - :after선택자 A:after : 태그 A의 문단 뒤를 지정
(2) CSS 선언 방법 <1> 외부 선언 (external css) - 우선순위가 낮다. <link rel="stylesheet" type="text/css" href="myCss.css" /> <2> 엘리먼트에 직접 선언 (inline css) <div style="padding: 10px; border: 1px solid #eee;"> <p>contents</p> </div> <3> 사용자 정의 스타일 (user defined css) 가장 우선 순위가 높은 선언으로 웹페이지 제작자가 선언하는 것이 아니라 웹사이트를 이 용하는 사용자가 직접 자신에게 맞는 스타일을 선언하는 방법이다.
(3) CSS 적용의 체크 포인트 4가지 <1> XHTML이 표준 문법이어야 한다. <2> XHTML 문서가 의미와 구조적으로 구성되어야 한다. <3> CSS가 표준 문법이어야 한다. <4> CSS를 표준대로 잘 구현한 브라우져를 이용해야 한다.
(4) CSS Editor Firefox plugin <1> Web Developer 확장 기능 <2> HTML Tidy
8. DOM / Script 문서 객체 모델(DOM; Document Object Model)은 HTML내에 들어 있는 요소를 구조화 객체 모델로 표현하는 형식이다. DOM은 플랫폼/언어 중립적으로 구조화된 문서를 표현하는 W3C 표준 모델이 기반이 된다.
(1) 객체 접근방법 <1> document.getElementById(aId) <2> document.getElementByTagName(aTagName) <3> 기존방식 밖에 지원안하는 IE 지원 function getObject(objectId) { if(document.getElementById && document.getElementById(objectId) { return document.getElementById(objectId); // check W3C DOM } else if (document.all && document.all(objectID) { return document.all(objectID); // IE4 } else if (document.layers && document.layers[objectID] { return document.layer[objectID]; // NN4 } else { return false; } } (2) 객체 사용 방법 구성요소의 내용을 바꾸거나 수정하는 innerText, innerHTML, outerText, outerHTML을 사용하는 것은 원래 잘못된 것이다. 왜냐하면 이는 W3C DOM 표준이 아니고 MS DOM 이기 때문이다. firefox에서는 innerHTML만이 지원된다. 나머지는 지원불가!
속성 사용 1. x.id 나 x.style 같은 방법으로 먼저 속성을 찾는다. 2. 값이 나오지 않으면 x.getAttribute(“align”)나 x.getAttributeNode(“align”).value 로 찾는다. 3. 그래도 나오지 않으면 다른 속성 인터페이스를 시도하되, attributes[]는 절대 사용하지 않는다.
/*-----------------------------------------------------------------------------*/ // 특수문자 체크 // - obj : form name /*-----------------------------------------------------------------------------*/ function inputCheckSpecial(obj){
var ft = "true"; obj = obj.elements; for (var i = 0; i < obj.length; i++){
var strobj = obj[i].value; //입력값을 담을변수. re = /[~!@\#$%<>^&*\()\-=+_\']/gi; if(re.test(strobj)){ alert("특수문자는 입력하실수 없습니다."); obj[i].value=strobj.replace(re,""); obj[i].focus(); ft += ",false"; }else { ft += ",true"; }//end if
}//end if }//end for
if (ft.indexOf("false")!=-1){ return false; }else{ return true; } }
var chks; var frame = document.getElementById(obj); chks = document.all.popChk;
if(chks.length == undefined && chks.value!=''&& chks.value!=null){ var divID = chks.value; var emt = document.getElementById(divID); emt.removeNode(true); }else{ for(i=0; i<chks.length; i++) { if(chks[i].checked) { var divID = chks[i].value; var emt = document.getElementById(divID); emt.removeNode(true); i--; } //end of if }//end of for }//end of ifelse
function clearDetail(){ var es = document.all.tags("span"); if (es!=null) { for (var i = 0; i < es.length; i++) { var oname = es[i].id; try { if(oname.indexOf('detail_') > -1){ document.getElementById(oname).innerHTML = " "; } } catch (e) {}//end of try catch
function getCookie(Name) { var search = Name + "=" if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면 offset = document.cookie.indexOf(search) if (offset != -1) { // 쿠키가 존재하면 offset += search.length // set index of beginning of value end = document.cookie.indexOf(";", offset) // 쿠키 값의 마지막 위치 인덱스 번호 설정 if (end == -1) end = document.cookie.length return unescape(document.cookie.substring(offset, end)) } } return ""; } function saveid(form) { var expdate = new Date(); // 기본적으로 30일동안 기억하게 함. 일수를 조절하려면 * 30에서 숫자를 조절하면 됨 if (form.checksaveid.checked) expdate.setTime(expdate.getTime() + 1000 * 3600 * 24 * 30); // 30일 else expdate.setTime(expdate.getTime() - 1); // 쿠키 삭제조건 setCookie("saveid", form.id.value, expdate); } function getid(form) { form.checksaveid.checked = ((form.id.value = getCookie("saveid")) != ""); } </script> </head> <body onLoad="getid(document.mainform)"> <form name=mainform> 아이디 <input type=text name=id> 암호 <input type=password name=pw> <input type=checkbox name=checksaveid onClick="saveid(this.form)">아이디 기억 </form> </body> </html>
가로정렬 좌우 스크롤 배너
소스의 기본-샵의 레이아웃 전체 사이즈가 900픽셀이고 자동스크롤되면서 슬라이드되는 것을 좌측과 우측에 동시 적용이 되며, 좌측과 우측에 나타날 내용의 폭을 48픽셀로 하였슴(이 픽셀값은 자신의 샵에 맞게 수정 가능). 스킨폴더의 head.html 파일의 임의의 곳에 추가하시면 됩니다.
[소스 시작] [code2]<!--왼쪽스크롤시작--> <script language="JavaScript"> <!-- // 스크롤메뉴 var bNetscape4plus = (navigator.appName == "Netscape" && navigator.appVersion.substring(0,1) >= "4"); var bExplorer4plus = (navigator.appName == "Microsoft Internet Explorer" && navigator.appVersion.substring(0,1) >= "4");
function always_pos1() { var yMenuFrom, yMenuTo, yButtonFrom, yButtonTo, yOffset, timeoutNextCheck;
if ( bNetscape4plus ) { // 네츠케이프 용 설정 yMenuFrom = document["scrollmenu1"].top; yMenuTo = top.pageYOffset + 100; // 화면 위쪽으로 부터의 위치 } else if ( bExplorer4plus ) { // 익스플로러 용 설정 yMenuFrom = parseInt (scrollmenu1.style.top, 10); yMenuTo = document.body.scrollTop + 100; // 화면 위쪽으로 부터의 위치 }
댓글을 달아 주세요
관리자만 볼 수 있는 댓글입니다.
유용하게 쓰기길 바랍니다..^^*
잘쓸게요~
넹~^^*