2012-06-29 1 views
2

좋아,이게 내가 JQuery에서 첫날이기 때문에 내가 만든 이러한 함수로 재미있게 지냈어. 다른 트리거를 클릭 할 때 div (#panel)를 숨기려고합니다. 아래는 세 가지 기능이 모두 사용되면 숨길 필요가있는 (#panel) 기능입니다. 내가 그것을 가지고있는 방식은 첫 번째 기능을 위해서만 작동합니다. 다른 두 요소는 요소를 숨기지 않습니다. 그래서 더 이상 고집하지 않고.다른 함수에서 같은 요소에 hide() 사용

jQuery(document).ready(function($){ 
var $panel = $(this).closest(".panel-container").find(".panel"); 
$('#searchsubmit').click(function(e){ 
    $('#boxes').empty(); 
    e.preventDefault(); 
    var $panel = $(this).closest(".panel-container").find(".panel"); 
    var search_val=$("#s").val(); 
    $.post(
     WPaAjax.ajaxurl, 
     { 
      action : 'loop_search', 
      search_val : search_val 
     }, 
     function(response) { 
      $('#boxes').append(response).masonry('reload'); 
      $panel.hide("slow"); 
      $('.trigger').removeClass("active"); 
      $('.trigger-loop').removeClass("active"); 
     } 
    ); 
}); 
$('#fame.trigger-loop').click(function(){ 
var $panel = $(this).closest(".panel-container").find(".panel"); 
    $('.trigger').removeClass('active'); 
    $('.trigger-loop').removeClass('active'); 
    $('#fame.trigger-loop').addClass('active'); 
    $('#boxes').empty(); 
    $.post(
     WPaAjax.ajaxurl, 
     { 
      action : 'loop_fame' 
     }, 
     function(response) { 
      $('#boxes').append(response).masonry('reload'); 
      $panel.hide("slow"); 
     } 
    ); 
}); 
$('#new.trigger-loop').click(function(){ 
var $panel = $(this).closest(".panel-container").find(".panel"); 
    $panel.hide("slow"); 
    $('.trigger').removeClass('active'); 
    $('.trigger-loop').removeClass('active'); 
    $('#new.trigger-loop').addClass('active'); 
    $('#boxes').empty(); 
    $.post(
     WPaAjax.ajaxurl, 
     { 
      action : 'loop_new', 
     }, 
     function(response) { 
      $('#boxes').append(response).masonry('reload'); 
      $panel.hide("slow"); 
     } 
    ); 
}); 

}); 

// - HTML

<li> 
<a id="fame" class="trigger-loop active" href="#"><div id="fame-icon"></div></a> 
</li> 
<li> 
<a id="new" class="trigger-loop" href="#"><div id="gold-artist"></div></a> 
</li> 
<li> 
<div class="panel-container"> 
    <div class="panel"> 
    <----content-----> 
    </div> 
    <a class="trigger" href="#"><div id="playlist-icon"></div></a> 
</div> 
</li> 
<li> 
<div class="panel-container"> 
    <div class="panel"> 
    <----content-----> 
    </div> 
    <a class="trigger" href="#"><div id="random-icon"></div></a> 
</div> 
</li> 
+1

당신은 당신의 패널이'ID = "패널"'당신'('# 패널') $ '로 액세스 할 수있는 경우에 대한 가장 가까운 걱정할 필요가 없습니다 귀하의 HTML – mgraph

+1

의 일부를 제공 할 수 있습니다/find –

답변

1

문제는 덮어 쓰기 및 바람직하지 않은 영향을받는 원인이되고있는 전역 변수를 가지고있다. 이 document.ready 제외 부모 범위가 없기 때문에

var $panel = $(this).closest(".panel-container").find(".panel"); 

그 라인은 글로벌 변수 $panel을 설정한다. 콜백 클로저 중 하나에있을 때 $panel이 다시 정의되면 관심 충돌이 발생합니다. 이러한 이름을 변경하여 충돌을 제거하십시오.

결과의

function(response) { 
     $('#boxes').append(response).masonry('reload'); 
     $panel.hide("slow"); 
} 

내부 대신 당신이 생각하고 지역화 된 버전을 호출의 글로벌 $panel를 호출한다. 그래서 그들 중 하나만 숨어 있습니다.

+0

@Utkanos - 하단의 편집을 봅니다.'function (response) {}'는 클릭 콜백의 클로저에 정의 된 변수가 아닌 전역 변수'$ panel'에 액세스하고 있습니다. –

+0

좋아, 나는 내가 읽은 것을 과감하게 잘못 해석했다. 방금 $ ('. panel')을 사용했습니다. 대신 hide()를 사용했습니다. –

+0

@ TravisJ - 글로벌 변수가 참조 될 것이라고 생각하는 이유에 대해 흥미가 있습니다. 각 이벤트 콜백에서 변수를 로컬 버전으로 덮어 씁니다. AJAX 콜백을 작성하면 해당 변수가 클로저 될 때 캡처됩니다. 따라서 AJAX 콜백은 항상 로컬 '$ 패널'을 참조 할 것이고, 절대 글로벌 콜렉터는 절대 참조하지 않을 것입니다. – Utkanos

0

모두 시도하십시오 $('#fame.trigger-loop').click$('#new.trigger-loop').click;

var $panel = $(this).closest('ul').find(".panel-container").find(".panel"); 
+0

게시물에 대한 응답 콜백을 들여다 보면, 로컬'$ panel'이 정의 된 것과 관계없이 절대 액세스되지 않는다는 것을 알 수 있습니다. 'undefined '일 수도 있습니다. –

관련 문제