'IE'에 해당되는 글 2건

  1. 2008/03/10 p안에 div를 넣으면 (4)
  2. 2006/04/03 com.co.kr : IE 자동검색의 위험 (8)

p안에 div를 넣으면

개발&Development/웹 2008/03/10 14:25 posted by 겐도
리퍼러 중에 이런 문제로 고심하는 분들을 위해 왜 p안에 div를 넣으면 안되는지를 간략히 살펴보자.

우선 W3의 HTML 4.01 스펙부터 보자. 9.3.1 Paragraphs : the p element를 보면 p 태그는 inline 요소만을 자식으로 가질 수 있다고 한다. div는 block 그룹에 속한다. 따라서 p안에 div를 쓰면 잘못된 것이다. 헌데 다들 잘 쓰고 있지 않은가? 심지어 텍스트큐브나 티스토리 에디터도 이런 식으로 html을 생성하기도 한다(정확히는 각 브라우저의 위지윅 에디팅 모듈의 버그라고 할 수 있지만). 많은 웹사이트 코더들이 이 부분을 묵과한다.

아래의 코드를 보자.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Untitled Document</title>
<style type="text/css">
    p { border:black thick solid; }
    div { border:red thin solid; }
</style>
</head>
<body>
<p>
    <div>
        테스트문장
    </div>
</p>
<p>
    정상적인 문단
</p>
</body>
</html>
"테스트문장"이 전형적으로 실수한 부분이고 아래는 정상적이다. p 영역이 정확히 어딘지 알기 위해 보더를 주었다.
사용자 삽입 이미지

IE 7 on Windows XP Korean


우선 IE7. p의 보더가 두번 보인다. 이는 사파리도 비슷하다.
사용자 삽입 이미지

Safari 3 on Mac OS X Leopard

단란이 정확히 "테스트문장"을 감싸지 못하고 있다.

파이어폭스는 약간 다르다.
사용자 삽입 이미지

FireFox 2 on Mac OS X Leopard

아래쪽이 없다. 이는 부정확한 태그에 대한 핸들링 차이이다. 브라우저 입장에서 표준 좀 어겼다고 해서 "이거 해석 못하겠임"이라고 할 수 없는거 아닌가.
사용자 삽입 이미지

배째라 브라우저라면?

그래서 대부분의 브라우저가 에러 핸들링을 하는데 이것이 브라우저마다 약간씩 다르다. 물론 표준 밖의 내용이라 개발자 마음대로(?) 처리할 수 있다. 새로운 브라우저가 나올때 마다 어떻게 처리될지는 아무도 모른다.

IE와 Safari의 경우 p안에서 div를 만나는 순간 </p> 태그를 빼먹었다고 판단한다. 단락이 끝난다. 그리고 div가 시작되며 다시 </p>를 만나는 순간 이번엔 시작 태그<p>가 없다고 판단 빈 단락을 만든다. "테스트문장" 아래의 줄이 생기는 이유이다. 허나 FF는 뒷부분의 </p>를 엄하게 들어온 것으로 보고 discard 한다.

IE, Safari는
<body>
<p></p>
<div>
    테스트문장
</div>
<p></p>
<p>
    정상적인 문단
</p>
</body>

Firefox는
<body>
<p></p>
<div>
    테스트문장
</div>
<!-- 무시 </p> -->
<p>
    정상적인 문단
</p>
</body>
이런식으로 변환된다고 보면 되겠다.

이런걸 보고 브라우저가 좋네 마네 이야기 해서는 안되는 것이다. 표준을 벗어났을 때의 이야기기 때문이다. 이런 문제들이 쌓이고 쌓이면 복잡한 페이지에선 브라우저별로 정확히 렌더링 결과를 같게 만드는 것이 어려워 진다. HTML 구조가 다른 셈인데 같은 CSS로 어떻게 처리하리오.

표준을 지키는 것은 매우 중요하다. 표준을 제대로 이해하지 못하고 사용하게 되면 저련 문제에 당하는 것이다. HTML로 밥먹고 살고 있다면 HTML 스펙은 한번쯤은 정독하자. CSS를 먼저 공부할 것이 아니라 HTML부터다.

덧. Safari의 핸들링이 확실치는 않습니다. 제가 잘못 분석한 것이라면 코멘트 주세요. FF와 IE는 DOM을 통해 확인하였습니다.

이전부터 IE에서 URL을 잘못치면 이상한 Active-X를 설치할려고 해서 AD-WARE나 비슷한게 깔렸나 하고 의심하던 차에 오늘은 회사의 인터넷이 헷가닥 하면서 자꾸 설치 경고가 뜨고 있었습니다. 인터넷이 안되니 할일도 없고 해서 이놈의 정체를 찾아 봤는데...

만약 IE를 쓴다면 주소란에 "abababab.com" 를 입력해 보세요. 당연히 없는 도메인입니다.(없는 도메인 찾기도 힘들었다는;;) 갑자기 이상한 Active-X 프로그램을 설치하려 한다면 아래의 시나리오대로 움직인 것입니다.

1. 일단 http://abababab.com 를 시도한다. 그리고 실패. (정확히는 네임서버에 해당 도메인을 물어보지만 없다라고 함)
2. (검색엔진을 특별히 바꾼적이 없다면) IE는 MSN 검색을 사용해 봅니다. 물론 아무런 결과도 없기에 실패로 됩니다.
3. 그다음 IE는 이제 자동 suffix 기능이 동작하기 시작하는데 가장 처음에 시도하는 것이 co.kr입니다. 즉 abababab.com.co.kr로 접속하려 하죠. (IE 6.0.2900.xpsp_sp2_gdr.050301-1519 기준)
4. 모든 블라블라.com.co.kr은 하나의 페이지로 접속됩니다. 그 페이지에서 하는 일은 지정된 Active-X를 설치하게 유도합니다.
5. 마치 컴퓨터가 악성코드에 감염된 것처럼 보이고 그와중에 치료를 해 주겠다는 정의의 사도가 등장하는 듯 하지만... 글쎄요...

http://whois.krnic.net 에 com.co.kr 도메인을 검색해 보니 등록자가 있더군요. IE의 기능을 역이용한 상황입니다.

PS. 해당 프로그램이나 업체에 대한 직접적인 평은 피할까 합니다. 하지만 떳떳하지 못한 방법을 쓰는 업체 치고 떳떳한 일을 하는 경우는 드물죠. 자바스크립트를 보니 열여덟이 저절로 나옵니다.

PS2.  com.co.kr을 보니 2015년까지 등록이 되어 있는데 이 부분에 대해선 제재가 있어야 되지 않을까란 생각입니다. 악용해 버리면 수많은 사람들은 그대로 위험에 노출되어 버리니깐요. 사실 지금도 노출되어 있는 상황이네요.

PS3. 위의 예제를 만들때 처음에는 "xxxxxxxx.com"으로 할려고 했는데 페이지가 있더군요. 그래서 'x'의 개수를 늘려가면서 봤는데.. 몇개까지 있을까요? 참 별의별 도메인이 다 있네요.