2012-02-09 41 views
10

Nếu bạn nhìn vào selectors list trên trang web jQuery, có các bộ chọn cho các thuộc tính bắt đầu bằng và kết thúc bằng thuộc tính. Ngoài ra còn có một bộ chọn :contains để tìm kiếm văn bản:Bộ chọn jQuery mô phỏng: bắt đầu bằng hoặc: kết thúc tìm kiếm văn bản?

alert($("div").find("span:contains(text)").html()); 

jQuery có triển khai tìm kiếm các chuỗi bằng cách bắt đầu bằng hoặc kết thúc không?

FYI: Tôi cần phải tìm kiếm thông qua đối tượng XML.

Trả lời

15

Không theo mặc định theo như tôi biết, nhưng bạn có thể thêm bộ chọn giả của riêng mình qua $.expr[":"]: http://jsfiddle.net/h6KYk/.

$.extend($.expr[":"], { 
    "starts-with": function(elem, i, data, set) { 
     var text = $.trim($(elem).text()), 
      term = data[3]; 

     // first index is 0 
     return text.indexOf(term) === 0; 
    }, 

    "ends-with": function(elem, i, data, set) { 
     var text = $.trim($(elem).text()), 
      term = data[3]; 

     // last index is last possible 
     return text.lastIndexOf(term) === text.length - term.length; 
    } 
}); 
+0

Ồ, wow. Cảm ơn nhiều. Tôi đánh giá cao ý kiến ​​của bạn. Bạn có thể vui lòng giải thích về quy trình của bạn không? Mục đích của "thiết lập" và "i" trong mỗi chức năng là gì? Và dữ liệu là gì [3]? Cám ơn bạn một lần nữa. – user717236

+2

@ user717236: Hàm bạn đặt trong '$ .expr [": "]' được chuyển qua một số đối số để quyết định xem một phần tử nào đó có vượt qua hay không. 'elem' là phần tử để kiểm tra và' i' là một bộ đếm. 'dữ liệu' là một mảng chứa các giá trị của bộ chọn; 'data [3]' sẽ là chuỗi '" foo "' nếu bạn chọn sử dụng ': starts-with ('foo')'. 'set' là tập hợp tất cả các phần tử đang được lọc theo chức năng của bạn, ví dụ: 'div: starts-with ('foo')' sẽ chuyển tất cả 'div' thành 'set', sau đó được lọc theo hàm. – pimvdb

+0

Cảm ơn bạn đã giải thích, @pimvdb. Có tài nguyên nào tôi có thể tra cứu để cung cấp thêm thảo luận chuyên sâu về chủ đề này không? Ví dụ, bạn đã chỉ định bốn tham số trong mỗi hàm. Các biến này có liên quan đến khai báo phương thức tìm của jQuery hay không (tức là hàm (a) {var b = this, c, d; ...})? – user717236

12

Khi bạn không muốn mở rộng jQuery, bạn có thể sử dụng filter() chức năng để tạo ra các chức năng chứa:

$("div").find("span").filter(function() { 
    return $(this).text().indexOf(text) >= 0; 
}); 

Hoặc tạo một hàm startsWith với một biểu thức chính quy:

var expression = new RegExp('^' + text); 
$("div").find("span").filter(function() { 
    return expression.test($.trim($(this).text())); 
}); 

Hàm endsWith khá giống:

var expression = new RegExp(text + '$'); 
$("div").find("span").filter(function() { 
    return expression.test($.trim($(this).text())); 
}); 

Lưu ý việc sử dụng $.trim() vì HTML có thể chứa nhiều khoảng trắng.

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