몰랐는데... 파이어폭스(FF)에서는
outerHTML을 지원하지 않는다(innerHTML은지원)

그래서 인터넷을 뒤져봤는데... 리턴하는 소스는 많이 나왔는데
값을 덮을수 있는 방법은 잘 나오지 않아서
인터넷 뒤져서 샘플코드를 만든 소스...

해당 outerhtml을 알고싶으면 getouterHtml
해당 outerhtml에 텍스를 치환하고 싶으면 setOuterHtml
를 사용하면 되고, 기타 outerhtml을 지원할 경우는 그 함수를 쓰도록
처리한 소스....

<html>
<title>outerHTML 파이어폭스 대응</title>
<script>
/**************************************
* 샘플 코드 및 펑션 생성 @ 정민철
*
http://tost.tistory.com
*
* 원본 참조소스
*-----------------------------------------------------------
*
http://snipplr.com/view/5460/outerhtml-in-firefox/
* http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=56477
***************************************/
//ff대응 outerhtml결과
function getouterHtml(obj)
{
 var html = null;
 //널처리
 if (obj == null) return null;
 
 if (typeof(obj.outerHTML) == "string")
 {//스트링값을 가져온다면 IE로 가정함
  html =  obj.outerHTML;
  //alert("ie"); //디버그용
 }
 else
 {
  html = (new XMLSerializer).serializeToString(obj);
  //alert("ff"); //디버그용
 }
 return html;
}
//ff대응 outerhtml 삽입
function setOuterHtml(obj, html)
{
 if (obj == null) return; //null처리
 
 if (typeof(obj.outerHTML) == "string")
 {//스트링값을 가져온다면 IE로 가정함
  //alert("ie"); //디버그용
  obj.outerHTML = html
 
 }
 else
 {
  //alert("ff"); //디버그용
     var el = document.createElement('div');
     el.innerHTML = html;
     var range = document.createRange();
     range.selectNodeContents(el);
     var documentFragment = range.extractContents();
     obj.parentNode.insertBefore(documentFragment, obj);
     obj.parentNode.removeChild(obj);
 }
}
</script>




<body>
<div id="test" style="background:yellow;">
원래본문
</div>
<script>
var divobj = document.getElementById("test");
</script>

<a href="javascript:alert(getouterHtml(divobj))">outer값확인</a>
<a href="javascript:setOuterHtml(divobj, 'htmltest')">outer값 변경</a>
</body>
<html>


개인적으로는 웹브라우저가 하나만 남았으면 좋겠다.
다음 포털을 보면...
마우스로 드래그하면, [검색] 버튼이 나와서
해당 텍스트를 검색 하는 기능이 있다.

사용자 삽입 이미지

사실... 드래그한 텍스트를 검색어 입력하는곳에 자동입력후 검색해 주는 기능이지만,
스크롤이 길고 조금 복잡한 텍스트(특히 한문) 같은경우는

"복사 -> 스크롤이동 -> 검색창에 붙여넣기 -> 검색버튼 클릭" 이라는 방법을 써야 하지만,

위 방법은 귀차니즘에 빠진 현대인(나를 지칭하는말 ;;)은 위와 같은 별것 아닌 인터페이스가 도움이 될때도 있다.

그래서, 자바스크립트로 간단히 구현해본 샘플 페이지...
파이어 폭스랑, IE에서 둘다 되고, 최대한 사용법을 쉽게하려고
스크립트를 class화해서 구현한 소스....


사실, 이벤트가 일어나는건 결과용 레이어 안에서 이벤트를 걸어서 일어나도록 했다.

사용자 삽입 이미지



최대한 사용법을 쉽게하기위해... class화 했고, 적용도 다음과 같이
body 안의,,,, 아래쪽쯤에 레이어의 id만 선언해주면 OK (html을 보면 될듯)

<script>
 var popEvent = new PopSearch("result","popbutton");
</script>


만약, 이 소스를 이해 못했다면... 난감;;
(나름 쉽게 사용하게 만들었는데)
자바스크립트를 통해 이벤트를 처리할 경우는 참 많다.
그리고 개발자를 위해서 디자이너가 이벤트를 다 만들어서
제공하는 nice한 경우도 있지만,

정말... 디자인만 주는 디자이너도 존재하기 때문에 해당 이벤트를 내가 컨트롤 해줘야 하는 경우도 존재한다.

사용자 삽입 이미지






한가지 예를 들면 ,
붉은 동그라미친 + - 이미지를 바꾸는 일을 하는 이벤트를 만들어야 한다면?


가장 심플한 방식으론 다음과 같다.

>>자바스크립트

function treeshowhidden(imgid)
 {
     var imgobj = document.getElementById(imgid);
 
     if ( imgobj.getAttribute("src").indexOf("hide.gif") > 0 )
    {
          imgobj.src = imgobj.getAttribute("src").replace("hide.gif","show.gif");
    }
    else
    {
          imgobj.src = imgobj.getAttribute("src").replace("show.gif","hide.gif");
     }
 }

>> HTML샘플

<dl>
     <dt><a href="javascript:treeshowhidden('taxtree_<%=++idx%>')">
      <img id = "taxtree_<%=idx%>"src="/images/btn/btn_hide.gif" alt="hide"/></a>
     </dt>
 </dl>


대충 이런식으로 id를 jsp, php 단에서 달아주고,
id로 컨트롤 하는 방식... 사실 이경우가 제일 단순한 방법이긴 하다.

자바스크립트에서 이미지 파일 이름 비교할때,
if ( imgobj.getAttribute("src") =="/images/btn/btn_hide.gif") 로 안하고
if ( imgobj.getAttribute("src").indexOf("hide.gif") > 0 )

하는 이유는, 실제 src가 리턴될때 http:/xxxx.xxx/adsf/images/bin/btn_hide.gif 처럼
full 주소로 나오기 때문에 이렇게 비교함 !!!!

사실 간단한 사실인데... 막상 처리할때 헤맨다 -_-;


근데.. 세상이 이렇게 단순한 형태만 지원되길 원하지 않는다.
암 그렇고 말고

사용자 삽입 이미지


맨날 id 노가다로 해결하던 유저에게 가치관의 혼란이 오기 시작한다. 뭔가 방법은 없을까?
하지만, 몇번끄적거리다가,,,, 많은 사람들은 jsp, php에서
다음과 같이  이중포문으로 id 를 막 달고 이벤트를 걸기 시작한다   (-ㅅ-)

for (int i=0; i<cnt1; i++) {
  for (int j=0; j<cnt2; j++)
  {
       <img id = "imgid_<%=i%>_<%=j%>" .... />
  }
}


중요한 사실이 있다...
우리는 웹으로 개발할때 종종...
웹에서의 특성으로 해결 할 수 있는걸... id남발을 하는 경우도 있다.
(사실 html은 계층적 구조라서 하위 노드 접근도 가능하다)

<script>
function treeshow(id)
{
 var ulobj = document.getElementById(id);
 var liobj = ulobj.getElementsByTagName("li");
 var cnt = liobj.length;
 for(var i=0; i < cnt; i++)
 {
  if ( liobj[i].getElementsByTagName("img")[0].getAttribute("src").indexOf("hide.gif") > 0 )
  {
    liobj[i].getElementsByTagName("img")[0].src = liobj[i].getElementsByTagName("img")[0].getAttribute("src").replace("hide.gif","show.gif");
  }
  else
  {
   liobj[i].getElementsByTagName("img")[0].src = liobj[i].getElementsByTagName("img")[0].getAttribute("src").replace("show.gif","hide.gif");
  }
 }
}
</script>
<div>
 <dl>
  <dt><a href="javascript:treeshow('tree_1');">1. 하위 내용만 이미지변경</a></dt>
  <dd>
  <ul id="tree_1">
   <li>일.<img src="/images/btn/btn_hide.gif"/></li>
   <li>이.<img src="/images/btn/btn_hide.gif"/></li>
   <li>삼.<img src="/images/btn/btn_hide.gif"/></li>
  </ul>
  </dd>
 </dl>
 <dl>
  <dt><a href="javascript:treeshow('tree_2');">2. 하위 내용만 이미지변경</a></dt>
  <dd>
  <ul id="tree_2">
   <li>일.<img src="/images/btn/btn_hide.gif"/></li>
   <li>이.<img src="/images/btn/btn_hide.gif"/></li>
  </ul>
  </dd>
 </dl>
</div>

사실 위 소스는...
고정된 내용에 대해 에러체크도 없이 만든 ..
즉 쉽게 말하면 조금 후진소스다...

그래도 html의 각 태그별 하위 계정에 접근할 수 있다는걸 보여주는 아주 simple한 예제...

id를 남발해서 처리하기보다는...
자바스크립트에서 하위계정으로 접근해서 바꾸는 방식으로
한번쯤 해보는것도 나쁘지 않을듯...





+ Recent posts