2010-04-06 2 views
7

다음과 같은 마크 업과 자바 스크립트를 사용하여 일부 항목을 정렬했습니다. 항목은 블록 내에서 또는 다른 블록간에 정렬 될 수 있습니다. 그것은 작동하지만 항목을 한 블록에서 다른 블록으로 이동 한 후 올바른 블록 ID를 검색하는 데 문제가 있습니다. 나는 "블록 1"내에서 항목 1을 이동하는 경우Jquery를 사용하여 정렬 후 상위 컨테이너 ID를 검색하는 방법은 무엇입니까?

예를 들어, 나는 "나는 블록 = block_1에서이다"얻을하지만 블록 2에 항목 하나를 이동하면 나는 아직도 내가

블록 1에 오전 얻을 하지만 블록 2를 부모 컨테이너로 만들고 싶습니다. 이 ID를 검색하여 Ajax를 수행하고 그에 따라 db를 업데이트 할 수 있도록해야합니다.

이 문제를 바로 해결해 주시겠습니까 ??

<div id="blocks_sortable"> 
    <div id="block_1"> 
     <h2>Block 1</h2> 

     <div class="items_sortable connectedSortable"> 
      <div id="item_1"> 
       <span>Item 1</span></div> 
      <div id="item_2"> 
       <span>Item 2</span></div> 
      <div id="item_3"> 
       <span>Item 3</span></div> 
     </div> 
    </div> 
    <div id="block_2"> 
     <h2>Block 2</h2> 

     <div class="items_sortable connectedSortable"> 
      <div id="item_4"> 
       <span>Item 4</span></div> 
      <div id="item_5"> 
       <span>Item 5</span></div> 
      <div id="item_6"> 
       <span>Item 6</span></div> 
     </div> 
    </div> 
</div> 

<script> 
$("#blocks_sortable").sortable({ }); 
$(".items_sortable").sortable({ 
    connectWith: '.connectedSortable' 
    , forcePlaceholderSize: true 
    ,   stop : function(event, ui){ 
        alert("I am in block = "+$(this).parent().attr("id")); 
       } 
}).disableSelection();  
</script> 

고맙습니다.

+0

당신이 알고 있어야하는 또 다른 사항은 일반적으로 이벤트에서 발생하는 함수에서 이벤트가 "this"...로 참조되는 것입니다. 그래서 당신이 요구하는 것은 이벤트 객체의 부모입니다. 이동되는 요소 적어도 그것이 작동하는 방식이라고 생각합니다 ... 바닐라 JS에서 작동하는 방법입니다 (다시 jQuery에 대한 경험이 없으므로 $ (this)가 다른지 알 수 없습니다) – MisterMister

답변

7

내가 잘못된 이벤트를 사용하고있는 것으로 의심됩니다. 기본적으로 내가 생각하는 것은 정지 이벤트가 너무 빨리 또는 잘못된 개체에 대해 발사된다는 것입니다.

문서 Here을 읽은 다음 수행하려는 작업에 적합한 이벤트가 있는지 확인합니다.

내가 원하는 것은 "업데이트"또는 "비활성화"이벤트와 같은 것입니다.

하나의 "블록"에서 다른 블록으로 항목을 이동하면이 두 이벤트가 각 "블록"에 대해 한 번씩 실행됩니다.

비활성화는 항상 모든 블록에 대해 발사하는 블록 내에서 이동 한 경우

업데이트는 한 번만 실행됩니다.

 $(".items_sortable").sortable({ 
      connectWith: '.connectedSortable', 
      forcePlaceholderSize: true, 
      update: function(event, ui){ 
       if(ui.sender){ 
        alert(ui.item.attr("nodeName") + " in block = " + 
        $(this).parent().attr("id")); 
       } 
      } 
     }).disableSelection(); 

부모 ID를 알려줍니다 항목이 다른 블록으로 이동 ONLY : 이벤트가 ui.sender 확인하여 "정품이 아닌"블록에서 발사되는 경우 확인할 수 있습니다 업데이트에서

. 두 블록 모두 이벤트가 실행되지만 경고는 '원본이 아닌'이벤트에만 표시됩니다.

이제 요소가 누락되는 "원래"에 대한 일단

, 그리고 하나 : 당신은 내가 당신이 원하는 것을 의심 DB를에서 정보를 업데이트 할 수 AJAX를 사용하는 경우

두 블록 발사 할 수있는 이벤트입니다 이제 새로운 요소가되었습니다.

나는 당신이하고있는 일이나 jQuery UI에 익숙하지 않아서 더 구체적 일 수는 없다. 기억하십시오. 문서는 친구입니다.

희망이 도움이됩니다.

+0

대답 주셔서 감사합니다. 그냥 fyi, 그 같은 카테고리 및 제품 관계의 일종 .. 테이블 Item_id, Block_id, 이름, 주문 및 Blocks는 block_id, block_name, block_order입니다. 따라서 사용자는 블록 내에서 또는 블록 전체에서 항목을 정렬하고 이러한 변경 사항을 db에 저장하려고합니다. 따라서 항목이 이동되면 모든 항목 (toArray 및 현재 블록을 사용하여 가져올 수있는 항목)이 필요합니다. 나는 업데이트/비활성화에 대해 간략하게 살펴볼 것이지만 철저히 다시 점검하고 알려줄 것입니다. 감사. – user187580

+0

행운을 빈다. 희망을 좀 도울 수있었습니다. – MisterMister

+0

정말 고마워요, 고마워요! – cawecoy

1

id 속성을 사용하는 대신 색인을 사용하여 요소를 식별하는 것이 더 좋습니다.

그래서 더

alert('I am in block' + $(this).parent().index()); 
+0

아니요. 작동 또는 나는 그것을 제대로 사용하는 방법을 모른다. -1 등 인덱스를 얻을 – user187580

0

처럼 당신은 안전을 재생하고 적절한 부모 ID의 값을 보유 할 REL 속성을 추가 할 수 있습니다. 요소를 이동할 때 REL 속성을 유지 보수하는 데 필요한 코드를 추가해야합니다.

관련 문제