document.my_image.height = "100px"; document.my_image.width = "200px";그렇지만 넷스케이프 4.0에서는 자바스크립트를 사용하여 height와 width의 특성을 변경할 수 없다. 여기에서 최선의 방법은 이미지를 DIV 안에 집어 넣고 자바스크립트를 사용하여 그 DIV를 다시 쓰는 것이다.
document.the_div.document.write(""); document.the_div.document.close();첫 번째 라인은 DIV의 내용을 화면에 쓴다. 두 번째 라인은 문서를 닫는데, 이렇게 해야 종종-과묵한 네트스케이프(Netscape)에게 강제로 여러분이 변경한 것을 웹 페이지에 쓰도록 만들 수 있다.
Designing with JavaScript, 2nd Edition | ||
var my_timeout = setTimeout("someFunction();", some_duration_in_milliseconds);setTimeout() 함수의 첫 번째 매개변수는 앞으로 언젠가 호출하고자 하는 함수의 이름을 결정한다. 두 번째 매개변수는 기다리고자 하는 시간을 1000분의 1초 단위로 설정한다(1초는 1000 밀리초). 그래서 앞으로 2초 후에 함수를 호출하고자 한다면 두 번째 매개변수는 2000이 되어야 한다.
clearTimeout(the_timeout);다음은 이미지 크기를 변경하고 setTimeout()을 사용하여 자신을 호출하는 함수의 예이다.
function growImage() { document.my_image.width = parseInt(document.my_image.width) + 10; document.my_image.height = parseInt(document.my_image.height) + 10; if (parseInt(document.my_image.width) < 200) { my_timeout = setTimeout("growImage();", 100); } }위 함수에서 첫 번째 두 라인은 IE4+와 NN6+에서 이미지 크기를 변경한다. if-then 서술문은 시간제한을 설정하여 이미지의 너비가 199 픽셀을 넘지 않을 때까지 10분의 1초 단위로 growImage() 함수를 호출한다. 이미지의 크기를 획득하고자 parseInt() 함수를 사용한 것에 주목하자. 이미지의 너비를 읽을 때 어떤 브라우저들은 "50px"와 같은 것을 반환하곤 한다. 이것은 숫자 10에 더할 때 문제를 발생시킬 수 있다. parseInt() 함수는 문자열에서 발견하는 첫 번째 정수를 나포하기 때문에 이미지의 width와 height 특성이 수치 값으로 설정될 것이라고 확신해도 좋다.
이렇게 한 까닭은 넷스케이프 4.0이 동적인 이미지 크기 변경을 허용하지 않기 때문이다. 넷스케이프 4.0에서는 이런 DIV의 내용을 다시 화면에 뿌려서 이미지를 변경해야 한다. 다른 브라우저에서는 작업하기가 더 쉽다. 그냥 이미지의 height와 width 특성을 변경하기만 하면 되기 때문이다. 다음은 이미지를 마우스오버 시에 커지도록 만드는 함수이다.
function makeBig() { var the_image; // 만약 브라우저가 NN6나 IE4+라면 if (document.documentElement || document.all) { the_image = document.the_button; the_image.height = the_image.height + 2; the_image.width = the_image.width + 2; } else if (document.layers) // NN4 { the_image = document.justforNS4.document.the_button; var new_width = the_image.width + 2; var new_height = the_image.height + 2; var write_string string = ""; document.justforNS4.document.writeln(write_string); document.justforNS4.document.close(); } if (parseInt(the_image.height < 110) { setTimeout("makeBig();", 10); } }일단 이 함수는 어떤 이미지 변경 방법을 사용해야 하는가를 점검한다. W3C DOM 준수 브라우저와 IE4+라면 이미지 크기를 변경하고, 그렇지 않고 넷스케이프 4라면 DIV를 재작성하는 것이 바로 점검사항이다. W3C DOM을 준수하는 브라우저(Netscape 6.0+, IE 5+)는 document.documentElement 특성을 인식하고, 모든 IE4+ 브라우저들은 document.all 특성을 인식하기 때문에, 다음 라인은
if (document.documentElement || document.all)이미지를 변경할 수 있도록 해주는 모든 브라우저들을 알아챌 것이다. 만약 브라우저가 document.documentElement나 document.all을 인식하지 않으면, 스크립트는 그 브라우저가 넷스케이프 4의 특성인 document.layers를 인식하는지 점검한다. 그런 후, 이 코드는 DIV의 내용을 화면에 다시 뿌린다.
var my_div = document.getElementById("myDiv"); my_div.style.fontSize = "36px";IE5/Mac을 사용한다면 주의해야 한다. 이 브라우저에서는 만약 위치가 지정된(positioned) 요소 안에 그 폰트가 있다면 폰트 스타일 정보를 변경할 수 없기 때문이다. IE5/Mac에서 텍스트에 활력을 불어 넣고자 한다면 그 텍스트가 위치가 지정된 요소 안에 있지 않다는 것을 확실하게 해두어야 할 필요가 있다.
var my_div = document.all.myDiv; my_div.style.fontSize = "36px";그리고 NN4에서는 다음과 같다.
var my_div = window.myDiv; document.my_div.document.write("This is my text); document.my_div.document.close();춤추는 문자 데모는 이러한 종류의 작업이 실제로 실행되는 것을 보여준다(IE5+와 NN6+ 전용). 각 문자는 자신만의 SPAN에 있다.
h
애니메이션은 각 SPAN을 통과하면서 fontSize를 자신의 스타일에 맞추어 변경한다.
var timeout; function dance() { var mySpans = document.getElementsByTagName("span"); var size; var loop = 0; while (mySpans.item(loop)) { size = Math.floor(Math.random() * 60) + 12; mySpans.item(loop).style.fontSize = size; loop++; } timeout = setTimeout("dance();",500); }함수에서 앞의 세 줄은 몇 개의 변수를 선언하고 있다. 첫째 값은 페이지에 있는 모든 SPAN들을 담은 목록을 획득한다. 일단 그 변수들이 설정되면 while 루프는 item() 메소드를 사용하여 SPAN 리스트를 통과한다. 통과할 때마다 random() 메소드는 무작위 수를 12에서 72까지 발생시키고, 적절한 SPAN의 fontSize는 그 숫자로 변경된다. getElementsByTagName()이나 item() 메소드에 익숙하지 않다면 "the new DOM"이라는 기사를 한번 읽어보기 바란다.
참고 도서 |
var the_style = getStyleObject("myDiv"); var the_left = parseInt(the_style.left) + 100; var the_top = parseInt(the_style.top) + 100; if (document.layers) { the_style.left = the_left; the_style.top = the_top; } else { the_style.left = the_left + "px"; the_style.top = the_top + "px"; }일단 스크립트는 getStyleObject() 함수를 사용하여 스타일 시트를 획득한다. 그 다음에 DIV의 top과 left 좌표에 대해 새로운 값을 계산한다. 다음으로 계산한 새로운 값을 그 DIV의 left와 top 특성에 할당한다. 페이지를 보고 있는 브라우저(넷스케이프 4)가 document.layers를 지원하면 스크립트는 새로운 숫자를 left와 top 특성에 할당한다. 브라우저가 넷스케이프 4가 아니라면 스크립트는 "px"를 숫자끝에 붙이고 그것을 left와 top 특성에 할당한다.
if (new_left < 400) { the_timeout = setTimeout("moveDiv();",10); }그렇지않고 그 DIV가 일정 지점에 도달하면 방향을 틀도록 만들 수도 있으며 또는 시작했던 지점에서 다시 시작하도록 만들 수도 있다.
var the_points = next_point.split(":"); var left = the_points[0]; var top = the_points[1];split() 함수는 문자열 하나를 취해 제공한 구분자(delimiter)에 근거하여 그것을 배열로 조각낸다. split()가 여러분 대신 일을 처리해주므로 미리 배열을 만들 필요가 없다. 따라서 위의 라인에서 문자열 "160:100"은 두 개로 조각나서 the_points 안으로 적재된다. the_points에서 첫번째 요소인 the_points[0] 은 160이 될 것이다. 그리고 두 번째 요소인 the_points[1] 은 100이 될 것이다.
function moveDiv(array_position) { // 스타일시트를 획득한다 // var the_style = getStyleObject("myDiv"); if (the_style) { // 배열에서 다음 지점으로 간다 // array_position = array_position + 1; // 배열의 끝을 지났다면, // 위치 0에서 시작한다 // if (array_position >= the_coords.length) { array_position = 0; } // 지점 "120:100"을 요소를 두 개 가진 배열로 변형한다 // : left와 top요소를 가진다. // var next_point = the_coords[array_position]; var the_points = next_point.split(":"); var left = the_points[0]; var top = the_points[1]; // 이제 left와 top의 특성을 // 적절하게 설정한다 // if (!document.layers) { left = left + "px"; top = top + "px"; } the_style.left = left; the_style.top = top; // 그리고 현재 배열 위치를 가지고 // 다시 moveDiv()를 호출한다 the_timeout = setTimeout("moveDiv(" + array_position + ")",100); } }moveDiv() 함수에 대한 호출에는 애니메이션이 자취를 따라 다음으로 가야 할 곳을 표현하는 숫자 하나가 동반된다. 다시 말해 그 숫자는 어느 요소가 배열에서 다음으로 처리될 필요가 있는지를 가리킨다. 애니메이션을 촉발하는 링크는 배열의 첫 번째 요소인 0번 요소에서부터 시작한다.
start moving!위 함수는 먼저 DIV에 대한 스타일시트 정보를 획득한다. 그런 후, array_position에 0을 더해 배열에서 다음 좌표를 알 수 있도록 한다. 새로운 array_position이 자취 배열의 끝을 넘어서면 array_position은 0으로 재설정된다.
the_timeout = setTimeout("moveDiv(" + array_position + ")",100);다음 코드가 작동할 거라고 생각할지도 모르겠다.
the_timeout = setTimeout("moveDiv(array_position)",100);안타깝게도 array_position 변수는 moveDiv() 함수 안에서만 존재한다. moveDiv() 함수가 종료하면 array_position 변수는 사라진다. 100 밀리초 단위로 setTimeout() 함수가 moveDiv() 함수를 다시 호출하려고 시도하면 자바스크립트는 array_position의 값을 찾아 보려고 시도할 것이다. moveDiv() 함수의 반복이 끝날 시점에 자바스크립트는 그 변수가 무엇인지 알지 못하므로 에러가 발생한다.
var first_anchor = the_coords[array_position]; var second_anchor = the_coords[array_position+1];그리고 나서 1을 array_position 변수에 더하고 배열의 끝에 도달하지 않았음을 확인한다. 배열의 끝이라면 getAnchors() 함수는 위치를 0으로 재설정하는데, 이는 애니메이션이 처음부터 다시 시작할 것이라는 것을 뜻한다.
array_position++; if (array_position == the_coords.length-1) { array_position = 0; }다음 구역을 결정한 후, 이 함수는 moveDiv()를 호출하여 실제로 DIV를 이동시킨다.
moveDiv(array_position, first_anchor, second_anchor, 0, 0);moveDiv()에 보내지는 전반부의 변수 세 개는 각각 현재 배열 요소, 첫 번째 앵커의 좌표, 두 번째 앵커의 좌표를 가리킨다. 후반부의 매개변수 두 개는 얼마나 멀리 DIV를 수직과 수평으로 이동시키는지를 추적 유지한다. 처음에는 그 값들이 무엇인지 알 수 없을 것이다. 그래서 여기에서는 그냥 0을 넣어 두기만 하면 된다. 매번 DIV를 얼마나 이동시킬지는 moveDiv() 함수에 달려 있다.
var first_points = anchor_one.split(":"); var first_left = parseInt(first_points[0]); var first_top = parseInt(first_points[1]);여기에 다시 split() 함수가 사용되고 있는데 "100:120"처럼 보이는 앵커를 두 개의 숫자로 분리한다.
if ((horizontal_step_size == 0) && (vertical_step_size == 0)) { horizontal_step_size = getStepSize(anchor_one, anchor_two, 0); vertical_step_size = getStepSize(anchor_one, anchor_two, 1); }getStepSize()에 대해서는 조만간 더 자세하게 설명하겠다. 건너뜀 크기가 결정되면 DIV의 현재 위치에 그 건너뜀 크기를 더해 새로이 left와 top 좌표가 계산된다.
var new_left = first_left + horizontal_step_size; var new_top = first_top + vertical_step_size;DIV를 움직이기 전에 구역의 끝 앵커를 지나치지 않을 것이라는 것을 확실히 해둘 필요가 있다. 이것은 실제로 처음에 짐작했던 것보다 더 트릭이 필요하다. 나는 atEndOfPath()라고 부르는 함수를 따로 작성하여 DIV가 끝 앵커를 지나치기 시작하는지 알아 보았다. atEndOfPath() 함수는 건너 뜀 크기와, 구역의 마지막 위치, moveDiv() 함수가 DIV를 어디로 옮기기를 원하는지에 대해 알아두어야 한다. 이러한 숫자에 근거하여 atEndOfPath()는 DIV가 구역의 마지막을 지나치기 시작하면 참(true)을 반환하고 그렇지 않으면 거짓(false)을 반환한다. 구역의 마지막을 지나서 움직이기 시작하면 대신에 DIV는 마지막 앵커로 움직여야 한다.
if (atEndOfPath(left_step_size, second_left, new_left) ||(atEndOfPath(top_step_size, second_top, new_top))) { new_left = second_left; new_top = second_top; }이제 넷스케이프 네비게이터 4가 페이지를 렌더링 하지 않는 한 DIV를 움직이기 전에 해야 할 일은 "px"를 좌표의 끝에 추가하는 작업뿐이다.
if (!document.layers) { new_left = new_left + "px"; new_top = new_top + "px"; }그리고 결국, DIV를 움직일 수 있다.
the_style.left = new_left; the_style.top = new_top;그러나 DIV가 움직인 후에도 해야 할 일이 더 있다. 스크립트가 다음으로 무엇을 해야 할지 알아야 한다. 이에는 다음과 같은 두 가지 상황이 있다. 스크립트가 구역의 끝에 도달하면 getAnchor()를 호출하여 다음 구역에 대하여 작업을 시작해야만 한다. 만약 스크립트가 구역의 끝에 도달하지 않았다면 moveDiv()를 잠시 후에 다시 호출하여 DIV를 그 구역을 따라 약간씩 이동시켜야 한다.
if ((parseInt(new_left) == parseInt(second_left)) && (parseInt(new_top) == parseInt(second_top))) { getAnchors(array_position); }DIV가 구역의 끝이라면 getAnchors()를 호출하여 다음 앵커 집합을 획득해야 한다. 두 번째 부분은 약간의 트릭이 더 필요하다. 정확한 매개변수를 가지고 moveDiv()를 다시 호출해야 한다. moveDiv()에 대한 호출에는 다음과 같은 다섯 개의 매개변수가 있다. 배열의 자취가 얼마나 긴가, 움직임 시작될 위치, 끝나는 곳의 위치, 수평 건너뜀 크기, 수직 건너뜀 크기. 아마도 다음과 같을 것이다.
moveDiv(1, "120:100", "140:100", 10, 0);함수에서 후반의 세 줄은 문자열을 만들고난 후, setTimeout()를 사용하여 함수를 100분의 1초마다 호출한다.
var new_anchor_one = new_left + ":" + new_top; var timeout_string = "moveDiv(" + array_position + ", "" + new_anchor_one + "", "" + anchor_two + "", " + left_step_size + "," + top_step_size + ");"; the_timeout = setTimeout(timeout_string, 10);다음 함수는 DIV가 구역 경계를 넘어가기 시작했는지 아닌지를 결정한다.
function atEndOfPath(the_step_size, second_number, new_number) { var the_end = false; if (((the_step_size > 0) && (new_number > second_number)) || ((the_step_size < 0) && (new_number < second_number))) { the_end = true; } return the_end; }이 함수가 취하는 매개변수는 각각 매번 DIV가 이동해야 할 양, 세그먼트의 끝, DIV가 움직이기 시작할 위치를 가리킨다. 고려해야 할 조건은 다음과 같이 두 가지가 있다. 만약 the_step_size가 양수라면 이것은 DIV가 오른쪽이라 아래로 움직인다는 것을 뜻한다. 따라서 new_number 매개변수(다음에 움직일 건너 뜀크기)가 second_number보다 크다면 DIV는 너무 멀리 가버릴 것이다. 반면, the_step_size가 음수라면 이것은 DIV가 왼쪽이나 위로 움직일 것이라는 것을 뜻한다. 따라서 new_number가 second_number보다 작다면 DIV는 너무 멀리 가버린다.
이전 글 : PC 되살리기
다음 글 : 디지털 권리의 미래
최신 콘텐츠