2012-12-25 3 views
1

jquery를 처음 사용하며 문제가 발생하여 전문가의 도움이 필요합니다. 내가루프 밖에서 jquery 함수를 루프 외부에서 선언하여 호출하는 방법

#1 Don't make functions within a loop. 

가 나는 JQuery와 그렙 기능 의 기능을하고있는 문제를 알고이 오류가 발생했습니다 내에서 JSLint을 통과 할 때 여기

내 코드

for (val in list) { 
    var result = $.grep(node, function(e){ 
      return e.id === list[val].Id; 
    }); 
    if (result === 0) 
    // do something 
} 

입니다 하지만 루프 밖으로 내 함수를 이동하는 방법으로 붙어 오전 변수에 할당하고 다음 호출하십시오. 내 기능이 논쟁을 말하는 것처럼 e. 나는이

var Visible = function (e, list, val) {return e.id === list[val].Id;}; 

for (val in list) { 
    var result = $.grep(node, Visible(e, list, val)); 
} 

처럼 시도했지만 지금 jslint에 오류가 제공되는

#1 'e' was used before it was defined. 
    var result = $.grep(node, Visible(e)); // Line 125, Pos 69 

// -------------------- ------------------------------------------------

여기가 지금은 HTML 요소가 존재하는리스트의 어떤 요소에 대한 것을 발견하고 데이터

node: Array[5] 
    0: HTMLTableRowElement 
    1: HTMLTableRowElement 
    2: HTMLTableRowElement 
    3: HTMLTableRowElement 

list: Array[5] 
    0: Object 
    0: "cc" 
    1: "ss" 
    Id: "000" 
    1: Object 
    2: Object 

입니다 . 목록의 모든 요소에 대해 htmlelement가 존재하지 않으면 i r = 하나를 만듭니다. 결과로 확인합니다. === 0 이 문제의 해결책은 무엇입니까? 어떤 도움을 주셔서 감사합니다 감사

+0

이 코드로 달성하고자하는 것은 무엇입니까? – SergeyS

+0

'노드 '란 무엇입니까? '$ .grep'는 배열을 반환 할 것이므로 결코 0이 될 수 없다. 코드 목적을 이해하는 데 도움이됩니다. – charlietfl

+0

jQuery의'$ .each '를 사용하여이 경고를 해결할 수 있습니다. – elclanrs

답변

0

훨씬 간단 접근 방식이 존재하는 경우 단순히 ID 선택기를 작성하고 확인하는 것입니다 :


더 나은 솔루션 요소가 존재하는 배열의 모든 요소를 ​​제거 할 수

요소의 컬렉션은 filter() 방법

를 사용할 수

for (val in list) {  
    if($('#'+list[val].Id).length){ 
     /* element exists in page*/ 
    }  
} 
node 내에서 찾으려면 0
var $node=$(node); 
for (val in list) {  
    if($node.filter('#'+list[val].Id).length){ 
      /* element exists in node*/ 
    }  
} 
+0

당신의 응답을 위해 고맙게 생각한다. 그러나 그 문제는 나의 html 요소가 그것의 부모가 숨겨져 있을지도 모른다는 것이다. display : none –

+0

OK .. 쉽게': visible' 선택자를 추가하여 검사한다. 당신의 코드를 패치하려고 시도하는 대신에 당신이하려는 일에 대한 완전한 설명을 주면 정말로 도움이 될 것입니다. 'if ($ ('#'+ list [val] .Id) .is (': visible'))'를 쓸 수 있습니다. 당신이 필요로하는 해결책은 매우 똑똑합니다 likely need ... 당신이 필요로하는 것이 무엇인지 확실하지 않습니다 – charlietfl

+0

고맙습니다. 보이는 셀렉터를 사용하여 어떻게 체크 할 수 있는지 조금 설명해주십시오. 물론 내가이 점을 내 마음 속에 간직 할 것이다. –

2

Visible(e)을 쓸 때 함수는 인자 e과 함께 표시되도록 호출합니다. 이것은 당신이 원하는 것이 아닙니다. 함수 자체를 .grep()에게주고 싶습니다. 그래서 이런 식으로 고정하려고 :

var result = $.grep(node, Visible); 
+0

답장을 보내 주셔서 감사합니다 –

0

당신은 $.grep에 함수를 통과해야합니다. 그러나 Visible(e, list, val)은 함수를 호출하고 $.grep (반환 값은 true 또는 false)으로 전달하려고합니다. 그 순간에 e은 아직 정의되어 있지 않습니다 (이는 $.grep이 콜백에 전달해야하는 인수입니다). 루프에서 함수를 작성했다


function createCallback(id) { 
    return function(e) { 
     return e.id === id}; 
    }; 
} 

for (val in list) { 
    var result = $.grep(node, createCallback(list[val].Id)); 
} 
는만큼 괜찮 이러한 함수가 호출 될 때 :

대신 반환 비교를 수행하는 기능을하는 함수를 만들어야합니다 루프의 다음 반복 전에,하지만 JSLint는 매우 까다 롭습니다.

$.map(list, function() { 
    return $('#' + this.Id).length === 1 ? null : this; 
}).each(function() { 
    // create and append element here 
    // e.g. 
    $('<div />', {id: this.Id}).appendTo('#container'); 
}); 
+0

감사합니다. 나는 우리의 요점을 가지고 –

+0

새로운 정보로 내 대답을 업데이트했습니다. –

+0

감사합니다. @ Felix. 나는 당신의 해결책을 시도 할 것이다 –

0

이 경우 jQuery가 필요하지 않습니다. 그냥 두 개의 루프를 사용하고, 당신이 원하는 것을 확인하십시오

for (var i=0; i<list.length; i++) { 
    var found = false;  
    for (var j=0; j<node.length; j++) {  
     if(list[i].id == node[j].Id) { 
      // We have found such element in node! 
      found = true; 
      break; 
     } 
    }  
    if(!found) { 
     // we did not find such element in node 
    } 
} 

난 당신이 자바 스크립트가 작업을 루프 방식의 기본을 이해하는 것이 좋습니다, 그리고 그러한 작업을위한 그 사용의 jQuery 기능 후. 그것은 당신을 도울 것입니다.

+0

thanks alot @SergeyS –

관련 문제