개별 클래스 이름에 '다음으로 시작'선택기 사용


163

다음이있는 경우 :

<div class="apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

다음 선택기를 사용하여 처음 두 DIV를 찾을 수 있습니다.

$("div[class^='apple-']")

그러나 이것이 있으면 :

<div class="some-other-class apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

첫 번째 div의 클래스는 문자열로 반환되고 (제 생각에는) 실제로 'apple-'로 시작하지 않고 'some-'로 시작하기 때문에 두 번째 DIV 만 찾습니다.

이를 해결하는 한 가지 방법은 다음으로 시작하지 않고 대신 다음을 포함하는 것입니다.

$("div[class*='apple-']")

문제는 내 예에서 세 번째 DIV도 선택한다는 것입니다.

질문 : jQuery를 통해 전체 클래스 속성을 문자열로 사용하는 대신 개별 클래스 이름에 술어 선택자를 사용하는 적절한 방법은 무엇입니까? CLASS를 잡고 배열로 분할 한 다음 정규식을 사용하여 각 개별 항목을 반복하는 것이 문제입니까? 아니면 더 우아하고 덜 장황한 솔루션이 있습니까?

답변:


316

"apple-"로 시작하는 클래스와 "apple-"이 포함 된 클래스

$("div[class^='apple-'],div[class*=' apple-']")

5
+1. 나는 @parrots의 제안에 동의하지만 "apple"은 여기에서 자체 클래스 여야합니다. 왜냐하면 분명히 여러 div와 겹치지 만 별개의 엔티티이기 때문입니다. 그러나 이것은 문제를 해결합니다.
jvenema

흠 ... 영리합니다! 나는 거기에 공간을 사용할 생각이 없었습니다. jquery 선택기에서 부울 연산자를 사용할 수 있습니까? 하나 개의 클래스는 '사과 -'로보고 더 이상이 곳에 이상적으로, 위의 (희귀 가능성이 피할 수있는) 경우를 방지하는 'OR'것
DA합니다.

잘 모르겠지만 첫 번째 선택기가 0 요소를 반환 할 때만 두 번째 선택기를 사용하려면 다음과 같이 할 수 있습니다. var divs = $("div[class^='apple-']"); if(divs.length == 0) divs = $("div[class*=' apple-']");
Josh Stodola

이제 생각 해보니 초기 솔루션이 잘 작동합니다. "apple-brick apple-horse"와 같은 클래스가있는 DIV는 여전히 jQuery 객체에서 한 번만 선택됩니다.
DA.

당신이 :) 특정 요소에 대한 클래스를 경계하지 않을 경우 * 대신 사업부의 사용
Hidayt 라만

13

"사과"자체 수업을 만드는 것이 좋습니다. using / ends-with를 선택하는 div.apple것이 훨씬 빠르기 때문에 가능하면 시작 / 종료를 피해야합니다 . 이것이 더 우아한 솔루션입니다. 작업이 더 간단하고 빠르다면 사물을 별도의 클래스로 나누는 것을 두려워하지 마십시오.


훨씬 더 빠를 것이라고 어떻게 생각하십니까? 여전히 전체 DOM을 스캔하고 클래스 속성을 평가해야합니다. 클래스 속성을 부분 문자열로 묶을 필요가 없기 때문에 약간 더 빠를 것입니다. 무시할 수 있습니다.
Josh Stodola

2
componenthouse.com/article-19 : get by class 섹션을 살펴보면 일반 점 구문을 사용하는 것이 일반적으로 클래스를 속성으로 처리하는 것보다 약간 빠릅니다. 하위 문자열 검색을 추가하면 (그리고 여러 클래스 이름을 가진 요소를 분리하기 위해 수행해야 할 추가 작업) 상당한 성능 절감 효과를 얻을 수 있습니다.
Parrots

1
나는 동의한다. 문제는 여전히 IE6을 많이 지원하고 있으며 CSS에서 복합 선택기를 지원하지 않는다는 것입니다. .class1.class2.class3 따라서 '매개 변수'가 대시로 나뉘어 진 더 긴 클래스 이름을 사용하고 있습니다.
DA.

6

이것은 접두사입니다

$("div[class^='apple-']")

이것은 시작을위한 것이므로 거기에 '-'문자를 넣을 필요가 없습니다.

$("div[class|='apple']")

https://api.jquery.com/category/selectors/ 에서 jQuery 선택기의 다른 멋진 변형을 찾을 수 있습니다.


6

여기에 가장 좋은 대답은 질문자의 특정 경우에 대한 해결 방법이지만 개별 클래스 이름에 실제로 '시작'을 사용하는 솔루션을 찾고 있다면 :

:acp()"A Class Prefix" 라고 부르는이 사용자 정의 jQuery 선택기를 사용할 수 있습니다 . 코드는이 게시물의 하단에 있습니다.

var test = $('div:acp("starting_text")');

이렇게하면 <div>해당 클래스가 클래스 속성 문자열의 시작 또는 다른 위치에 있는지 여부에 관계없이 지정된 문자열 (이 예에서는 "starting_text")로 시작하는 클래스 이름이 하나 이상있는 모든 요소 가 선택 됩니다.

<div id="1" class="apple orange lemon" />
<div id="2" class="orange applelemon banana" />
<div id="3" class="orange lemon apple" />
<div id="4" class="lemon orangeapple" />
<div id="5" class="lemon orange" />

var startsWithapp = $('div:acp("app")');

그러면 요소 1, 2 및 3이 반환되지만 4 또는 5 는 반환 되지 않습니다 .

다음 :acp은 어디에나 넣을 수 있는 사용자 지정 선택기에 대한 선언입니다 .

$(function(){
    $.expr[":"].acp = function(elem, index, m){
          var regString = '\\b' + m[3];
          var reg = new RegExp(regString, "g");
          return elem.className.match(reg);
    }
});

백엔드 제어가없는 웹 사이트에 대해 GreaseMonkey 해킹을 많이했기 때문에 이것을 만들었습니다. 그래서 종종 동적 접미사가있는 클래스 이름을 가진 요소를 찾아야합니다. 매우 유용했습니다.


2

이 시도:

$("div[class]").filter(function() {
    var classNames = this.className.split(/\s+/);
    for (var i=0; i<classNames.length; ++i) {
        if (classNames[i].substr(0, 6) === "apple-") {
            return true;
        }
    }
    return false;
})

2
<div class="apple-monkey"></div>
<div class="apple-horse"></div>
<div class="cow-apple-brick"></div>

이 경우 질문으로 Josh Stodola 대답은 정확합니다. "apple-"로 시작하는 클래스와 "apple-"을 포함하는 클래스

$("div[class^='apple-'],div[class*=' apple-']")

하지만 요소에 이와 같은 여러 클래스가 있으면

<div class="some-class apple-monkey"></div>
<div class="some-class apple-horse"></div>
<div class="some-class cow-apple-brick"></div>

그러면 Josh Stodola의 솔루션이 작동하지 않습니다. 이와 같은 작업
을 수행해야합니다.

$('.some-parent-class div').filter(function () {
  return this.className.match(/\bapple-/);// this is for start with
  //return this.className.match(/apple-/g);// this is for contain selector
}).css("color","red");

다른 사람에게 도움이 될 수 있습니다.


0

요소에 여러 개의 클래스가있는 경우 "[class ^ = 'apple-']"이 작동하지 않습니다. 예 :

<div class="fruits apple-monkey"></div>

OP는 질문에서 이것을 언급합니다.
Goose '
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.