2012-03-03 26 views
14

Tôi đang cố gắng nhắm mục tiêu các tên thuộc tính có chứa một từ nhất định & không theo kiểu bạn đang suy nghĩ.Tên thuộc tính jQuery chứa

phép nói rằng tôi có:

<div data-foo-bar="hello"></div> 

Làm thế nào tôi có thể nhắm mục tiêu các yếu tố mà có 'data-foo' trong tên thuộc tính?

+0

Bạn có thể sử dụng một tùy chỉnh jQuery selector: http://stackoverflow.com/a/26657510/1414562 –

Trả lời

12

Tôi không nghĩ rằng bạn có thể nhắm mục tiêu tên thuộc tính giống như cách bạn nhắm mục tiêu các giá trị thuộc tính. Bạn có thể, tuy nhiên, sử dụng .filter() để làm điều này phần nào hiệu quả:

$('div').filter(function() { 
    for (var property in $(this).data()) { 
    if (property.indexOf('fooBar') == 0) { 
     return true; 
    } 
    } 

    return false; 
});​ 

ý rằng data-foo-bar đã được chuyển đổi sang fooBar.

Demo: http://jsfiddle.net/Tyj49/3/

+0

tham chiếu cho "bộ chọn thuộc tính" http://api.jquery.com/category/selectors/ – charlietfl

+3

Tôi quen thuộc với jQuery. Những bộ chọn đó khớp với giá trị * của một thuộc tính đã cho, không phải là tên thuộc tính. – Blender

+0

Điều này có vẻ tốt hơn. Và nếu bạn muốn chỉ cần cache các đối tượng đã lọc cho sau này, bạn có thể làm như sau: http://jsfiddle.net/Tyj49/4/ Trong khi tôi dự đoán rằng việc tái tạo lại cách tiếp cận có lẽ tốt hơn trong thời gian dài (khó nói mà không biết trường hợp sử dụng), điều này sẽ được bỏ phiếu cho chắc chắn. –

-5

Hãy thử một cái gì đó như thế này

var element = $('div[data-foo-bar=hello]')​; 
+0

không chắc chắn tại sao điều này đã dẫm lên với votedowns, có vẻ như đơn giản nhất có giá trị khái niệm cho đến nay http: // jsfiddle .net/wHuV2/ – charlietfl

+0

OP đang cố khớp thuộc tính * name *, không phải giá trị thực. Câu hỏi có phần mơ hồ. – Blender

+0

hiểu về giá trị nhưng thuộc tính đơn giản hơn nhiều so với bộ lọc 4 dòng – charlietfl

4

Tôi không chắc chắn bạn có thể làm điều đó. Tôi đã có một cái nhìn tại API và bạn chỉ có vẻ để có thể làm phù hợp một phần sâu hơn về giá trị, không phải là tên thuộc tính chính nó.

Tôi sẽ cung cấp cho bạn lời khuyên có khả năng gây phiền toái, "đừng làm điều này". ;-) Về bản chất, những gì bạn đang theo sau là một loạt các div phù hợp với một thể loại tổng quát hơn. Không chỉ data-foo-bar s, nhưng TẤT CẢ data-foo s! Tại sao không chỉ cung cấp cho tất cả dữ liệu-foos một tên lớp mà bạn có thể lựa chọn, hoặc một thuộc tính riêng biệt như data-foo="true"?

Nói cách khác, hơn là gắn bó chặt chẽ với câu hỏi như được hỏi, tôi muốn tò mò muốn biết trường hợp sử dụng là gì để có thể một động thái bên trong suy nghĩ có thể giải quyết vấn đề của bạn một cách hiệu quả. Nhiều cách để làm da mèo và mọi thứ.

+0

Vâng, thay thế của tôi sẽ có được 2 thuộc tính dữ liệu. Nhưng tôi nghĩ nếu có một ý chí có một cách, do đó, stackoverflow đến tâm trí. :) – daryl

+0

bạn có thể viết $ ('[data-foo-bar]') sẽ hoạt động – charlietfl

+0

Đủ công bằng, Trình lập trình. ;-) –

0

Hãy thử điều này

$().ready(function() { 
    var test=$('#div_test').data("foo-bar"); 
    alert(test); 
}); 

HTML:

<div data-foo-bar="hello" id="div_test"></div> 
+0

Bởi golly nó dường như làm việc. Có thể đáng để đưa vào một vài bài kiểm tra ví dụ ngược để xem liệu nó có dễ vỡ hay không, nhưng ở đây nó đang hoạt động: http://jsfiddle.net/YkTJy/ –

+0

Cảm ơn @GregPettit – pkachhia

+0

Điên. Tôi gần như downvoted cho đến khi tôi nhìn thấy bình luận của bạn @GregPettit. Điều đó sẽ dạy tôi nhảy đến kết luận. – daryl

1

Đây chỉ là một giải pháp thay thế. Nếu bạn có thể đảm bảo tên của thuộc tính mà bạn đang tìm kiếm không có mặt trong văn bản tố, những gì bạn có thể làm là nhận được giá trị outerHtml của nguyên tố này và sau đó thực hiện một tìm kiếm chuỗi con:

$("elementsToCheck").each(function() { 
    var elemHtml = $('<div>').append($(this).clone()).html(); //clone to get the outerHTML 
    if (elemHtml.indexOf("attributeName") >= 0) { 
     // current element contains the attribute with name "attributeName" 
    } 
}); 

Hope điều này có ích.

0

Sử dụng .data() để nhận tất cả các thuộc tính dữ liệu của một phần tử, sau đó sử dụng .filter để nhận các phần tử có thuộc tính data-validation*.

var validated_elements = $("p").filter(function() { 
    var found = false; 
    $.each($(this).data(function(key) { 
     if (key.match(/^data-validation/)) { 
      found = true; 
      return false; 
     } 
    } 
    return found; 
}); 
Các vấn đề liên quan