발생일: 2011.04.23

문제:
얼마 전 QA에서 아래와 같은 버그를 등록했다.
특정 버튼에서 오른쪽 마우스 버튼을 눌러 새탭으로 열었을 때, 기대하는 페이지가 아닌 동일한 페이지가 열린다는 것이다.

해당 버튼은 click 이벤트에 의해 스크립트로만 동작하는 것이었으며, 대충 아래와 같은 형태이다.
(실제로 이벤트는 스크립트에서 바인딩한다.)

    <a href="#" onclick="doSomething(); return false;">This is button.</a>
 
스크립트로만 동작하고 기본 동작을 막아뒀기 때문에 클릭했을 때에는 아무런 문제가 없다.
하지만 앵커 태그이기 때문에 새탭으로 열었을 경우엔, 현재 페이지에 #이 덧붙여져 열리게 되는 것이다.

이건 버그라고 할 수 있을까?


해결책:
실제로 여러 포털에 이런 문제가 있는 버튼들이 굉장히 많다.
앵커 태그로 버튼을 구현해 스크립트로 추가 기능을 제공하는 버튼들이 그것들이며,
주로 레이어를 전환하거나, 도움말 레이어를 여는 등의 기능을 한다.
뭐, '문제'라고까지 하기에는 좀 사소하다고 생각할 수도 있다.

사실, 이건 기획을 마크업으로 옮기면서부터 발생한 문제였다.

앵커 태그를 버튼처럼 사용하고 스크립트에 의해 추가 동작을 구현하고자 한다면:
  1) 스크립트를 통해 추가 기능을 제공한다.
  2) 만약 스크립트가 제공되지 않으면 같은 기능을 하는 다른 페이지로 이동할 수 있도록 해준다.

웹접근성을 확보하는 기초 내용 중의 하나이다.
대체 페이지가 존재하지 않고 스크립트에 의해서만 동작하는 기능이라면, 앵커 태그보다는 버튼 태그를 써야했다.


아래 구글의 더보기 버튼을 보자.

구글 메인 화면의 더보기 버튼




'더보기' 버튼을 누르면 그림과 같이 다른 메뉴에 대한 레이어가 제공된다.
그렇다면, '더보기' 버튼에서 새탭으로 열기를 하면 어떻게 될까?


더보기 버튼을 새탭으로 열기



기대했던 대로, 더보기와 관련된 '구글 제품 더보기' 페이지로 이동한다.
이처럼 앵커 태그를 쓰고자 한다면 스크립트 없이도 이동할 페이지를 제공해줘야 한다.


아래는 구글의 검색 결과 화면이다.
좌측 서브 메뉴 영역의 더보기 버튼은 앵커 태그로 작성되어 있지만 대체 페이지를 제공하지 않는다.
새탭으로 열면 어떻게 될까?



예상했던 대로, 새탭으로 열 경우 현재 경로에 #이 붙은 페이를 띄운다. 즉, google.co.kr/# 으로 이동한다.
원하지 않는 결과다.


버튼 타입의 태그(input[type=button], button)일 경우, 컨텍스트 메뉴를 열어도 새탭으로 열기 기능을 제공하지 않는다.
버튼 태그로 되어 있는 구글의 검색 버튼에 오른쪽 마우스 버튼을 클릭하면 아래와 같이 링크를 여는 기능을 제공하지 않는다.




결론:
  앵커 태그에 스크립트로 추가 기능을 제공할 때에는 항상 대체 페이지도 함께 제공해야 한다.
  단순히 스크립트로만 작동하는 기능이라면 버튼 타입의 태그를 사용하자.








저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2010.03.11

문제:
얼마 전에 파이어폭스를 업데이트 받았는데, video 태그를 지원한다고 하더군요.
오픈비디오 타입으로 <video> 태그를 구현하면, 플러그인 추가 없이 바로 재생이 가능한 태그라는 설명입니다.

요게 아마 소문으로만 듣던 HTML5 가 아닐까 하는 생각이 들었습니다.
HTML5 에서는 AJAX 도 스크립팅 없이 태그로 바로 구현되지 않을까,
Comet 같은 서버 푸시형 요청이나 스트리밍 통신 같은 것도 지원되지 않을까 하는 생각이 문득 들었습니다.

HTML5 의 정확한 스펙이 뭘까요.


해결책:
스티브잡스가 '어도비 너네 이제 맘에 안들어. 플래시 안 쓸 거야. 대신 HTML5 쓸 거야.' 이런 이후로,
HTML5 에 대한 관심이 더 커졌다고 합니다.

HTML5 에 대한 좋은 포스트가 많네요.^^

HTML5의 모든 것
정말 좋은 자료를 모두 모아둔 포스트입니다. 추천.


HTML5 에 대한 인터뷰 형식의 포스트입니다.
인터뷰 형식이라 더 이해하기 쉽고 쏙쏙 들어오네요.^^
포럼에서처럼 구글 페이지의 소스를 열어보니 정말 HTML5 형식으로 선언되어 있습니다.



아직 국내 포털에는 적용되어 있지 않습니다.
HTML5 최종 표준안이 기대됩니다.


앞으로 개인 작업은 HTML5 로 진행해 봐야겠습니다.
저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG html5
발생일: 2009.05.15

문제:
브라우저별로 opacity를 적용하는 방법에 대한 정리가 필요하다.

해결책:
브라우저별 opacity를 적용하는 방법에 대해 매우 깔끔하게 정리되어 있는 사이트가 있다.

요약하자면,
.opacity {
-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=50)"; // IE-8
filter: alpha(opacity=50); // IE-7
opacity: .5; // all-browser
}

이렇게 해주면 되겠다.




저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG CSS, opacity
발생일: 2009.05.08

문제:
아래처럼 td 안에 img 태그를 넣었는데 태그간 공백으로 인해
테이블 사이즈가 늘어나고 정상적으로 정렬이 되지 않는다.

<td>
    <img src="a.gif"/>
    <img src="b.gif"/>
</td>

이미지 공백을 무시하고 싶다.

해결책:
img 의 css 속성에 vertical-align 을 top 으로 고정시켜 준다.
같은 상황에 대해 자세히 설명해 둔 블로그가 있다.

이와 비슷한 상황으로,
img 태그에 a 링크를 줬을 때 이미지 하단에 작게 공백이 생기는 경우가 있다.
이 때에는 display에 block 속성을 주면 된다. (모질라 커뮤니티의 글타래 참조)




저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.04.23

문제:
css 로 간단하게 버튼을 디자인하려고 하는데 정리된 사이트가 없을까..?

해결책:
버튼의 기본적인 css 스타일 설정에 따른 버튼 모습을 보여주는 페이지. 간단하여 참고할 만 하다.

튼튼한 CSS 버튼 만들기라는 블로그 페이지. css를 활용하여 만든 버튼을 정리해놓았다.


css button 으로 구글링하니 많다....
저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.03.31

문제:
누군가가 코딩 규칙 없이 엉망으로 html을 코딩해뒀을 경우,..
페이지 레이아웃이... 테이블에 테이블에 테이블에 테이블에 테이블에 테이블에 테이블로 짜여있을 경우,..
눈물을 머금고 HTML 코드를 정리하고 싶을 경우,..

해결책:
웬만한 플러그인들은 배보다 배꼽이 큰 경우가 많다...
부담없이 Online HTML Formatter 를 사용해보자.

HTML Formatter 로 구글링 해도 좋다.



저작자 표시 비영리 변경 금지
Posted by ohgyun
발생일: 2009.03.28

문제:
a 태그의 앞 또는 뒤에 공백이 생긴다.

해결책:
display가 inline 속성일 경우, a 태그의 앞 또는 뒤에 공백이 생기는 경우가 발생한다. (관련 테스트 글)
간단하게 태그 사이의 공백을 제거해주거나 (가독성이 떨어질 수 있다),
display를 block으로 설정하고 float에 left 속성을 주면 해결할 수 있다.


저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG A, inline, 공백
발생일: 2009.03.15

문제:
IE6의 box modeling 방식이 IE7/FF 와 달라 정확한 layout 표시가 어렵다.
pixeldraw의 canvas를 그리면서 문제가 발생.

해결책:
IE6와 IE7/FF의 box modeling 방식을 이해하고, CSS Hack 을 적용해 해결한다.

간단하게,

height: 15px; // 모든 브라우저

#height: 15px; // IE 전용
_height: 21px; // IE6.0 과 이전버젼용

와 같이 구현해주면 된다.

또한, IE6에서 float:left; 를 적용할 경우 margin이 중복되어 적용되는데,
이 때에는 _display:inline; 을 적용해주면 된다.
저작자 표시 비영리 변경 금지
Posted by ohgyun
TAG BOX, div, IE6, IE7, MARGIN
Element.ChildNodes 로 참조받은 배열은 해당 Child 노드들이  재구성 될 때  같이 갱신됨.

  ex)  <div id="pNode">
           <span id="c1"></span>
           <span id="c2"></span>
        </div>

       와 같은 Element 들이 있을때,

       var parentNode = document.getElementById("pNode");
       var arrNodes = parentNode.childNodes;

       alert("First Child : " + arrNodes(0).id + ", "Second Child : " + arrNodes(1)).id;
       // First Chlid : c1, Second Child : c2 가 출력됨.
      
       parentNode.removeChild(arrNodes(0));      // 첫번째 ChildNode 삭제.

       alert("First Child : " + arrNodes(0).id + ", "Second Child : " + arrNodes(1)).id;
       //First Chlid : undefined, Second Child : c2 가 출력될꺼라 예상되지만, 실제로는
       //First Chlid : c2, Second Child : undefined 가 출력됨.


RE: 그럼 언제 c2가 arrNodes(0)으로 되는 거지?
      (child nodes가 재구성 되는 때가 언제란 얘기?)


RE: RE: ChildNode가 삭제되는 시점. 더 정확한 시점은 브라우저 만든 사람만 알겠지만 ㅎㅎ



RE: RE: RE: ChildNode가 삭제되는 시점이 removeChild할 때를 얘기하는 건가?
                    아니면 가비지컬렉션(?같은 개념?)에서 삭제할 때를 얘기하는 건가?
      
RE: RE: RE: 이야기가 좀 새지만, 자바스크립트 자체는 가비지 컬렉션 같은 개념이 없지. 스크립트에 할당되는 모든 메모리는 브라우져가 관리한다고 생각되는데.. removeChild 나 addChild등을 통해서 배열이 참조한 대상 객체가 갱신될 때 배열도 갱신되는것으로 생각됨.
저작자 표시 비영리 변경 금지
Posted by ohgyun
메일을 보내거나 할 때처럼 스크립트를 자유롭게 쓸 수 없을 때~
DOM 객체를 이용하도록 해본 것

! <input> 태그 사이의 공간이 있어선 안된다~
 
<div>
 <span>제목</span>
 <input type="button" value="show"
   onclick="this.style.display = 'none';
     this.parentNode.lastChild.style.display = '';
     this.nextSibling.style.display = '';"
 ><input type="button" value="hide" style="display: none;"
   onclick="this.style.display = 'none';
     this.parentNode.lastChild.style.display = 'none';
     this.previousSibling.style.display = '';"
 >
 <div style="display: none;">
  이게 컨텐츠<br>
  컨텐츠<br>
  컨텐츠
 </div>
</div>
 

저작자 표시 비영리 변경 금지
Posted by ohgyun