해당 객체의 CSS에  cursor:pointer 를 적용하면 끝!!

 

 

#셀렉터 {cursor: pointer;}

렉시컬 스코핑(lexical scoping)

많이들 헷갈리는 개념인데 스코프는 함수를 호출할 때가 아니라 선언할 때 생깁니다. 호출이 아니라 선언요! 정적 스코프라고도 불립니다. 다음 코드에서 console이 어떻게 찍힐 지 예상해보세요.

 

1
2
3
4
5
6
7
8
9
var name = 'zero';
function log() {
  console.log(name);
}
function wrapper() {
  name = 'nero';
  log();
}
wrapper();

 

쉽죠? nero입니다. log를 호출하기 전에 name을 'nero'로 바꿨거든요. 그럼 다음은요? 문제를 살짝 바꿨습니다.

 

1
2
3
4
5
6
7
8
9
10
var name = 'zero';
function log() {
  console.log(name);
}
 
function wrapper() {
  var name = 'nero';
  log();
}
wrapper();

 

똑같이 nero 아니냐고요? 땡! zero입니다. 스코프는 함수를 선언할 때 생긴다고 했죠? log 안의 name은 wrapper 안의 지역변수 name이 아니라, 전역변수 name을 가리키고 있는 겁니다. 이런 것을 lexical scoping이라고 합니다. 한글로는 어떻게 번역해야 할지 모르겠네요. 직역하면 어휘적 범위인데 좀 어색하죠? 정적 스코프가 더 나아 보이네요.

 

lexical scoping이 좀 이해하기 힘들기 때문에 다시 설명드리겠습니다. 함수를 처음 선언하는 순간, 함수 내부의 변수는 자기 스코프로부터 가장 가까운 곳(상위 범위에서)에 있는 변수를 계속 참조하게 됩니다. 위의 예시에서는 log 함수 안의 name 변수는 선언 시 가장 가까운 전역변수 name을 참조하게 됩니다. 그래서 wrapper 안에서 log를 호출해도 지역변수 name='nero'를 참조하는 게 아니라 그대로 전역변수 name의 값인 zero가 나오는 겁니다.

 

무슨 짓을 해도 log 함수가 한 번 선언된 이상, 전역변수를 가리키게 되어있는 name 변수가 다른 걸 가리키게 할 수 없습니다. 유일한 방법은 아까처럼 전역변수를 다른 값으로 바꾸는 겁니다. 다음 시간에 실행 컨텍스트에 대해서 배울텐데 그 때 정확한 원리를 설명드리겠습니다.

 

전역변수를 만드는 일은 지양하라고 했는데, 그 이유는 변수가 섞일 수 있기 때문입니다. 자바스크립트 앱을 만들면서 혼자만 개발하는 게 아니라, 여러 명과 협동도 하고, 다른 사람의 라이브러리(자바스크립트 코드 모음)를 사용하는 일도 많습니다. 그런데 전역변수를 사용하다보면, 우연의 일치로 인해 같은 변수 이름을 사용해서 이전에 있던 변수를 덮어쓰는 불상사가 발생할 수 있습니다. (특히 $나 _같은 유니크한 변수들은 경쟁이 치열합니다)

 

간단한 해결 방법은 전역 변수 대신 한 번 함수 안에 넣어 지역변수로 만드는 겁니다. 아니면 객체 안의 속성으로 만들 수도 있습니다.

 

1
2
3
4
5
6
var obj = {
  x: 'local',
  y: function() {
    alert(this.x);
  }
}

 

위 처럼 하면 obj.x, obj.y(); 이렇게 접근해야 하기 때문에 다른 사람과 섞일 염려가 없죠. obj를 통째로 덮어쓰지 않는 이상은요. 전역변수를 하나로 최소화해서 변수가 겹칠 우려도 최소화하는 거죠.

 

이런 방법을 네임스페이스를 만든다고 표현합니다. obj라는 고유 네임스페이스를 만들어서 겹치지 않게 하는 거죠. 대부분의 라이브러리가 네임스페이스를 사용하고 있죠. naver는 jindo, facebook은 FB, jquery는 jQuery(또는 $)같이요.

 

하지만, 위 방법의 단점은 누군가 고의적으로 x와 y를 바꿀 수 있습니다. 코드 밑에 스크립트를 추가해서요. obj를 통째로 바꾸지 않더라도 밑에 obj.= 'hacked';라고 한 줄 추가만 하면 obj.y();를 했을 시 local 대신 hacked가 alert됩니다. 그것을 방지하려면

 

1
2
3
4
5
6
7
8
var another = function () {
  var x = 'local';
  function y() {
    alert(x);
  }
  return { y: y };
}
var newScope = another();

 

조금 복잡하지만 위와 같이 하면 됩니다. another(); 하는 순간 return에 의해 {y: function () {alert(x)}};가 newScope에 저장됩니다. 이제 newScope라는 네임스페이스를 통해서 y에 접근할 수 있습니다. x는 접근할 수 없죠. 위처럼 함수로 감싼 후 return을 통해 공개할 변수(y)만 공개하고 비공개할 변수(x)는 비공개하는 방법을 취할 수 있습니다. 즉, return하는 변수는 공개 변수고, 다른 것은 비공개 변수인거죠.

 

위의 코드를 간략하게 바꾸면

 

1
2
3
4
5
6
7
8
var newScope = (function () {
  var x = 'local';
  return {
    y: function() {
      alert(x);
    }
  };
})();

 

위와 같이 쓸 수 있습니다. another같은 변수를 한 번 거치는 대신, newScope에 바로 집어넣은거죠. 처음보는 게 나왔는데요. (function() {})();구문입니다. IIFE(즉시 호출 함수 표현식)이라고도 하고, 모듈 패턴이라고도 하는데, 함수를 선언하자마자 바로 실행시켜버리는 거죠. 함수를 function() {}로 선언하면서 동시에 ()를 붙이니까 즉시 실행됩니다. 이 구문이 라이브러리를 만들 때 기본입니다. 많은 라이브러리가 이 구문을 활용하고 있습니다. 비공개 변수가 없는 자바스크립트에 비공개 변수 기능을 만들어주기 때문이죠. 이 패턴은 꼭 기억하고 있어야합니다!

위의 패턴의 원리를 알려면 실행 컨텍스트에 대해 알아야 합니다. 다음 시간에는 제일 중요한 개념인 실행 컨텍스트와 그것을 활용한 클로저에 대해 알아보겠습니다.

 

 

 

출처 : https://www.zerocho.com/category/Javascript/post/5740531574288ebc5f2ba97e

1
history.replaceState({}, nulllocation.pathname);
1
2
3
4
5
6
7
8
9
10
11
12
13
      $.urlParam = function(name){
        var results = new RegExp('[\?&]' + name + '=([^&#]*)').exec(window.location.href);
        return results[1|| 0;
    }
 
    var sample_url01 = "https://www.sampleURL01.com";
    var sample_url02 = "https://www.sampleURL02.com"
 
    if    ($.urlParam('url_chk'== "url01") {
        $(".selector").attr("href", sample_url01)
    } else {
        $(".selector").attr("href", sample_url02)
    }
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<!DOCTYPE html>
<html lang="ko-KR">
<head>
    <meta charset="utf-8" />
    <title>title</title>
    <style type="text/css">
        button.ui-datepicker-current,
        button.ui-datepicker-trigger,
        table.ui-datepicker-calendar { display:none; }
    </style>
</head>
<body>
    <div id="document_wrap">
        <div id="content_box">
            <link rel="stylesheet" href="http://code.jquery.com/ui/1.10.2/themes/smoothness/jquery-ui.css" />
            <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
            <script src="http://code.jquery.com/ui/1.10.2/jquery-ui.js"></script>
            <script>
                $(document).ready(function () {
                    $.datepicker.monthpicker = {
                        closeText: '닫기',
                        nextText : '다음 달',
                        prevText : '이전 달',
                        currentText : "오늘",
                        changeMonth : true,
                        changeYear : true,
                        monthNames : ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
                        monthNamesShort : ['1월','2월','3월','4월','5월','6월','7월','8월','9월','10월','11월','12월'],
                        dayNames : [ "일요일""월요일""화요일""수요일""목요일""금요일""토요일" ],
                        dayNamesShort : ['일''월''화''수''목''금''토'],
                        dayNamesMin : ['일''월''화''수''목''금''토'],
                        weekHeader : "주",
                        firstDay : 0,
                        isRTL : false,
                        showMonthAfterYear : true,
                        yearSuffix : "년",
                        showOn: 'both',
                        // buttonText: "달력",
                        showButtonPanel: true,
                        dateFormat: 'yy-mm',          
                        yearRange: "-10:+0",
                  };
                    
              $.datepicker.setDefaults($.datepicker.monthpicker);
 
                    var datepicker_default = {
                        showOn: 'both',
                        buttonText: "달력",
                        currentText: "이번달",
                        changeMonth: true,
                        changeYear: true,
                        showButtonPanel: true,
                        yearRange: 'c-99:c+99',
                        showOtherMonths: true,
                        selectOtherMonths: true
                    }
                    datepicker_default.closeText = "선택";
                    datepicker_default.dateFormat = "yy-mm";
                    datepicker_default.onClose = function (dateText, inst) {
                        var month = $("#ui-datepicker-div .ui-datepicker-month :selected").val();
                        var year = $("#ui-datepicker-div .ui-datepicker-year :selected").val();
                        $(this).datepicker("option""defaultDate"new Date(year, month, 1));
                        $(this).datepicker('setDate'new Date(year, month, 1));
                    }
                    datepicker_default.beforeShow = function () {
                        var selectDate = $("#sdate").val().split("-");
                        var year = Number(selectDate[0]);
                        var month = Number(selectDate[1]) - 1;
                        $(this).datepicker("option""defaultDate"new Date(year, month, 1));
                    }
                    $(".month_picker").datepicker(datepicker_default);
                });
            </script>
            <form name="frmEX">
                년-월 : 
                <input type="text" name="sdate" id="sdate" size="7" maxlength="7" value="2018-10" />
                <br />
                년, 월만 선택 할수 있도록 변경하였습니다.
            </form>
        </div>
    </div>
</body>
</html>
 
 
 

 

datepicker옵션

옵션 설명 사용예
altField $( ".selector" ).datepicker({
    altField: ".selecter"
});
선택한 날짜가 해당 폼에 입력된다.
altFormat $( ".selector" ).datepicker({
    altFormat: "yyyy-mm-dd"
});
altField의 폼에 입력될 날짜의 형식
beforeShow $( ".selector" ).datepicker({
    beforeShow: function(input, inst) {
        // input은 폼
        // inst는 datepicker의 여러 값이 있던데 
        //          아직 쓸모를 찾지 못했다.
    }
});
달력이 그려지기 전에 처리할 일들을 지정할 수 있다.
buttonImage $( ".selector" ).datepicker({ 
    buttonImage: "/images/datepicker.gif" 
});
 
buttonImageOnly $( ".selector" ).datepicker({
    buttonImageOnly: true 
});
 
buttonText $( ".selector" ).datepicker({ 
    buttonText: "선택" 
});
 
changeMonth $( ".selector" ).datepicker({ 
    changeMonth: true 
});
셀렉트박스로 월 변경 여부
changeYear $( ".selector" ).datepicker({ 
    changeYear: true 
});
셀렉트박스로 연도 변경 여부
closeText

$( ".selector" ).datepicker({ 
    closeText: "닫기" 
});

 

constrainInput $( ".selector" ).datepicker({ 
    constrainInput: false 
});
형식외 텍스트 입력제한. 디폴트 true
currentText

$( ".selector" ).datepicker({ 
    currentText: "Now" 

});

 
dateFormat $( ".selector" ).datepicker({ 
    dateFormat: "yy-mm-dd" 
});
 
dayNames $( ".selector" ).datepicker({ 
    dayNames: 
        [ "일요일", "월요일", "화요일", "수요일", 
        "목요일", "금요일", "토요일" ] 
});
 
dayNamesMin $( ".selector" ).datepicker({ 
    dayNamesShort: 
        [ "S", "M", "T", "W", "T", "F", "Sa" ] 
});
 
dayNamesShort $( ".selector" ).datepicker({ 
    dayNamesShort: 
        [ "일", "월", "화", "수", "목", "금", "토" ] 
});
 
defaultDate $( ".selector" ).datepicker({ 
    defaultDate: +7 
});
달력 기본 출력될때 기준일. Date타입, 숫자, String 다 가능하다.
duration $( ".selector" ).datepicker({ 
    duration: "slow" 
});
달력 나타나는 속도, "slow", "normal", "fast"
firstDay $( ".selector" ).datepicker({ 
    firstDay: 1 
});
주의 시작일을 일요일로 하려면 0, 월요일은 1
gotoCurrent $( ".selector" ).datepicker({ 
    gotoCurrent: true 
});
 
maxDate $( ".selector" ).datepicker({ 
    maxDate: "+1m +1w" 
});
 
minDate $( ".selector" ).datepicker({ 
    minDate: new Date(2012, 1 - 1, 1) 
});
 
monthNames $( ".selector" ).datepicker({
    monthNames: 
        [ "1월", "2월", "3월", "4월", "5월", "6월", 
        "7월", "8월", "9월", "10월", "11월", "12월" ] 
});
 
monthNamesShort $( ".selector" ).datepicker({ 
    monthNamesShort: 
        [ "Jan", "Feb", "Mar", "Apr", "Maj", "Jun", 
        "Jul", "Aug", "Sep", "Okt", "Nov", "Dec" ] 
});
 
nextText $( ".selector" ).datepicker({ 
    nextText: "차월" 
});
 
numberOfMonths $( ".selector" ).datepicker({ 
    numberOfMonths: [ 2, 3 ] 
});
여러개월 달력을 표시
onChangeMonthYear $( ".selector" ).datepicker({
    onChangeMonthYear: function(year, month, inst) {
        // year 년도 숫자
        // month 월 숫자
        // inst는 datepicker의 여러 값이 있던데 
        //          아직 쓸모를 찾지 못했다.
    }
});
달력에서 연월을 셀렉트 박스로 바꿀 수 있을때 바꿀때 이벤트
onClose $( ".selector" ).datepicker({
    onClose: function(dateText, inst) {
        // dateText는 날짜 스트링
        // inst는 datepicker의 여러 값이 있던데 
        //          아직 쓸모를 찾지 못했다.
    }
});
 
onSelect $( ".selector" ).datepicker({
    onSelect: function(dateText, inst) {
        // dateText는 날짜 스트링
        // inst는 datepicker의 여러 값이 있던데 
        //          아직 쓸모를 찾지 못했다.
    }
});
 
prevText $( ".selector" ).datepicker({ 
    prevText: "전월" 
});
 
selectOtherMonths $( ".selector" ).datepicker({ 
    selectOtherMonths: true 
});
다른 달도 출력시 선택가능 여부. 디폴트는 false
showAnim $( ".selector" ).datepicker({ 
    showAnim: "fold" 
});
달력 에니메이션 효과. show(디폴트), slideDown, fadeIn etc..
showCurrentAtPos $( ".selector" ).datepicker({ 
    showCurrentAtPos: 3 
});
여러 달의 달력을 한꺼번에 띄울 경우 시작월을 현재를 기준으로 달 수. 
0이 현재월. -5면 5개월 전, 3이면 3개월 후
showOptions $( ".selector" ).datepicker({ 
    showOptions: { direction: "up" } 
});
달력 보여줄때 이벤트 옵션
showOtherMonths $( ".selector" ).datepicker({ 
    showOtherMonths: true 
});
월 1일 이전, 월 말일 이후 빈칸에 이전달, 다음달 날짜 출력 여부
showWeek $( ".selector" ).datepicker({ 
    showWeek: true 
});
주수 출력 여부
stepMonths $( ".selector" ).datepicker({ 
    stepMonths: 3 
});
달력에서 좌우 선택시 이동할 개월 수
weekHeader $( ".selector" ).datepicker({ 
    weekHeader: "주" 
});
 
yearRange $( ".selector" ).datepicker({ 
    yearRange: "2010:2013" 
});
연도 범위
yearSuffix $( ".selector" ).datepicker({ 
    yearSuffix: "년" 
});
 

마크업 부분

1
2
3
4
<script src="https://code.jquery.com/jquery-1.7.0.min.js"></script>
<script src="https://aishek.github.io/jquery-animateNumber/javascripts/jquery.animateNumber.js"></script>
 
<p id="decimals">From $0,00 to $5000,00</p>
cs


스크립트 부분

1
2
3
4
5
6
7
8
9
10
11
12
$('#decimals')
  .animateNumber(
    {
      number: 2500,
      numberStep: function(now, tween) {
        // see http://stackoverflow.com/a/14428340
        var formatted = now.toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,');
        $(tween.elem).text('$' + formatted);
      }
    },
    20000
  );
cs

참고 : http://stackoverflow.com/a/14428340

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<!-- 마크업  -->
 
<div id="popup-cookie">
    <img src="/images/user/popup.jpg"/>
    <div>
        <ul class="clfix">
            <li><a href="javascript:;" onclick="todaycloseWin();" alt="오늘 하루 열지 않기">오늘 하루 열지 않기</a></li>
            <li><a href="javascript:;" onclick="closeWin();" alt="닫기">닫기</a></li>
        </ul>
    </div>
</div>
 
 
<!-- 스크립트 -->
 
<script language="Javascript">
    $( document ).ready(function() {
            cookiedata = document.cookie;
 
        if ( cookiedata.indexOf("ncookie=done"< 0 ){
            document.getElementById('popup-cookie').style.display = "block";
        $("#wrap").prepend('<div id="dimm-cookie" onclick="dimm_close();" class="black" />');
            } else {
            document.getElementById('popup-cookie').style.display = "none";
        }
    });
 
        function setCookie( name, value, expiredays ) { 
            var todayDate = new Date();
        todayDate.setDate( todayDate.getDate() + expiredays );
        document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
    }
 
        function closeWin() {
            document.getElementById('popup-cookie').style.display = "none";
        $("#dimm-cookie").remove();
    }
 
        function todaycloseWin() {
            setCookie("ncookie""done"1);
        document.getElementById('popup-cookie').style.display = "none";
        $("#dimm-cookie").remove();
    }
 
        function dimm_close() {
            $("#dimm-cookie").remove();
        document.getElementById('popup-cookie').style.display = "none";
    }
</script>
 
 

 

"onclick"으로 "this"를 인식하는 방법

온클릭 펑션의 인자값을 "this"로 정하고 


스크립트에서는 아무인자값을 정해서 "this"를 대체한다.

1
2
3
4
5
6
7
8
9
<a href="javascript:;" onclick="enom(this)" >클릭</a>
 
<script>
    function enom(elem_this) {
        $(elem_this).addClass("act");
    }
</script>
 
 
cs




+ Recent posts