2012-08-08 1 views
0

나는 내가 겪고있는 매우 이상한 문제가 있습니다. 내 사이트 중 하나에서 JQueryUI의 jsTree를 사용하고 있으며, 다른 .js 파일에서 다른 구현을 사용하고 있습니다. 그것들 중 하나가 작동하는 것처럼 보이는데, 이는 깨진 구현과 거의 동일한 코드 (변수 이름 만 다름)를 사용하기 때문에 매우 혼란 스럽습니다. 문제는 contextmenu 함수에서 발생합니다. 내가 사용하고있는 코드는 다음과 같습니다 :Javascript 배열 임의로 요소를 잃는 중

$(document).ready(function() { 
    if(typeof dryerList == 'undefined' || dryerList.length == 0) { 
     var dryerList = []; 
     $.ajax({ 
      url:'../TrackingApp/getGrainBins.php?t=234.23423452353', 
      async: false, 
      success: function(text) { 
       try { 
        dryerList = $.parseJSON(text); 
       } catch (e) { 
        alert('ERROR: ' + e); 
       } 

       if(dryerList.length == 0) { 
        alert('ERROR: No fleet data received.') 
       } 
      } 
     }); 
    } 

    $("#dryerListTree").jstree({ 
     plugins : ['json_data', 'ui', 'themes', 'contextmenu'], 
     contextmenu: {items: customBinMenu}, 
     json_data : { data: binNodes } 
    }); 

    $('#dryerListTree').bind("dblclick.jstree", function (event) { 
     var node = $(event.target).closest("li"); 
     var id = node[0].id; 

     for(i=0; i < dryerList.length; i++) { 
      if(id == dryerList[i].id) { 
       centerMap(dryerList[i].y, dryerList[i].x); 
       break; 
      } 
     } 
    }); 
}); 


function customBinMenu(node) { 
    if ($(node).hasClass("folder")) { 
     return; 
    } 

    var items = { 
     centerItem: { 
      label: "Locate", 
      action: function() { 
       // Centers map on selected bin 
       var id = node[0].id; 

       for(i=0; i < dryerList.length; i++) { 
        if(id == dryerList[i].id) { 
         centerMap(dryerList[i].y, dryerList[i].x); 
         break; 
        } 
       } 
      } 
     }, 
     dashboardItem: { 
      label: "Dashboard", 
      action: function() { 
       // Opens dryer info window over map 
       var id = node[0].id; 
       var dryerIndex = -1; 

       for(i=0; i < dryerList.length; i++) { 
        if(id == dryerList[i].id) { 
         dryerIndex = i; 
         break; 
        } 
       } 
      } 
     } 
    }; 

return items; 
} 

이상한 점은 두 번 클릭 처리기가 잘 작동한다는 것입니다. customBinMenu() 함수에 도착하면 dryerList 배열이 있고 dryerList [0]에 5 개의 값 중 4 개가 포함되어 있어야하지만 어떻게 든 'id'요소가 해당 객체에서 삭제됩니다. 나는 이것을 꽤 오랫동안보고 있었고, 다른 데이터를 잃지 않고 객체로부터 하나의 엘리먼트를 떨어 뜨릴 수있는 방법을 찾아 낼 수 없다. 특히 동일한 코드가 동일한리스트에서 작동 할 때 특히 그렇다. 어떤 제안?

+7

전역 변수 "i"는 세 곳에서 사용하고 있습니다. 'var'를 사용하여 로컬 변수를 선언하려면 JavaScript에서 매우 조심해야합니다. – Pointy

+0

여러 곳에서 사용하고 있지만, 순차적으로 만 변수를 사용할 때마다 다시 설정되고 재설정 될 때까지 다시 사용되지 않습니다. – Crash

+0

나는 그것이 아마도 문제가 아니라는 것에 동의하지만 그럼에도 불구하고 위험한 불필요한 연습입니다. – Pointy

답변

1

좋아, 나는 귀하의 질문에 읽기 : '와 dryerList [0] (5 개) 값의 4를 포함하는이 should-하지만 어떻게 든'ID 으로
그래서 '요소가 해당 객체에서 제외 된' ' 요소 '
'값 ' 나는'속성 '을 의미한다고 가정합니다. 노드의'id '속성이 정확합니까 ??

난 당신의 코드에서 볼

: var id = node[0].id;

되어야한다 : var id = node[0].getAttribute("id");

행운을 빕니다!

UPDATE 1 :
var id = node[0].id; (귀하의 코멘트에 따라) 괜찮습니다 ([0] 노드에서 ID를 받고) 경우 그냥 (재) 정의 된 ID가를 수 있기 때문에 좋아, 다음 if(id == dryerList[i].id)가 잘못 보이는 노드 [0]의 ID 값.
실제로 'var'(이 경우)로 'id'를 사용하지 않습니다.

그래서 당신은 무엇을 한 경우 : 다음 var idc = node[0].getAttribute("id");
과 : if(idc === dryerList[i].getAttribute("id"))

UPDATE 5 :

  • 당신은을 닫습니다 세미콜론을 잊었 :
    당신은 여전히 ​​그런데 약간의 오차가 있습니다 알림 :
    if(dryerList.length == 0) { alert('ERROR: No fleet data received.') }
  • 2 호선과 14 호선에서 '0'과 비교하려면 '==='을 사용해야합니다.
  • 실생활에서는 customBinMenu (node) 함수를 document.ready 함수에서 사용하기 전에 정의해야합니다.
    코드 순서를 바꿔서 고칠 수 있습니다.
  • var dryerList를 정의하기 전에이 document.ready 기능을 사용하는 경우에도 마찬가지입니다.
    에 의해 고정 : var dryerList = dryerList || []; if(dryerList.length === 0){//ajax & json code}

당신이 만족 할 수 유효 이제 자바 스크립트입니다 확인this fiddle 경우, 여전히 'id' - 속성의 문제를 초래 의도 기준 코드를 나타냅니다 dryerList의 노드 컬렉션에서 '정의되지 않음'입니다 (게시 된 코드에이 jsfiddle에서 수정 된 간단한 오류 (: 업데이트 1에서 언급 한 내용 제외)가 포함되어있어 문제가 아님을 언급 했으므로)?

dryerList가 이미 존재하는지 (왜 document.ready부터 시작했는지) 물어볼 수 있습니까?
수정 된 바이올린을 데모 데이터로 업데이트하여 주변에서 놀 수 있는지 물어볼 수 있습니까?

+0

글쎄, 일종의 것처럼 보이지만, 노드 [0] .id 값이 정확합니다. 여러 번 경고했고 정확한 값을 보여주기 때문에 문제가되지 않습니다. – Crash

+0

그러면 언제 ID를 드롭합니까? 어쩌면 jsfiddle이 하나를 추적하는 데 도움이 될 것입니다. – GitaarLAB

+0

님이 귀하의 의견을 반영하도록 제 답변을 업데이트했습니다. – GitaarLAB