2009-04-06 42 views
28

Tôi đang cố gắng hiểu rõ hơn phương pháp jQuery.each(). Dưới đây là một ví dụ tôi đã đưa ra, không phải là rất thực tế, nhưng nó thực hiện một hành động trên mỗi sản phẩm được chọn từ phần thiết lập lựa chọn các yếu tố trở lại:jQuery .each() - Sử dụng thực tế?

// Loop over each link. 
$("#links a.number").each(

// For each number, run this code. The "intIndex" is the 
// loop iteration index on the current element. 
function(intIndex){ 

// Bind the onclick event to simply alert the iteration index value. 
    $(this).bind ("click", function(){ 
     alert("Numbered index: " + intIndex); 
    }); 
}); 

số ví dụ về sử dụng thực tế của phương pháp .each bạn là gì sử dụng trong mã của bạn? Chính xác thì $ (cái này) đại diện cho cái gì?

+0

mỗi cái có thể khá quan trọng khi bạn tạo plugin, bất cứ nơi nào bạn cần làm việc trên từng phần tử mà bộ chọn chỉ định nơi các trình xử lý được xây dựng không cho phép .. cũng 'this' là một phần tử html thuần túy, $ (this) là phần tử được bọc trong một bộ jquery, cho phép nó gọi các phương thức jquery. – meandmycode

+0

@meandmycode: điều này đề cập đến phần tử html thuần túy hoặc đối tượng DOM thuần túy từ vùng chọn? – RedWolves

Trả lời

35

Lưu ý có hai loại jQuery mỗi, là lặp trên và trả về đối tượng jQuery, các khác là một phiên bản chung chung hơn.

Core/mỗi
Ví dụ: Tạo một csv của tất cả các href trên trang. (Lặp trên phần tử DOM phù hợp và 'này' reffers tới phần tử hiện tại)

var hrefs = ""; 

$("a").each(function() { 
    var href = $(this).attr('href'); 
    if (href != undefined && href != "") { 
     hrefs = hrefs + (hrefs.length > 0 ? "," + href : href); 
    } 
}); 

alert(hrefs); 

Utilities/jQuery.each
iterating trên một mảng hoặc các yếu tố của một đối tượng: (thông qua: jQuery Documentation)

$.each({ name: "John", lang: "JS" }, function(i, n){ 
    alert("Name: " + i + ", Value: " + n); 
}); 

$.each([0,1,2], function(i, n){ 
    alert("Item #" + i + ": " + n); 
}); 
+0

@rizzle - Tôi không thể lấy ví dụ đầu tiên của bạn để làm việc. Đây là cách tôi làm cho nó hoạt động trong Firebug cho trang này: var hrefs = ""; $ ("a") .each (function() { var href = $ (this) .attr ('href'); nếu (href! = Undefined) { hrefs + = hrefs + href.length> 0 ? "," + href: href; } }); cảnh báo (href); – RedWolves

+0

heh, lỗi là tôi đang làm href.length thay vì hrefs.length. Tôi kiểm tra độ dài để xem liệu tôi có nên thêm dấu phẩy vào danh sách không. xin lỗi tôi nên đã thử nghiệm – rizzle

+1

heh bạn đang phải, tôi đã phải phục vụ cho undefined là tốt. Tôi đã cập nhật mã. – rizzle

5

Một sử dụng đơn giản, nhưng nó rất tiện dụng cho iterating trên một bảng và kẻ vạch hàng thay thế:

// Adds CSS styling to alternate rows of tables marked with a .data class attribute. 
$("table.data").each(function() { 
    if (!$(this).hasClass("noStriping")) { 
     $(this).find("tbody tr:nth-child(odd)").addClass("odd"); 
     $(this).find("tbody tr:nth-child(even)").addClass("even"); 
    } 
}); 
+0

tôi muốn sử dụng $ ("tr: odd"). AddClass ("odd"); – rizzle

+0

Điều này được thực hiện tốt hơn với $ ('. Classname: even'). AddClass ('oddRow'). – Turnor

+0

thực sự! hoặc $ ("tr: even"). addClass ('even'); – cgp

1

Bạn sử dụng từng chức năng để truy cập/sửa đổi bất kỳ thuộc tính dom nào không được bao bọc bởi jquery.

Tôi thường có lưới/bảng có cột chứa hộp kiểm.

Tôi viết bộ chọn để có danh sách hộp kiểm, sau đó đặt thuộc tính đã chọn thành true/false. (để kiểm tra tất cả, bỏ chọn tất cả).

Bạn phải sử dụng từng chức năng cho điều đó.

$ (". Mycheckbox"). Each (function() {this.checked = true;});

+0

Bạn không thể làm $ (". Mycheckbox"). Attr ('checked', true); ? –

+0

@Peter, cùng với những dòng này, tôi đã có may mắn hơn với $ (". Mycheckbox"). Attr ('checked', 'checked'); – rizzle

9

đôi khi tôi sử dụng nó để vượt qua một số lượng lớn các phần tử con trong một resultset dữ liệu XML

my parsedData = []; 
    $('result', data).each(function() { 
     parsedData.push( 
     { name: $('name', this).text(), 
      addr: $('addr', this).text(), 
      city: $('city', this).text(), 
      state: $('state', this).text(), 
      zip: $('zip', this).text() 
     }); 

đó làm việc khá độc đáo.

+0

Tôi chưa từng thấy cấu trúc này trước đây - là đối số thứ hai có tập hợp các nút XML không? –

+0

Heh, yep - đối số thứ hai là 'bối cảnh', mặc định là tài liệu hiện tại, nhưng thực sự có thể là bất kỳ DOM hoặc tài liệu nào. (http://docs.jquery.com/Core/jQuery) Handy. :) –

+0

Điều này thật tuyệt. Giống như Peter tôi cần phải tìm ra những gì đang diễn ra. Những gì chính xác là đẩy? Một phương thức mảng để thêm vào mảng? – RedWolves

6

Tôi sử dụng phương thức .each() cho các cuộc gọi ASP.NET WebMethod trả về chuỗi JSON. Trong ví dụ này, nó populates một ListBox với các giá trị trở về từ cuộc gọi Ajax:

async: true, 
type: "POST", 
url: "Example.aspx/GetValues", 
data: "{}", 
contentType: "application/json; charset=utf-8", 
dataType: "json", 
success: function(data) { 
    var list = $('<select />'); 

    $.each(data.d, function(){ 
     var val = this.Value; 
     var text = this.Text; 
     list.append($('<option />').val(val).text(text)); 
    }); 

    $('#listbox').empty().append(list.find('option')); 
}, 

ASP.NET có một built-in JSON serializer rằng Automagically chuyển đổi một lớp thành chuỗi JSON bạn nhìn thấy ở dưới cùng của này bài đăng.Dưới đây là một lớp ví dụ có thể được trả lại bởi WebMethod:

public class Tuple 
{ 
    public string Text; 
    public int Value; 

    public Tuple(string text, int val) 
    { 
     Text = text; 
     Value = val; 
    } 
} 

WebMethod bản thân:

[WebMethod] 
public static List<Tuple> GetValues() 
{ 
    List<Tuple> options = new List<Tuple>(); 
    options.Add(new Tuple("First option", 1)); 
    options.Add(new Tuple("Second option", 2)); 
    return options; 
} 

Khi bạn xác định dataType: "json" trong các tùy chọn jQuery Ajax, chuỗi được tự động chuyển đổi thành một Javascript đối tượng, vì vậy bạn có thể chỉ cần nhập this.Text hoặc this.Value để nhận dữ liệu.

Dưới đây là kết quả JSON trở về từ các WebMethod trên:

{"d":[{"Value":1,"Text":"First option"},{"Value":2,"Text":"Second option"}]} 

Lưu ý: các data.d tham số (và tương tự như vậy giá trị đầu tiên nhìn thấy trong chuỗi JSON) được giải thích here.

+0

Vâng đây là một ví dụ thực tế thú vị. Tôi thích nó. Bạn có thể chỉnh sửa nó bằng ví dụ mẫu JSON không? Tôi giả định Giá trị và Văn bản là các biến trong JSON của bạn? – RedWolves

3

Như tôi đã cùng một vấn đề ... Tôi gửi bài liên kết này mà rất hữu ích cho tôi: Examples

+2

Đâu là liên kết này cách đây hai năm rưỡi ;-) – RedWolves

2

each() là một chức năng lặp sử dụng để lặp qua đối tượng, mảng, và các đối tượng mảng giống như . Các đối tượng đồng bằng được lặp qua các thuộc tính được đặt tên của chúng trong khi các mảng và các đối tượng giống mảng được lặp qua các chỉ mục của chúng.

Ví dụ:

Mảng lặp lại sử dụng .each() phương pháp

$.each(arr, function(index, value){ 
    //code here 
}); 

Plain Object Iteration sử dụng phương pháp .each

$.each({ firstName: "Amit", lastName: "Gupta" }, function(firstName, lastName){ 
    console.log(" First Name: " + firstName + " Last Name: " + lastName); 
}); 
0

$.each() sử dụng như vòng lặp for, và $(this) tham chiếu đối tượng hiện tại của lo op. Ở đây trong ví dụ dưới đây, nơi chúng tôi lặp qua hàng của bảng $(this) đại diện cho hàng hiện tại nó lặp lại.

Ngoài ra kiểm tra: 5 ways use of jQuery $.each()

Vòng qua một mảng

// here's the array variable 
var myArray = ["apple", "mango", "orange", "grapes", "banana"]; 

$.each(myArray, function (index, value) { 
     console.log(index+' : '+value); 
}); 

Vòng qua Bảng Row (HTML tố)

$("#myTable tr").each(function() { 
     var self = $(this); 
     var col_1_value = self.find("td:eq(0)").text().trim(); 
     var col_2_value = self.find("td:eq(1)").text().trim(); 
     var col_3_value = self.find("td:eq(2)").text().trim(); 
     var col_4_value = self.find("td:eq(3)").text().trim(); 
     var result = col_1_value + " - " + col_2_value + " - " + col_3_value + " - " + col_4_value; 
     console.log(result); 
}); 
Các vấn đề liên quan