자바스크립트(jQuery) 함수에 변수를 초기화해서 넘기고 싶어요.

조회수 1924회

이미지 $gall 이라는 요소 클릭시 사진에 보이는 슬라이드 쇼 화면 $zoom이 나오는 그림인데, 밑 $previewImg 들을 클릭해서도 slide()함수가 실행되게끔 하고싶은데 새로운 변수 i를 기존 slide()함수에 들어가있는 i에 덮고싶습니다.

예를 들어 $gall 중 세번째 요소를 클릭해서 $zoom이 화면에 나오게 됐을 때, 변수 i 에는 2라는 값이 저장돼 있는데, $zoom 안에 $previewImg 중 네번째 요소를 클릭하면, 그대로 $gall을 클릭했던 때의 세번째 사진이 화면에 출력됩니다. 당연히 slide()함수 안에 변수 i에는 2라는 값이 저장돼 있구요. 어떻게 해결해야 할까요? 도와주세요!

        var $gall = $('div.after_load > div.modal_wrap > div.modals.modal_history > div.content > div.gallery > div.images');
    var i,
        count = $gall.length - 1,
        $viewImg = $zoom.find('div.image > img'),
        $previewImg = $zoom.find('div.preview > div.item_wrap > div.items');
    //var $imgTitle = $gall.eq(i).children('h5.img_expl');

    $gall.on('click', function(){
        //show $zoom
        $zoom.show();
        i = $gall.index(this);
        slide();

        // 닫기 버튼을 누를때.
        $zoom.children('span').on('click', function(){
            $zoom.hide();
        });
    });

    function slide(){
        var cur = $gall.eq(i).children('img');

        // $previeImg hover effect.
        if (!$previewImg.hasClass('active')) {
            $previewImg.children('img').mouseover(function(){
                $(this).addClass('active');
            });
        };

        $viewImg.attr('src', cur.attr('src'));
        $viewImg.fadeOut(0);
        $viewImg.fadeIn(500);

        $previewImg.children('div.border').css('display', 'none');
        $previewImg.eq(i).children('div.border').css('display', 'block');
        $previewImg.children('img').removeClass('active');
        $previewImg.eq(i).children('img').addClass('active');

        console.log('current ',i)
    };

    $previewImg.on('click', function(){
        var i = $previewImg.index(this);
                **//slide() 함수 안에 새로운 변수 i를 전달하기.**
        slide();
    });

    function previous(){
        if(i > 0){
            i = i-1;
        }else{
            i = count;
        };
        slide();
    };

    function next(){
        if(i < count) {
            i = i+1;
        }else{
            i = 0;
        };
        slide();
    };

    $('div.gall_mask > div.zoom > div.controller > div.btn.left').on('click', function(){
        previous();
    });
    $('div.gall_mask > div.zoom > div.controller > div.btn.right').on('click', function(){
        next();
    });

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 지금 i를 전역변수로 쓰고 계시기 때문에 이 클로저 안에서 var i를 초기화하는 건 무의미합니다. 클로저 안에서 var i를 초기화하면 그건 그 클로저 안에서만 통하는 i이기 때문에, slide() 함수가 참조하고 있는 전역변수 i와는 무관하거든요.

    제 생각으로는 i란 "어떤 슬라이더의 현재 활성 슬라이드"를 의미하고 이건 상당히 지엽적인 변수입니다. 이걸 전역변수로 쓰시는 이유가 궁금하네요. 클릭으로 슬라이드 넘기는 것 자체는 그냥 이렇게 하면 작동할 듯한데... 정확히 문제가 뭔가요?

    $previewImg.on('click', function() {
        i = $previewImg.index(this); // prev(), next() 와 동일한 원리
        slide();
    });
    
    • slide() 함수에 이미 변수 `i`가 지정돼있는 상태여서 새로운 변수 i가 on() 메서드를 통해 slide() 함수로 넘어가지 못하는 현상입니다 알 수 없는 사용자 2019.1.25 21:11

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)