var IE6 = false /*@cc_on || @_jscript_version < 5.7 @*/;

if(IE6) {
  alert("i love ie");
}


참고링크
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/140 관련글 쓰기

댓글을 달아 주세요

와우!
js파일중 하나가 26164줄;; 것도 압축한게;;

완전 토나온다 -ㅅ-;
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/125 관련글 쓰기

댓글을 달아 주세요

우선 먼저 말하고 싶은것은 내가 적은 방법이 정답은 아니다.
정수 '2' 라는 값을 만들기 위해서
  • 1+1
  • 2/8*((16-4)/3)*2
  • sin 5/6 pi * 4
같은 많은 식들이 존재하듯이, 아래에 나온 방법도 그중 하나 일 뿐이다.

별 내용없는 두서는 이제 접기로 하고...
  • semantic markup
  • CSS가 없을때도 제대로 보이도록
  • Javascript가 동작하지 않을때도 동작하도록
위의 사항들을 고려하며 코딩되었다.

<menu id="tab_menus">
html markup 결과

    <li class="selected"><a href="#Menu_01">Menu 01</a></li>
    <li><a href="#Menu_02">Menu 02</a></li>
    <li><a href="#Menu_03">Menu 03</a></li>
</menu>
<div class="tab_right"></div>

<div id="Menu_01" class="content">
    <h3>Menu 01</h3>
    <p>Menu 01...blablablablabla</p>
    <a href="#tab_menus" class="go_tab_menu"><img src="btn_top.gif" alt="go tab menu" /></a>
</div>
<div id="Menu_02" class="content">
    <h3>Menu 02</h3>
    <p>Menu 02...blablablablabla</p>
    <a href="#tab_menus" class="go_tab_menu"><img src="btn_top.gif" alt="go tab menu" /></a>
</div>
<div id="Menu_03" class="content">
    <h3>Menu 03</h3>
    <p>Menu 03...blablablablabla</p>
    <a href="#tab_menus" class="go_tab_menu"><img src="btn_top.gif" alt="go tab menu" /></a>
</div>

tab menu 의 링크를 각각의 content에 걸어줌으로 인해 quick link의 역활을 수행하여 접근성을 높였고, 각 content 하단에 tab menu로 바로 가는 quick link도 제공함으로 더욱 완성도 높은 접근성이 보장되었다. 하지만 이렇게 보면 전혀 tab menu같지가 않다.

이제는 tab menu스럽게 꾸며보자.

body {
    font:12px arial;
}
a {
    text-decoration:none;
}
img {
    border:0;
}

/* tab menu */
#tab_menus {
    margin:0;
    padding:0;
    list-style:none;
}
#tab_menus li {
    margin-bottom:16px;
    float:left;
    padding:0px;
}
#tab_menus li a {
    padding:8px 10px;
    color:#505050;
    border-width:1px 0 1px 1px;
    border-style:solid;
    border-color:#ae9f96;
    background-color:#eae4e0;
    background-image:none;
    font-weight:bold;
    font-size:0.9em;
    display:block;
}
#tab_menus li a:hover {
    color:black;
}
#tab_menus li.selected a {
    border-bottom:0 solid white;
    background:white url("blt_arrowdown.gif") no-repeat center bottom;
    color:black;
}
CSS 적용 후 모습

.tab_right {
    margin-bottom:16px;
    border-width:0 0 1px 1px;
    border-style:solid;
    border-color:#ae9f96;
    width:80px;
    height:31px;
    float:left;
}

/* content */
.content {
    clear:both;
    padding-left:10px;
}
.content h3 {
    margin:0;
    padding:0;
    font-size:1.2em;
    color:#ff4800;
}

tab menu의 a를 block으로 잡고 hover를 주어 onMouse상태일때 Javascript없이도 변화를 줄 수 있게 하였다.
#Menu_02, #Menu_03에 display:none을 안 준 것을 궁금해 하는 독자가 있다면, 당신은 천재!
Javascript없이도 모든 content의 접근성을 보장하기 위해서다. 이건 조금 후 다시 설명하기로 하고..

자 이제는 마무리. Javascript로 tab menu 동작을 만들자.
mootools 1.11(Element.Event, Element.Selectors)을 이용하였다
var selected_menu = 0;
Javascript 적용 후 모습

var menus = $$('#tab_menus li');
var contents = $$('div.content');
contents.each(function(div, i) {
    if (i != 0) {
        div.setStyle('display', 'none');
    }
})

menus.each(function(quick_link, i) {
    quick_link.getElement("a").blur();
    quick_link.addEvent('click', function(event) {
        e = new Event(event).stop();
        contents[selected_menu].setStyle('display', 'none');
        menus[selected_menu].removeClass('selected');

        contents[i].setStyle('display', 'block');
        quick_link.addClass('selected');
        selected_menu = i;
    });
});

#Menu_01을 제외한 다른 content들은 가려주었고, tab menu의 박스에 click 이벤트를 걸어줌으로써 toggle 기능이 완성이 되었다.
만약 content들을 CSS에서 가려주었다면(#Menu_02, #Menu_03 display:none) CSS는 render가 되었는데 Javascript가 동작이 안되는 상황이 오면 다른 content에 접근할 방법이 없어진다.
Javascript로 원하는 content를 display:block으로 바꿔줘야 하는데 Javascript가 동작이 안되니 tab을 백날눌러도 그 tab의 content는 볼 수 가 없게 되는 것이다.


결론.
결국은 content는 CSS와 Javascipt에 영향을 받지 않게 설계,코딩 되어야 하고 더불어 semantic하게 markup되어야 한다는 것이다.

다운로드
미리보기 (링크걸리는줄 알았는데 그게 아니네요. 아..이럴때 개인서버가 살아있었다면..)



압축파일(html, js, images)





ps > 이거 스크롤의 압박이;;
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/112 관련글 쓰기

댓글을 달아 주세요

  1. 좋은 소스 잘 봤습니다...
    클래스로 하면 한 페이지에 복수의 탭메뉴를 구성하는데 더 용이할 것 같습니다.

    2008/04/11 18:02 [ ADDR : EDIT/ DEL : REPLY ]
    • 감사합니다:)

      복수의 탭메뉴를 구성할때 말씀하신대로 class를 부여해서 하는것도 좋은 방법이죠! ㅎㅎ

      2008/04/12 11:43 [ ADDR : EDIT/ DEL ]
  2. chan

    소스 다운받았어요ㅋㅋ 탭 코딩해야되는데 참고해야겠어요ㅋ
    감사합니다~

    2009/01/15 17:33 [ ADDR : EDIT/ DEL : REPLY ]
  3. backy

    어후 감사합니다.
    제가 진행하는 일게 도움이 될꺼 같아요!!!

    2011/01/31 02:25 [ ADDR : EDIT/ DEL : REPLY ]

간략하게 JSSpec을 설명하자면 Javascript BDD 툴입니다.
JSSpecBDD에 대한 설명은 다음에 기회될때 포스팅하기로 하고..(과연..?)
일단, 자세한 설명은 JSSpec홈페이지 http://code.google.com/p/jsspec/를 참고하세요~

Editplus용 자동완성파일 ACP, 구문파일 STX을 만들었습니다.
jscript.zip (2007-05-10)
JScript stx with Prototype.js - W. Jordan
jscript.acp.zip (2007-05-10)
JScript acp, ctl with Prototype.js - W. Jordan
이것들이 원본인데 제 입맛에 맞춰서 수정을 해서 쓰다가 JSSpec구문을 추가한 것입니다.
원본이 With Prototype이어서 prototype을 쓰시는 분들께는 사용하시기 더 편리하지 않을까 생각합니다.

만약 사용하시던 ACP, STX가 있으시면 제가 추가한 부분(JSSpec으로 검색해서 나오는 부분)만 현재 사용하시는 파일에 추가를 해주시면 됩니다.

다운로드 >>http://editplus.com/kr/html.html 에서 다운받으실 수 있습니다. (js7.zip)




acp에 추가된 내용
#T=_________________
#T=  JSSpec
#T=jss
describe("^!", {
    "should ": function() {
       
    }
});
#T=vof
value_of("^!")
#T=ept
expect(^!)
#T=sb
should_be(^!)
#t=snb
should_not_be(^!)
#t=sbe
should_be_empty(^!)
#t=snbe
should_not_be_empty(^!)
#t=sbt
should_be_true(^!)
#t=sbf
should_be_false(^!)
#t=snbt
should_not_be_true(^!)
#t=snbf
should_not_be_false(^!)
#t=sh
should_have(^!)
#t=she
should_have_exactly(^!)
#t=shal
should_have_at_least(^!)
#t=sham
should_have_at_most(^!)
#t=si
should_include(^!)
#t=sni
should_not_include(^!)
#t=sm
should_match(^!)
#t=snm
should_not_match(^!)
#t=sf
should_fail(^!)

stx에 추가된 내용
#KEYWORD=JSSPec
describe
value_of
expect
beforebe_each
should_be
should_not_be
should_be_empty
should_not_be_empty
should_be_true
should_be_false
should_not_be_true
should_not_be_false
should_have
should_have_exactly
should_have_at_least
should_have_at_most
should_include
should_not_include
should_match
should_not_match
should_fail

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/81 관련글 쓰기

댓글을 달아 주세요

엄청 간단합니다.

String.prototype.trim = function(){
    return this.replace(/^(\s|&nbsp;)+|(\s|&nbsp;)+$/g, "");
}

String.prototype.ltrim = function(){
    return this.replace(/^(\s|&nbsp;)+/g, "");
}

String.prototype.rtrim = function(){
    return this.replace(/(\s|&nbsp;)+$/g, "");
}

str = "  &nbsp;1234567890   ";
ltrim = str.ltrim();
rtrim = str.rtrim();
trim = str.trim();

result = "<pre>orignal = \"" + str + "\"\n";
result += "ltrim length = " + ltrim.length + ", string = \"" + ltrim + "\n";
result += "rtrim length = " + rtrim.length + ", string = \"" + rtrim + "\n";
result += "trim length = " + trim.length + ", string = \"" + trim + "\n";

document.write(result);

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/67 관련글 쓰기

  1. 정귯ㄱ  삭제

    2009/02/20 23:48TRACKBACK FROM I think about...

댓글을 달아 주세요

  1. 감사합니다

    2011/12/20 15:02 [ ADDR : EDIT/ DEL : REPLY ]

HTML Element의 Attribute를 전부 뽑아 각각을 Object로 만들어 주는 코드입니다.
HTML Parser가 Element의 Attributes를 뽑는것과 비슷하다고 생각하시면 됩니다.

getAttribute 와의 차이점은, 제가 만든 정규식은 Element의 모든 Attributes를 Attribute와 value로 가져오는 것이죠.
무슨말인지 모르시겠죠?

<img src="a.jpg" width="100" height="100" alt="bla.." align="right">
에서

src="a.jpg" width="100" height="100" alt="bla.." align="right"
만 뽑아서 각각 object로 만들어 줍니다. 즉

["height="100"", "height", "100"]
같은 형태로 뽑아주는거지요.

여기까지 끈기있게 읽으신분들은 "근데 이거 만들어서 어따 쓸려고.." 라는 의문점이 드실거에요.(의문점이 드시면 당신은 천재..!!?? 혹은 동변상련을 느끼시는 분들..??)
이걸 왜 만들었냐하면, Wiki에 쓸 Formatter를 만드는데 거기에 쓸려고 만든 정규식입니다.
(Formatter 같은거 만들때 꽤나 유용하게 쓰일 정규식입니다.)

wiki 혹은 punBB같은 Formatter가 있는것들은 내부적으로 문법이 있습니다. 문법따라 여러가지 옵션들이 붙는데 이 옵션을 뽑아내서 처리하는 부분이 필요하죠.
바로 이 문제때문에 만들게 된 것입니다.
무슨말이신지 잘 모르시겠죠?? 그러실것 같아서 아래 예제를 준비했습니다.

[[image(src = "a.jpg" width  = 100% height="50" alt="bla..!! bla... ;(" align="center")]]
와 같은 문법이 있다고 한다면, 각각의 Attribute을 뽑아서 선행처리(Attribute가 옳바른 것인가? 쉽게 말하면 onclick 같은게 있는가..검사하는 등등)해야 하고,
Attribute속성에 맞게 다시 수정을 해줘야 합니다.(width, height같은것은 css로 만드는 등등)

이런것에 아주 유용하게 쓰일 정규식입니다.

쓸대없이 두서가 길었네요.
Formatter에서 [[image(~~~)]] 는 제거하여 순수하게 Attribute만 남기겠습니다.
그렇게 되면

src = "a.jpg" width  = 100% height="50" alt="bla..!! bla... ;(" align="center"
만 남겠죠, 이걸가지고 예제를 하겠습니다.

var getAttributes = function(attributes){
    var param_regExp = /(\w+)\s*=\s*((?:\"|\')[\w\s.~!@#\$%\^&\*\(\)\-_=\+\[\]\{\}:;]+\%?(?:\"|\')|[\w.~!@#\$%\^&\*\(\)\-_=\+\[\]\{\}:;]+\%?)(?:\s+?|$)/i;
    nextMatch = 0;

    while(attributes){
        if(nextMatch < attributes.length){
            attribute = param_regExp.exec(attributes.substr(nextMatch, attributes.length));
            nextMatch = nextMatch + attribute[0].length;

            document.write(attribute[0] + " : " + attribute[1] + " => " + attribute[2] + "<br />");

            if(nextMatch >= attributes.length){
                return;
            }
        }
    }
}

getAttributes("src  = \"a.jpg\" width  = 100% height=\"50\" alt=\"bla..!! bla... ;(\" align=\"center\"");

뛰워쓰기( ), 쌍따움표("), 홀따움표('), 세키콜론(;), 괄호({([) 등등 특수문자처리도 됩니다.

이 몇줄 안되는 코드를 짜기위해 몇시간을 소비한것인지..ㅠ,.ㅠ
검색해보면 쉽게 나올지도 모른다는 생각이...왜 이제서야 든걸까요..ㅠ,.ㅠ


ps> 지금 시간이 새벽 1시 11분이군요.. 왠지 오타도 많을것 같고, 말도 많이 틀릴것 같은데..
그러려니하고 봐주세요;;
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/56 관련글 쓰기

댓글을 달아 주세요

new function() {
    var b = navigator.userAgent.toLowerCase(); // jQuery.browser 아래에 추가하시면 이 줄은 삭제

    jQuery.os = {
        Linux: /linux/.test(b),
        Unix: /x11/.test(b),
        Mac: /mac/.test(b),
        Windows: /win/.test(b)
    }
}


사실 jQuery.browser 아래에 추가해주셔도 되지만, Compress되었을 경우에는, 위의 소스를 별도의 js파일로 혹은, html안에 넣어주시면 됩니다.

Windows, Mac, Linux에서 테스트 해 봤으며,
Linux의 경우 (Gentoo에서만 확인해봤습니다.) Unix와 Linux 모두 뜹니다.
Unix에서는 안타깝게도 테스트를 못해봤습니다.

사용법은 간단합니다.
if($.os.Windows){
    alert("Window~");
}

이렇게 사용하시면 됩니다.

그리고, jQuery가 아니고 일반적인 Javascript라면

var agent = navigator.userAgent.toLowerCase();

os = {
    Windows : /win/.test(agent),
    Mac : /mac/.test(agent),
    Linux : /linux/.test(agent),
    Unix : /x11/.test(agent)
};

if(os.Windows){
    alert("Window~");
}

하시면 됩니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/53 관련글 쓰기

댓글을 달아 주세요

Js로 Style 을 Control 하는 경우가 많이 있습니다.
자연스럽게 색깔 설정에도 손의 많이 가고, 그러다 보면 컬러코드를 가지고 작업을 해야 할 때가 있습니다.
이 팁은 이런 상황에서 유용하게 사용 됩니다.

IE6, IE7, Opera 같은경우 컬러코드 그대로 반환을 해 줍니다.
예를들어,
<div id="Some" style="background-color:#ffff00">someElement</div>

<script type="text/javascript">
alert(document.getElementById("Some").style.backgroundColor);
</script>
일 경우 #ffff00을 반환합니다.

하지만 FireFox, Safari 는
rgb(255, 255, 0) 을 반환합니다.

이렇게 되면 브라우져 별로 색상정의가 틀려져서, 여기서는 되고 저기서는 에러나고 하는 상황이 연출이 됩니다.

이럴경우 rgb코드를 16진수 컬러코드로 바꿔주는 함수입니다.

var getRgbToHex = function(rgb_code){
    if(Reg.test(rgb_code)){
        tempColor = rgb_code.replace(Reg, "");
        tempLength = tempColor.length - 1;
        tempColor = tempColor.substr(0, tempLength);
        tempColor = tempColor.split(",");

        red = tempColor[0];
        green = tempColor[1];
        blue = tempColor[2];

        colorCode = "#" + rgb_hex(red) + rgb_hex(green) + rgb_hex(blue);

        return colorCode;
    }
    return rgb_code;
}

var rgb_hex = function(color)
{
    if(color==0){
        var color="00";
        return color;
    }
    else{
        var y=color/16;
        var y=y+"a";
        if (y.indexOf(".")==-1){
            var hex2="0";
            var u=y.indexOf("a");
            var q=y.substring(0,u);
            var hex1=hex_array[q];
        }
        else{
            var l=y.split(".");
            var q=l[0];
            var z=q*16;
            var xyz=color-z;
            var hex1=hex_array[q];
            var hex2=hex_array[xyz];
        }
        var color=hex1+hex2;
        return color;
    }
}

Converter 하는 부분은 http://www.csgnetwork.com/csgcolorsel6.html를 참고했습니다.
사용법은

<script type="text/javascript">
var getColorCode = function(ele){
    nowColor = document.getElementById(ele).style.color;
    colorCode = getRgbToHex(nowColor);
    alert(colorCode);
</script>

<div id="some" style="color:#FF0000">Element</div>
<input type="button" value="getElementColorCode" onclick="getColorCode('some')">


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/40 관련글 쓰기

댓글을 달아 주세요

  1. iamSeeker 님께서, 정규식을 좀 더 활용하고, toString을 활용해서 훨신 간결한 코드를 만드셨습니다.
    http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=53584&page=&sfl=&stx=&spt=&page=&cwin=#c_53595

    2007/04/19 12:21 [ ADDR : EDIT/ DEL : REPLY ]

var getNowScroll = function(){
var de = document.documentElement;
var b = document.body;
var now = {};

now.X = document.all ? (!de.scrollLeft ? b.scrollLeft : de.scrollLeft) : (window.pageXOffset ? window.pageXOffset : window.scrollX);
now.Y = document.all ? (!de.scrollTop ? b.scrollTop : de.scrollTop) : (window.pageYOffset ? window.pageYOffset : window.scrollY);

return now;

}

소스는 어렵지 않아서 별다른 설명이 필요 없을 것 같네요.
IE7, FF2 에서 테스트 해보았으며,
사용법은 간단합니다

<input type="button" onclick="CurrentScroll()" value="지금 스크롤 위치를 알려줘">

<script type="text/javascript">
var CurrentScroll = function(){
nowScroll = getNowScroll();
alert(nowScroll.X + "," + nowScroll.Y);
}
</script>


http://jdsharp.us/ 에 스크롤 위치구하는 코드가 잘 짜여져 있어, 이 코드를 사용하였습니다.
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Johan Kim hiphapis

TRACKBACK http://hiphapis.net/trackback/36 관련글 쓰기

댓글을 달아 주세요

  1. 감사합니다. 안그래도 drag&drop 구현하면서 이게 엄청난 문제였는데 덕분에 해결했네요 ^^ 퍼갈께요~~

    2009/07/03 21:45 [ ADDR : EDIT/ DEL : REPLY ]
  2. 홈페이지 적혀있는곳으로 퍼가도 될까여~?

    안되면.. 쪽지나 글남겨주시면 삭제 하겠습니다

    네이버블로그/cain007

    2009/08/24 16:04 [ ADDR : EDIT/ DEL : REPLY ]