본문 바로가기
javascript

2024-02-27

by rewind 2024. 2. 27.
<!DOCTYPE html>
<meta charset="UTF-8">
<body>
    <div id="hian">
        <div>희</div>
        <div>환</div>
    </div>
    <div id="hian">인호</div>
    <div id="hian">소희</div>
    <div id="hian">초록</div>
    <input type="text" class = "yj" value="가"><br>
    <input type="text" class = "yj" value="나"><br>
    <input type="text" class = "yj" value="다"><br>
    <input type="text" class = "yj" value="라"><br>
</body>
<script>
    // function -> class
    // prototype -> 메모리 공유
    // 즉각실행함수 -> 핵심코드 보호 및 초기화
    // jQuery 안의 callback 스타일
    // 메소드체이닝 , return this -> 생성자 함수의 return this와 맥락상 구별!
    // 읽기에는 메소드 체이닝을 일반적으로 구현하지 못함
// jQuery 핵심 코어부분(간략버전 , 흐름 이해하기)
(function(){
    const $ = function(cssSel){
        return new myDom(cssSel);
        }
    const myDom = function(cssSel){
        let domElems = document.querySelectorAll(cssSel);
        this.length = domElems.length;
        for(let i = 0; i < domElems.length; i++){
            this[i] = domElems[i];
        }
        return this;    // class의 의미로(생성자로 쓰겠다는 명시적 표현)
}
window.$ = $; // $->const $를 가리킴, 참조방식이어서 지역변수 $와 전역변수 $가 가리키는 곳이 같다
$.fn = myDom.prototype;    // 이게 밖으로 빠지면 , 사용자도 쉽게 메소드 추가 가능!
})();

// jQuery Plug-in 방식을 이용해서 필수 메소드 몇개만 직접 만들어보자
// html() , innerHTML 속성을 편하게 제어해주는 메소드!
// html() -> 읽기 , html("asd") -> 전부쓰기 , html(function(pIdx , pVal){}) -> 부분조작

// html메소드 직접 구현하기
$.fn.html = function(pArg){
    // pArg가 안 넘어 왔을 때(pArg == undefined) -> 읽기 동작(여러개 있을 때는 무조건 첫번째)
    // 보통 읽기(그결과가 바로 필요할때)에는 메소드 체이닝을 구현하지 않는다
    if(!pArg){
        return this[0].innerHTML;
    }
    // pArg에 문자열이 넘어왔을 때 , 전부 쓰기
    if(typeof(pArg) == "string"){
        for(let i = 0; i < this.length; i++) {
            this[i].innerHTML = pArg;
        }
        return this; // 끝내기
    }
    // pArg에 function(콜백함수)이 넘어왔을때 , 부분조작
    if(typeof(pArg) == "function" ){
        for(let i = 0; i < this.length ; i++){
            // callback 함수에서 this값을 편하게 쓰기 위해 call사용
            this[i].innerHTML = pArg.call(this[i],i, this[i].innerHTML);
        }
        return this;     // 끝내기 , 메소드 체이닝을 위해 , 현재 객체를 리턴
    }
}
// val method(value 속성 제어)

$.fn.val = function(pArg){
    if(!pArg){
        return this[0].innerHTML;
    }
    return this; // 끝내기
    // pArg에 문자열이 넘어왔을 때 , 전부 쓰기
    if(typeof(pArg) == "string"){
        for(let i = 0; i < this.length; i++) {
            this[i].innerHTML = pArg;
        }
        return this; // 끝내기
    }
    // pArg에 function(콜백함수)이 넘어왔을때 , 부분조작
    if(typeof(pArg) == "function" ){
        for(let i = 0; i < this.length ; i++){
            // callback 함수에서 this값을 편하게 쓰기 위해 call사용
            this[i].innerHTML = pArg.call(this[i],i, this[i].innerHTML);
        }
        return this;     // 끝내기 , 메소드 체이닝을 위해 , 현재 객체를 리턴
    }
}

// 꼭 직접 만들어 보는 걸 추천(attr 메소드)

// style을 제어하는 css 메소드 , 매개변수가 최대 2개
$.fn.css = function(pArg1 , pArg2){ // 1:속성명(무조건) , 2:빈값 , 해당속성의값 , 콜백함수
    if(!pArg2){
        return this[0].style[pArg1];    // 읽기
    }
    if(typeof(pArg2) == "string"){
        for(let i = 0; i < this.length; i++){   // 전부 쓰기
            this[i].style[pArg1] = pArg2;
        }
        return this;    // 메소드 체이닝
    }
    if(typeof(pArg2) == "function"){
        for(let i = 0 ; i < this.length ; i++){
            this[i].style[pArg1] = pArg2.call(this[i] , i , this[i].style[pArg1]);
        }
        return this;    // 메소드 체이닝
    }
}
$("div").css("color" , "blue"); // 전부쓰기
alert($("div").css("color"));   //? 빈값?

$("div").css("color",function(pInx , pVal){
//    console.log(pInx , this);
    if(pInx == 5){
        return "green";
    }
    return "gray";
}).html("<h1>인호 IT관상</h1>");

//alert($(".yj").val());  // 매개변수 없이 넘기면 첫번째 텍스트의 value값을 읽어온다;
$(".yj").val("전부 쓰기?")  // 전부 쓰기
        .val(function(pInx , pVal){
            if(pInx == 3){
                return "가ㅁㅁ나 다";
            }
            return pVal;
        })

 

console.log($("div")[1])    // 이런식으로 꺼내면 jquery 객체인가 아닌가?

 

jQuery 객체가 아니고 dom객체임! dom객체이기때문에

console.log($("div")[1].val()) 이런형태로 사용 불가

 

 

<!DOCTYPE html>
<meta charset="UTF-8">
<script>
// 개발자가 알아야 할 CSS , 특히 레이아웃
// display , position , overflow , z-index , transform 이정도는 필수로

// 인트라넷에서 활용
window.open("//google.com" , "d", "width=300, height=300, left=50 , top=300");
</script>

 

display : 화면에 보였다가 감췄다가(보이고 안보이고)

position(위치) , overflow(스크롤) , z-index(레이어) ,  transform(가끔 재미요소)

window.open -> 지양하는 추세이지만 , 인트라넷 같은 경우에는 쓰면 상당히 유용하고 편하다

범용적인 서비스 사이트를 개설하는 경우 , 소비자가 막을 수 있어서 선택에 주의

-> 이 대안으로 나온것이 모달이고 css를 갖다 쓰는건 문제 없지만,  자신만의 모달을 만들 수 있어야 한다

 

모달직접 만들어보기 , 나의모달.html 생성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <div id="wrapper">
        
    </div>
</body>
</html>

 

body에 전체 내용을 작성하지 않는다

 

함수이름({}) // 함수 호출문법
jsonFlickrFeed({
... ... ...
})

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
<div id="disp"></div>
<script>
const myDisp = document.querySelector('#disp');
// 호출되는 함수를 미리 만들어 둔다 , 그래야 호출 되니까
const jsonFlickrFeed = function(pData){
    alert("호출되나?");
    console.log(pData);
    let recvItems = pData.items;
    for(let i = 0 ; i < recvItems.length ; i++){
        let item = recvItems[i];
        console.log(item.media.m);
    }
}
</script>
<script src="https://www.flickr.com/services/feeds/photos_public.gne?tags=cat&format=json"></script>
</body>
</html>