2012-04-11 2 views
0

나는 div 요소와 조정 된 링크에 ID를 제공하는 jQuery로 JS 유틸리티를 만들었습니다.Javascript - Jquery on the fly id 검색

예 :

div id="container" 
div id="1" 
div id="2" 

div id="links" 
a name="1" 
a name="2" 

그래서 페이지가로드되면, 내가 처음 링크를 클릭 (이름 = "1") 첫째 DIV 보여줄 예정이다 (아이디 = "1").

하지만 내 ID가 즉시 만들어지기 때문에 함수가 올바른 div를 찾지 못하는 것 같습니다.

여기 내 기능입니다 : 내가 jQuery를, 기본적인 HTML과 CSS를 사용하고

$("#video_grid .grid_item a").each(
     function(i) { 

      /* FINDING 'A' AND GIVING THEM NAME */ 

      $(this).addClass("item" + (i + 1)); 
      $(this).attr("name", "#" + (i + 1)); 

      /* BACKGROUND */ 

      $(this).css("background-image", 
        "url(images/visu_" + (i + 1) + ".jpg"); 
      $(this).hover(
        function() { 
         $(this).css("background-image", 
           "url(images/visu_hover_" + (i + 1) + ".jpg") 
        }, 
        function() { 
         $(this).css("background-image", 
           "url(images/visu_" + (i + 1) + ".jpg"); 
        }); 
     }); 

/* FINDING DIV GIVING THEM IDS */ 

$("#capsule_player > div").each(function(i) { 
    $(this).addClass("item#" + (i + 1)); 
}); 

/* HERE'S THE PROBLEM */ 

$("#capsule_player div:first-child").css("display", "block"); 
/* appel la div correspondante avec la video */ 
$(".grid_item a").live("click", function() { 
    var divname = $(this).attr("name"); 
    alert(divname); 
    /* WORK FINE TIL HERE */ 

    /* THIS IS THE REAL PROBLEM */ 

    $(".item" + divname).show("slow").siblings().hide("slow"); 

    /* ALERT IF YOU FIND THE DIV WITH THE ID, DOES NOT WORK */ 

    if ($(".item" + divname)[0]) { 
     alert('tonton'); 
    } 

}); 

및 PHP는 허용되지 않습니다.

+3

ID, 이름 및 클래스의 정말 신비한 인터 믹스가있는 것 같습니다. 클래스를 구성 요소별로 그룹화하고, ID는 페이지의 고유 한 요소를 식별합니다. 이름은 양식 요소 용입니다. 어느 누구도 숫자로 시작하지 마십시오. 번호 매기기를 위해 당신은'data-index = "number"'와 같은 당신 자신의 분리 된 속성을 사용할 수 있습니다. 일단 그렇게하면 코드가 더 명확하고 디버그하기 쉬워집니다. – Armatus

+0

'ID'는 실제로 클래스이므로 'addClass'메소드 이름입니다. 게다가, 나는 Armatus와 동의한다. 마지막으로, 내가 게시 한 코드에서 문제를 볼 수 없으며, 문제를 보여주는 HTML * 및 * JS의 최소 예제를 시도해 볼 수 있습니까? – Jochem

답변

1

div의 ID를 부여하는 함수가 클래스를 제공하고 있습니다. 당신은 이런 식으로 변경해야합니다 (

$("#capsule_player > div").each(function(i){ 
    $(this).attr("id", 'item' + (i+1)); 
}); 

해야그 일을하지만, 코드의 나머지 부분은 당신이 원하는 일을 할 수있는가 더 나은/더 의미있는 방법으로 tidyup와 함께 할 수있는 나는 바쁘지 않을 때 할 수도있다.)

편집 :이 같은

뭔가 더 나은 (Armatus '의견에 따라) 될 것이다 :

.live()

// give each div a data-index attribute 
$("div.item").each(function(i){ 
    $(this).attr("data-index", i); 
}); 

// give each anchor a data-index attribute 
$("#video_grid .grid_item a").each(function(i) { 
    $(this).attr("data-index", i); 
}); 

$(".grid_item a").live("click",function() { 
    var index = $(this).attr("data-index"); 

    $('div.item[data-index="' + index + '"]').show(); 
}); 
이되지 않습니다,하지만 난 모르기 때문에 나는 그것을 떠날거야하는 사용중인 jQuery 버전.

$(this).attr('name', 'Q' + (i + 1)); 
    [...] 
    $(this).addClass('itemQ' + (i + 1)); 

$(this).attr('name', '#' + (i + 1)); 
    [...] 
    $(this).addClass('item#' + (i + 1)); 

: 크리스챤을 보여줍니다 경로가 더 확실히 더 learningful 장기적으로 아마하지만

+0

OP도 클래스 수준에서 실제로 선택되기 때문에 코드의 나머지 부분에서는이를 해결할 수 있다고 생각하지 않습니다. – Jochem

+0

그는 클래스에 의해 div를 선택하고'a'의'name' 속성을 사용합니다. 따라서'name' 속성이 (코드의 시작 부분에 정의 된대로) id selector 인 경우 이론적으로는 작동해야합니다 . 나는 그것을 시험하지 않았다. –

+0

나는이 코드를 이해하기 때문에 클래스 선택자 'name # 1 '을 만들기 위해'a'의'name' (즉'# 1 ')을 사용하고 있습니다. 오, 잠깐. * 실제로 문제가있다. # 기호는 클래스 이름에서 사용할 수 있지만 선택 자로 ID 선택기 역할을합니다. 어쨌든 EDIT는 원래의 근본적인 문제에 대한 훨씬 더 나은 해결책입니다! – Jochem

0

, 원래 문제는 쉽게 두 줄을 변경하여 해결 될 수있다 즉각적인 문제는 div에 classname에 '#'기호가 포함되어 있다는 것입니다. 이것은 문자 그대로 클래스 이름의 일부가됩니다. 그러나 선택하는 동안이 '#'기호는 'ID'선택기로 해석됩니다. 그래서 그것은 작동하지 않습니다.

관련 문제