2012-09-18 44 views
8

Có cách nào để tìm tất cả các phần tử có thuộc tính bắt đầu bằng một chuỗi cụ thể không?Có cách nào để tìm kiếm các thuộc tính bắt đầu bằng một chuỗi nhất định trong HTML

Tôi đang sử dụng framework Mootools và đây là những gì tôi đã cố gắng:

$$('*[data-media-*]'); 

Nhưng nó chỉ kết quả đầu ra tất cả các yếu tố trong trang.

Vì vậy, có cách nào để có được tất cả các yếu tố trong trang có thuộc tính bắt đầu bằng, data-media- không?

+0

Bạn có thể đăng một số ví dụ html không? – Daedalus

+1

Có vẻ như bạn sẽ phải thêm một số thuộc tính khác để hợp nhất các thành phần. – Niemand

+0

Việc triển khai bộ chọn CSS tuân thủ sẽ xuất * không có phần tử * vì nó không hợp lệ ... – BoltClock

Trả lời

1

bạn có thể lọc các phần tử mà bạn đã phải trả về các phần tử có thuộc tính data- * phù hợp.

Elements.implement({ 
    filterData: function(substring){ 
     return this.filter(function(element){ 
      var attribs = element.attributes, 
       len, 
       ii = 0; 

      for (len = attribs.length; ii < len; ++ii) { 
       if (attribs[ii].name.indexOf('data-') === 0 && attribs[ii].name.indexOf(substring) !== -1) { 
        return true; 
       } 
      } 
     }); 

    } 
}); 

console.log($$("div").filterData('foo')); 
console.log($$("div").filterData('bar')); 
console.log($$("div").filterData('oba')); 

trong hành động: http://jsfiddle.net/dimitar/pgZDw/

Nhược điểm: bạn đã cần phải vượt qua nó trên một tập hợp các yếu tố có ý nghĩa, ví dụ. div.foo hoặC#someid *

một giải pháp thanh lịch hơn sẽ có thêm một giả :data() để Slick:

(function(){ 
    // cache reusable string 
    var data = 'data', 
     hyphen = '-', 
     // set the fallback via XMLSerializer, if no outerHTML (eg. FF 2 - 10) 
     XS = this.XMLSerializer && new XMLSerializer(); 

    Slick.definePseudo(data, function(value){ 
     return (this.outerHTML || XS.serializeToString(this)).test([data, value].join(hyphen)); 
    }); 
}()); 


console.log($$("div:data(foo)")); 
console.log($$(":data(media-)")); 

dụ Cập nhật: http://jsfiddle.net/dimitar/pgZDw/3/

+0

Tôi nghĩ tôi có thể thêm nó vào Slick. Dù sao thì cũng không phải là một ý tưởng tồi khi tôi nhìn vào mã của Slick. – jnbdz

+0

Ngoài ra tôi chỉ có thể làm: $$ ('*') ... Nhưng đó là một chút của một chi phí ... Một điều tôi lo lắng về là hiệu suất ... – jnbdz

+1

vấn đề của bạn là cần phải ký tự đại diện. tìm kiếm một thuộc tính dữ liệu cụ thể trong một phần tử rất dễ dàng ... khi bạn ký tự đại diện, bạn cần phải đi tất cả các thuộc tính và tốn kém - như bạn nói, điều gì sẽ xảy ra nếu bạn chuyển nó * làm công cụ chọn? bạn cũng có thể quét bên ngoàiHTML cho nó, có thể nhanh hơn ... –

-3
$$('div[attrName="attrnameValue"]').each(function() { 
    // `this` is the div 
}); 
+1

Đây không phải là những gì OP hỏi. – Daedalus

2

Bạn có thể xấp xỉ một cái gì đó như thế này bằng cách duyệt qua các thuộc tính cho mỗi phần tử trong container, và nhìn thấy cho dù tên thuộc tính phù hợp với một regex cho những gì bạn đang tìm kiếm:

Ví dụ, in this jsFiddle, I am looking for li elements with the data-media-tv and data-media-dvd properties.

Bạn có thể điều chỉnh regex để chỉ trả về những gì bạn muốn xem. Bạn chỉ muốn xem các phần tử có dữ liệu - media- * (như trong câu hỏi của bạn)? Here you go.


Hãy nhớ rằng không chính xác khả năng mở rộng. Vì chúng tôi đang lặp qua từng phần tử trên trang và kiểm tra từng thuộc tính duy nhất (nhưng quay lại sớm nếu được tìm thấy), điều này có thể và có thể sẽ chậm đối với các trang lớn.

Giới hạn điều này CHỈ với vùng chứa bạn muốn tìm kiếm hoặc chỉ các yếu tố bạn muốn lặp qua! Nếu bạn chạy điều này với document.body, nó sẽ lặp qua từng phần tử trong trang, tôi sẽ không chịu trách nhiệm nếu ngôi nhà của bạn bị cháy. :)


Dưới đây là chức năng-ized:

function attrMatch(elements, regexp) { 
    // Iterate through all passed-in elements, return matches 
    var matches = elements.filter(function(li) { 
    var numAttr = li.attributes.length; 
    for(x=0;x<numAttr;x++) { 
     var attr = li.attributes[x]; 
     return attr['name'].test(regexp); 
    } 
    }); 

    return matches; 
}; 

Trong elements, chỉ vượt qua trong những yếu tố mà bạn muốn kiểm tra, có thể được lựa chọn thông qua $$. Nếu bạn muốn kiểm tra tất cả các phần tử trong phần tử vùng chứa, hãy thay thế elements bằng containercontainer.getChildren() trong mỗi trường hợp element ở trên.

2

thử this jsfiddle chỉ biết (phổ biến) index/vị trí thuộc tính data-media-* và sử dụng trong mã tương ứng.

+0

Thử dùng jsFiddle? Vâng, điều đó rất hữu ích. – BoltClock

+0

có gì sai với mã trong đó không? –

Các vấn đề liên quan