Đầu vào bộ chọn truy vấn [type = text] ')


98

Tôi đã viết một mã về cơ bản chọn tất cả các input type=textphần tử như sau:

$('.sys input[type=text]').each(function () {}

Làm cách nào để thay đổi nó để chọn input[type=text]hoặc select?

Câu trả lời:


177

Sử dụng bộ chọn css thông thường:

$('.sys input[type=text], .sys select').each(function() {...})

Nếu bạn không thích sự lặp lại:

$('.sys').find('input[type=text],select').each(function() {...})

Hay ngắn gọn hơn, chuyển vào contextđối số:

$('input[type=text],select', '.sys').each(function() {...})

Lưu ý: Nội bộ jQuerysẽ chuyển đổi những thứ trên thành find()tương đương

http://api.jquery.com/jQuery/

Bên trong, ngữ cảnh bộ chọn được triển khai với phương thức .find (), vì vậy $ ('span', this) tương đương với $ (this) .find ('span').

Cá nhân tôi thấy giải pháp thay thế đầu tiên là dễ đọc nhất :), bạn mặc dù vậy


1
context formđang sử dụng find form, find formnên hiệu quả hơn context form(tránh một hàm gọi). Điều này hợp lệ cho hầu hết tất cả các bộ chọn được sử dụng. Sau đó, IMO cái find formhiệu quả hơn normal CSS selector, bởi vì cả hai phần của bộ chọn đều liên quan đến nút gốc, trong đó find form, chỉ .sysmột phần là liên quan đến nó, sau đó input[type=text],selectđược thực thi trên một tập hợp phần tử nhỏ hơn nhiều nên có thể nhanh hơn (nhưng cần điều này cần được xác minh bằng các thử nghiệm)
pomeh

1
@pomeh Tôi có thể biết bạn đến từ đâu, nhưng nếu hiệu suất $cuộc gọi quan trọng đối với ứng dụng của bạn, vui lòng tránh sử dụng jQuery hoàn toàn :). Câu trả lời này cố gắng trả lời câu hỏi của OP, nếu nó là một câu hỏi về hiệu suất, câu trả lời này sẽ không có ở đây ngay từ đầu. Dù sao cũng cảm ơn vì nhận xét :), đánh giá cao nó
Andreas Wong

1
nhận xét của tôi không phải về hiệu suất của một $cuộc gọi, mà là về tất cả các $cuộc gọi hiện diện trong một ứng dụng. IMO, khi bạn có những cách khác nhau để thực hiện cùng một việc, tôi luôn cố gắng chọn cách thực hiện tốt hơn bc. slow performance=== unhappy users. Ngoài ra, chúng tôi vừa có thể trả lời câu hỏi của OP với nhiều câu trả lời (như bạn đã làm) vừa đưa ra những ưu điểm / bất tiện của từng câu hỏi đó (như tôi đã làm trong nhận xét). IMO điều quan trọng là phải lưu ý tại sao tất cả các câu trả lời đều khác nhau, trong khi cung cấp cùng một kết quả. Ngoài ra, chúng tôi có thể viết mã JavaScript vani hoạt động chậm JavaScript:! ==performance
pomeh

1
@pomeh Quan điểm của tôi về hiệu suất là, nếu bạn thực sự quan tâm đến hiệu suất, đừng sử dụng jQuery $, hãy phân loại các div của bạn một cách cụ thể và sử dụng document.getElemenById/ElementsByClassName, thay vì $kiểm tra rất nhiều / phân tích chuỗi của bộ chọn của bạn, jQuery không nổi tiếng cho thư viện biểu diễn của nó. Và thành thật mà nói thì tôi chưa thấy ứng dụng nào chạy chậm lại vì gọi $quá nhiều, nếu bạn có trang web nào gặp sự cố đó, vui lòng chỉ cho tôi, tôi rất quan tâm :)
Andreas Wong

2
@pomeh Vâng, tôi hoàn toàn đồng ý với quan điểm của bạn về JS! = Performance :), vào cuối ngày, nó vẫn khiến chúng tôi, các lập trình viên phải thực sự viết mã hợp lý. Cảm ơn vì cuộc thảo luận ngắn, chúc một ngày tốt lành :)
Andreas Wong

7
$('.sys').children('input[type=text], select').each(function () { ... });

CHỈNH SỬA: Trên thực tế, đoạn mã trên tương đương với bộ chọn con .sys > input[type=text]nếu bạn muốn con cháu select ( .sys input[type=text]), bạn cần sử dụng các tùy chọn được cung cấp bởi @NiftyDude.

Thêm thông tin:


bạn đã gõ chilrenthay vìchildren
pomeh

5

Nếu bạn có nhiều đầu vào dưới dạng văn bản trong một biểu mẫu hoặc một bảng mà bạn cần phải lặp lại, tôi đã làm điều này:

var $list = $("#tableOrForm :input[type='text']");

$list.each(function(){
    // Go on with your code.
});

Những gì tôi đã làm là tôi kiểm tra từng đầu vào để xem liệu loại có được đặt thành "văn bản" hay không, sau đó nó sẽ lấy phần tử đó và lưu trữ trong danh sách jQuery. Sau đó, nó sẽ lặp lại qua danh sách đó. Bạn có thể đặt một biến tạm thời cho lần lặp hiện tại như sau:

var $currentItem = $(this);

Điều này sẽ đặt mục hiện tại thành lần lặp hiện tại của bạn cho mỗi vòng lặp. Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với biến tạm thời.

Hy vọng điều này sẽ giúp bất cứ ai!


3
$('input[type=text],select', '.sys');

cho vòng lặp:

$('input[type=text],select', '.sys').each(function() {
   // code
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.