검색창 열기

IE 6와의 사투.


 현재 웹 기반의 솔루션을 RIA 로 제작하고 있는데, 이 과정에서 XML 데이터를 받아 파싱하는 부분이 크롬에서는 잘 되는데 IE 에서 테스트했더니 아예 파일을 읽는 부분이 오류가 나 버렸다. 왜 안될까, 하고 고민고민 하다가 예전에 RSS 와 트랙백 서비스를 만들던 때 기억이 떠올라서 헤더의 content-type 을application/xml 으로 바꾸어 주었더니 잘 받아오게 되었다.

 * IE 에서는 xml 문서를 보낼 때 반드시 헤더를 기술해주어야 한다!!

php 의 경우,

 header('content-type:application/xml; charset=euc-kr');

위의 문장을 명시해주면 된다.

그리고 나서 받은 xml 데이터를 JQuery 라이브러리를 통해서 참조하려고 했더니 아뿔싸, 여기서 또 문제가 발생했다. 역시 같은 코드를 크롬은 잘 처리하는 데 반해서 IE 는 XML 객체로 인식조차 되지 않는 것.

 아무리 소스 코드를 들여다봐도 내가 뭔가 잘못 쓴 건 아니고 해서 한참을 고민했는데, 잠깐 나가서 담배 한 대 피우고 오니까 퍼뜩 생각이 났다. 어차피 마소에서는 xml 파싱 기능을 제공할테니깐 xml 로 인식이 안 되면 xml 객체로 변환해버리면 되는 거지!!

 그래서 검색해보니까 나온 게 Microsoft.XMLDOM 객체. IE 외에는 인식이 잘 되니까 IE 일 때만 이걸 쓰면 되겠다. 그런데 IE 인지 아닌지는 어떻게 구분하지?

 어차피 xml 데이터를 IE 는 문자열로 인식하는거니까 그걸로 검사해버리면 되겠구나 싶었다.

 그래서 해결책은

 if(typeof data == 'string'){ //IE 일 경우
xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = false;
xml.loadXML(data);
}else{ // 그 외에는
xml = data;
}

이거다!!

추가))

위 코드대로 하니까 IE 에선 잘 되는데 이번엔 크롬에서도 액티브엑스를 로드하려고 해서 동작이 되질 않게 되었다. 그래서 다시 잘 생각해보고 내린 결론이 바로 아래.

if($(data).length != 1){ 
//IE 는 xml 객체를 생성하지 않으니까 문자열의 길이가 나오므로 1보다 크게 된다.
xml = new ActiveXObject('Microsoft.XMLDOM');
xml.async = false;
xml.loadXML(data);
}else{ //그래서 이걸로 구분하면 된다.
xml = data
}

더 추가))

if( navigator.appName != "Microsoft Internet Explorer"){ //ie 가 아닐 경우

이런 쉬운 방법도 있다.

마지막 추가))

if( !$.browser.msie ){ //ie 가 아닐경우

JQuery 에서 제공하는 방법중에서는 이게 제일 쉽다.

Comments

::