Thứ Tư, 18 tháng 2, 2009

Các tiện ích trong JQuery (Phần 4)

jQuery.trim() : Hủy bỏ các khoảng trắng từ đầu và cuối của một chuỗi.

jQuery.trim(str)
str : chuỗi dùng để trim.

Các $.trim() function loại bỏ tất cả các dòng mới, khoảng trắng (bao gồm cả không gian không bị phá hủy), và các tab từ đầu và cuối của chuỗi cung cấp. Nếu các ký tự này xảy ra khoảng trắng ở giữa chuỗi, chúng được bảo tồn.

Ví dụ: Hủy bỏ cả hai khoảng trắng ở đầu và ở cuối chuỗi.
    
    

Hoặc :

$.trim(" hello, how are you? ");

jQuery.type() : Xác định nội bộ JavaScript [[Class]] của một đối tượng.
jQuery.type(obj)
obj : Đối tượng để có được những JavaScript bên trong [[Class]] của.

Một số kỹ thuật được sử dụng để xác định chính xác giá trị trả lại cho một đối tượng. Các [[Class]] được xác định như sau:

Nếu đối tượng có xác định hoặc vô giá trị, sau đó "không xác định" hoặc "vô giá trị" có trả về cho phù hợp.

Nếu đối tượng có một bên trong [[Class]] tương đương cho một trong những trình duyệt được tích hợp trong các đối tượng, tên liên quan được trả về. (Xem thêm chi tiết về kỹ thuật này.)
  • jQuery.type(true) === "boolean"
  • jQuery.type(3) === "number"
  • jQuery.type("test") === "string"
  • jQuery.type(function(){}) === "function"
  • jQuery.type([]) === "array"
  • jQuery.type(new Date()) === "date"
  • jQuery.type(/test/) === "regexp"
Mọi thứ khác trả về "đối tượng" như kiểu của nó.

Ví dụ: Tìm ra nếu tham số có một RegExp.
     Is it a RegExp?
    

jQuery.merge() : ợp nhất các nội dung của hai mảng với nhau trong những array đầu tiên.

jQuery.merge(first,second)
first : Các array đầu tiên cho hợp nhất, các yếu tố của thứ hai được thêm vào.
second : Các array thứ hai cho nhập vào, đầu tiên không thay đổi gì.

Ví dụ: hòa trộn hai mảng, thay đổi các tham số first .

$.merge( [0,1,2], [2,3,4] )

Ví dụ: hòa trộn hai mảng, thay đổi các tham số first .

$.merge( [3,2,1], [4,3,2] )

Ví dụ: hòa trộn hai mảng, nhưng sử dụng một bản sao, do đó, các gốc không thay đổi.

var first = ['a','b','c'];
var second = ['d','e','f'];
$.merge( $.merge([],first), second);

DangTrung.

Các tiện ích trong JQuery (Phần 3)

jQuery.parseJSON() : Một chuỗi JSON được hình thành và trả về kết quả đối tượng JavaScript.

jQuery.parseJSON(json)
json : Chuỗi json để parse.

Truyền một chuỗi JSON đúng định dạng có thể gây ra lỗi Ví dụ, sau đây là tất cả các JSON những chuỗi bị thay đổi:

{test: 1} (kiểm tra không có dấu ngoặc kép quanh nó).
{'test': 1} ('test' có sử dụng dấu ngoặc đơn thay vì dấu ngoặc kép).

Ngoài ra nếu bạn truyền vào không có gì, chuỗi rỗng, rỗng, hoặc, 'null' không xác định sẽ được trả lại từ parseJSON. Trường hợp cung cấp một trình duyệt thực hiện nguồn gốc của JSON.parse, jQuery sử dụng nó cho phân tích các chuỗi. Để biết chi tiết về định dạng JSON, xem http://json.org/.

Ví dụ : parse một chuỗi json
var obj = jQuery.parseJSON('{"name":"John"}');
alert( obj.name === "John" );

jQuery.parseXML() : parses chuỗi trong một tài liệu XML.

jQuery.parseXML(data)
data : một XML cũng như các hình thành chuỗi được phân tích cú pháp

jQuery.parseXML sử dụng chức năng phân tích gốc của trình duyệt để tạo ra một tài liệu XML hợp lệ. Tài liệu này sau đó có thể được truyền cho jQuery để tạo ra một đối tượng jQuery điển hình có thể được đi qua và thao tác.

Ví dụ: Tạo một đối tượng jQuery sử dụng một chuỗi XML và đạt được giá trị của nút tiêu đề.

var xml = 'RSS Title',
xmlDoc = $.parseXML( xml ),
$xml = $( xmlDoc ),
$title = $xml.find( 'title' );

// append "RSS Title" to #someElement
$( '#someElement' ).append( $title.text() );

// change the title to "XML Title"
$title.text( 'XML Title' );

// append "XML Title" to #anotherElement
$( '#anotherElement' ).append( $title.text() );

jQuery.proxy() : Có một chức năng được trả về một cái mới sẽ luôn luôn có một ngữ cảnh cụ thể.

jQuery.proxy(function, context)
function : Các chức năng có ngữ cảnh sẽ được thay đổi.
context : Các đối tượng mà các ngữ cảnh (này) của hàm nên được thiết lập.

jQuery.proxy(context, name)
context : Các đối tượng mà các bối cảnh của function này nên được thiết lập.
name: Tên của các function mà context sẽ được thay đổi (nên được một tài sản của đối tượng context ).

Phương pháp này có hữu ích nhất để gắn xử lý sự kiện cho một yếu tố mà bối cảnh có chỉ trở lại cho một đối tượng khác nhau. Ngoài ra, jQuery có thể chắc chắn rằng ngay cả khi bạn gắn chức năng trở về từ jQuery.proxy () nó vẫn sẽ mở ra chức năng chính xác nếu truyền ban đầu.

Ví dụ: Thực thi các context của các function bằng cách sử dụng "function, context" chữ ký. Mở ra bộ xử lý sau khi nhấp chuột đầu tiên.

    

    

    

jQuery.now() : Quay trở lại một số đại diện cho thời gian hiện hành.
Các $.now() có một phương pháp tốc ký cho số trả về bởi expression(new Date).getTime().

DangTrung.

Thứ Ba, 17 tháng 2, 2009

Các tiện ích trong JQuery (phần 1)

jQuery.isFunction() : Xác định các đối số được thông qua một đối tượng chức năng Javascript.

Ví dụ :

   
jQuery.isFunction(objs[0]) =
   
jQuery.isFunction(objs[1]) =
   
jQuery.isFunction(objs[2]) =
   
jQuery.isFunction(objs[3]) =
   
jQuery.isFunction(objs[4]) =
   

jQuery.isPlainObject() : Kiểm tra xem một đối tượng là một đối tượng đơn giản (được tạo ra bằng cách sử dụng "{}" hoặc "new Object").

Ví dụ: Kiểm tra một đối tượng cho xem nếu nó một đối tượng đơn giản.

jQuery.isPlainObject({}) // true
jQuery.isPlainObject("test") // false

jQuery.isArray() : Xác định xem đối số là một mảng.

$.isArray() trả về một đối tượng Boolean cho thấy dù là một array JavaScript (không phải là một đối tượng array giống như, một đối tượng jQuery).

Ví dụ : Tìm ra nếu tham số là một array .

     Is [] an Array?
    

jQuery.isEmptyObject() : Kiểm tra xem một đối tượng là trống rỗng (không chứa các thuộc tính).

Ví dụ: Kiểm tra một đối tượng cho xem nếu nó trống.

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

jQuery.isWindow() : Xác định xem đối số là một cửa sổ.

Ví dụ: Tìm ra nếu tham số một cửa sổ.
      Is 'window' a window?
     

DangTrung

Các tiện ích trong JQuery (Phần 2)

jQuery.isXMLDoc() : Kiểm tra xem nếu một điểm nút DOM có trong một tài liệu XML (hoặc là một tài liệu XML).

jQuery.isXMLDoc(node)
node: Các node DOM sẽ được kiểm tra để xem nếu nó có trong một tài liệu XML.

Ví dụ: Kiểm tra một đối tượng để xem nó trong một tài liệu XML.

jQuery.isXMLDoc(document) // false
jQuery.isXMLDoc(document.body) // false

jQuery.makeArray() : Chuyển đổi một đối tượng mảng giống như trong một mảng JavaScript.
Nhiều phương pháp, cả về jQuery và trong JavaScript nói chung, các đối tượng trở về được giống như mảng. Ví dụ, các chức năng factory jQuery $() trả về một đối tượng jQuery có nhiều tính chất của một mảng (một chiều dài, các [] mảng tiếp cận toán tử, vv), nhưng không chính xác giống như một mảng và thiếu một số của một mảng được tích hợp trong các phương pháp (như .pop() và .reverse()).

Lưu ý rằng sau khi chuyển đổi, bất kỳ tính năng đặc biệt các đối tượng đã có (như các phương pháp jQuery trong ví dụ của chúng ta) sẽ không còn hiện diện. Các đối tượng bây giờ là một mảng đơn giản.

Ví dụ: Bật một bộ sưu tập của HTMLElements trong một mảng của chúng.
    
First
    
Second
    
Third
    
Fourth
    

jQuery.map() : Dịch tất cả các mục trong một mảng hoặc một đối tượng mảng giống như đến một loạt các mục.

jQuery.map(array, callback(elementOfArray,indexInArray))
array; Các mảng dịch.
callback (elementOfArray, indexInArray): Các chức năng để xử lý từng mục so với. Đối số đầu tiên chức năng là mục danh sách, tham số thứ hai có các chỉ số trong mảng chức năng có thể trở về bất kỳ giá trị. đây sẽ là đối tượng cửa sổ quốc tế.

Method $.Map() áp dụng một chức năng để mỗi mục trong một mảng, thu thập các kết quả trong một array mới.

Các chức năng dịch thuật được cung cấp cho method này được gọi cho mỗi mục trong array và được truyền qua hai đối số: Các mục được dịch, và các chỉ số trong mảng.

Các chức năng có thể trả về:
  • giá trị dịch, sẽ được ánh xạ tới mảng kết quả
  • null, để loại bỏ các mục
  • một array các giá trị, mà sẽ được san phẳng trong các array đầy đủ
Map có thể chuyển đổi thông qua các đối tượng Array-like, như một đối tượng jQuery, có một tài sản dài.

Ví dụ: Một ví dụ vài cách sử dụng .Map().

    
    

    
    

Ví dụ: Maps các array ban đầu cho một hình mới và tăng thêm 4 cho các giá trị.

$.map( [0,1,2], function(n){
      return n + 4;
});

Ví dụ: Maps các array ban đầu cho một cái mới và cộng thêm 1 cho giá trị mỗi khi nó lớn hơn sau đó không, nếu không nó loại bỏ.
$.map( [0,1,2], function(n){
     return n > 0 ? n + 1 : null;
});

Ví dụ: Maps các array ban đầu cho một cái mới, mỗi phần tử được thêm vào với nó là giá trị ban đầu và giá trị cộng thêm một.

$.map( [0,1,2], function(n){
     return [ n, n + 1 ];
});

Ví dụ: Maps các array ban đầu cho một cái mới, mỗi phần tử có bình phương.

$.map( [0,1,2,3], function (a) { return a * a; } );

Ví dụ: Hủy bỏ mục bằng cách trả về null từ chức năng. Điều này loại bỏ bất kỳ số lượng ít hơn 50, và phần còn lại được giảm 45.


$.map( [0, 1, 52, 97], function (a) { return (a > 50 ? a - 45 : null); } );

Ví dụ: làm tăng các array kết quả bằng cách trả về một array bên trong hàm.

var array = [0, 1, 52, 97];
      array = $.map(array, function(a, index) {
      return [a - 45, index];
});
DangTrung

Thứ Hai, 16 tháng 2, 2009

Sử dụng jQuery.inArray() trong jQuery

Làm thế nào tìm kiếm một value được quy định trong một mảng và trở lại chỉ số của nó (hoặc -1 nếu không tìm thấy).

jQuery.inArray( value, array )
value: Giá trị để tìm kiếm.
array : Một mảng thông qua đó cho tìm kiếm.

Method $.inArray() tương tự như .indexOf() có nguồn gốc JavaScript trong đó nó sẽ trả về -1 khi không tìm được một già trị. Nếu các element đầu tiên trong mảng value phù hợp, $.inArray() trả về 0.

Vì xử lý JavaScript với giá trị so sánh false (tức là 0 == false, nhưng 0 == false!), nếu chúng tôi đang kiểm tra sự hiện diện của value trong array , chúng ta cần cho kiểm tra nếu nó không phải bằng (hoặc lớn hơn ) -1.

Ví dụ: Báo cáo chỉ số của một số các phần tử trong mảng.

    
"John" found at
    
4 found at
    
"Karl" not found, so
    

DangTrung.

Sử dụng jQuery.each() trong JQuery

Một chức năng iterator tổng quát, này có thể được sử dụng cho suốt lặp đi lặp lại trên cả hai đối tượng và mảng. Mảng và các đối tượng mảng giống như với một property lenght (chẳng hạn như chức năng của các đối số đối tượng) được lặp lại bởi chỉ số, từ 0 đến length-1. Các đối tượng khác được lặp lại bằng các thuộc tính tên của mình.

jQuery.each(collection, callback(indexInArray, valueOfElement))
collection : Các đối tượng hoặc một mảng được duyệt qua.
callback (indexInArray, valueOfElement): Chức năng này sẽ được thực hiện trên mọi đối tượng.

Các chức năng $.each() không giống như .each(), được sử dụng cho chuyển đổi, độc quyền, trên một đối tượng jQuery. Các chức năng $.each() có thể được sử dụng cho chuyển đổi qua bất kỳ collection, dù đó là một Map (đối tượng JavaScript) hoặc một mảng. Trong trường hợp của một mảng, các callback được thông qua chỉ số mảng và mảng một value tương ứng mỗi lần.(value cũng có thể được truy cập thông qua các từ khoá này, nhưng sẽ luôn luôn quấn Javascript giá trị này như là một đối tượng ngay cả khi nó là một chuỗi đơn giản, giá trị số.) phương thức này trả về số đầu tiên của nó, các đối tượng đó đã được lặp lại.

$.each([52, 97], function(index, value) {
       alert(index + ': ' + value);
});

ví dụ trên tạo ra hai thông điệp:

0: 52
1: 97

Nếu map được sử dụng như là bộ sưu tập, các callback được thông qua một cặp key có giá trị each lần lượt như sau:

var map = {
       'flammable': 'inflammable',
       'duh': 'no duh'
};
$.each(map, function(key, value) {
       alert(key + ': ' + value);
});

Một lần nữa, điều này tạo ra hai thông điệp:

lammable: inflammable
duh: no duh

Chúng ta có thể phá vỡ vòng lặp $.each() tại một iteration cụ thể bằng cách làm cho trở lại chức năng callback sai.. Trả lại không sai là giống như là vẫn tiếp tục câu lệnh trong một vòng lặp for, nó sẽ bỏ qua ngay cho phiên tiếp theo.

Ví dụ: duyệt qua mảng hiển thị những con số từ cả hai chữ và số

    
    
    
    
    
    

DangTrung.

Sử dụng jQuery.data() trong JQuery

jQuery.data( element, key, value )
element : Các phần tử DOM để kết hợp với dữ liệu.
key: Một chuỗi đặt tên cho các phần dữ liệu để cài đặt.
value: Giá trị dữ liệu mới.

Các Method jQuery.data() cho phép chúng ta kèm dữ liệu của các kiểu bất kỳ để các phần tử DOM một cách an toàn từ các tham chiếu vòng và do đó không bị rò rỉ bộ nhớ. jQuery đảm bảo rằng dữ liệu được lấy ra khi các phần tử DOM được loại bỏ thông qua các phương pháp jQuery, và khi người dùng rời khỏi trang. Chúng ta có thể thiết lập một số giá trị khác biệt cho một phần tử duy nhất và truy xuất chúng sau đó:

jQuery.data(document.body, 'foo', 52);
jQuery.data(document.body, 'bar', 'test');

Lưu ý rằng phương pháp này hiện không cung cấp nền tảng hỗ trợ cho việc thiết lập dữ liệu trên các tài liệu XML, như Internet Explorer không cho phép dữ liệu được đính kèm thông qua thuộc tính expando.

   
The values stored were
         
          and
         
   
   


jQuery.data (element , key)
element : Các element DOM cho truy vấn dữ liệu.
key: Tên của dữ liệu được lưu trữ.

jQuery.data (element )
element : Các element DOM cho truy vấn dữ liệu.

Ví dụ: Nhận các dữ liệu có tên là "blah" được lưu trữ lúc cho một element .

     
A div
     
     
     
     
     

The "blah" value of this div is ?

     

DangTrung.

Làm thế nào để xXử lý ngoại lệ trong biểu thức truy vấn

Nó có thể gọi bất kỳ phương pháp trong bối cảnh của một biểu thức query. Tuy nhiên, chúng tôi khuyên bạn nên tránh gọi bất kỳ method trong một biểu thức query có thể tạo ra một tác dụng phụ chẳng hạn như thay đổi nội dung của nguồn dữ liệu hoặc throw một ngoại lệ. Ví dụ này cho thấy làm thế nào để tránh trường hợp ngoại lệ nâng cao khi bạn gọi phương thức trong một biểu thức query mà không vi phạm nói chung. NET Framework hướng dẫn về xử lý ngoại lệ. Những trạng thái hướng dẫn đó thì có thể bắt một ngoại lệ cụ thể khi bạn hiểu tại sao nó sẽ được ném ra trong một bối cảnh cụ thể.

Ví dụ sau đây cho thấy làm thế nào để di chuyển mã xử lý ngoại lệ bên ngoài một biểu thức query. Điều này chỉ có thể khi các method không phụ thuộc vào bất kỳ các biến local để truy vấn.

class ExceptionsOutsideQuery
{
      static void Main()
      {
            // DO THIS with a datasource that might
            // throw an exception. It is easier to deal with
            // outside of the query expression.
            IEnumerable dataSource;
            try
            {
                    dataSource = GetData();
            }
            catch (InvalidOperationException)
            {
                   // Handle (or don't handle) the exception
                   // in the way that is appropriate for your application.
                   Console.WriteLine("Invalid operation");
                   goto Exit;
            }
            // If we get here, it is safe to proceed.
            var query = from i in dataSource
            select i * i;
            foreach (var i in query)
                   Console.WriteLine(i.ToString());


            //Keep the console window open in debug mode
            Exit:
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
     }


      // A data source that is very likely to throw an exception!
      static IEnumerable GetData()
      {
            throw new InvalidOperationException();
      }
}

Trong một số trường hợp, câu trả lời tốt nhất để một ngoại lệ được thrown từ bên trong một query có thể để ngăn chặn việc thực hiện query ngay lập tức. Ví dụ sau đây cho thấy làm thế nào để xử lý các trường hợp ngoại lệ có thể được thrown từ bên trong một thân query. Giả sử rằng SomeMethodThatMightThrow khả năng có thể gây ra một ngoại lệ đòi hỏi phải thực hiện query để ngăn chặn.

Lưu ý rằng khối try bao bọc các vòng lặp foreach, và không phải là query chính nó. Điều này là do các vòng lặp foreach là điểm mà tại đó các truy vấn được thực thi.

class QueryThatThrows
{
        static void Main()
        {
                // Data source.
                string[] files = { "fileA.txt", "fileB.txt", "fileC.txt" };


                // Demonstration query that throws.
                var exceptionDemoQuery = from file in files
                       let n = SomeMethodThatMightThrow(file)
                       select n;


               // Runtime exceptions are thrown when query is executed.
               // Therefore they must be handled in the foreach loop.
               try
               {
                      foreach (var item in exceptionDemoQuery)
                      {
                              Console.WriteLine("Processing {0}", item);
                      }
                }


                // Catch whatever exception you expect to raise
                // and/or do any necessary cleanup in a finally block
                catch (InvalidOperationException e)
               {
                      Console.WriteLine(e.Message);
               }


               //Keep the console window open in debug mode
               Console.WriteLine("Press any key to exit");
               Console.ReadKey();
        }


         // Not very useful as a general purpose method.
         static string SomeMethodThatMightThrow(string s)
         {
               if (s[4] == 'C')
                     throw new InvalidOperationException();
               return @"C:\newFolder\" + s;
         }
}
/* Output:
Processing C:\newFolder\fileA.txt
Processing C:\newFolder\fileB.txt
Operation is not valid due to the current state of the object.
*/

DangTrung.

Làm thế nào để xử lý giá trị Null trong biểu thức truy vấn

Ví dụ này cho thấy làm thế nào để xử lý các giá trị null có thể có trong bộ sưu tập nguồn. Một bộ sưu tập các đối tượng đó như là một IEnumerable có thể chứa các yếu tố có giá trị null. Nếu nguồn là một bộ sưu tập vô giá trị hoặc có một phần tử có giá trị null, và query của bạn không xử lý các giá trị null, NullReferenceException sẽ được đẩy ra ngoài khi bạn thực hiện câu truy vấn.

Bạn có thể bảo vệ mã để tránh một ngoại lệ tham chiếu null như trong ví dụ sau đây:

var query1 =  from c in categories
       where c != null
       join p in products on c.ID equals
               (p == null ? null : p.CategoryID)
       select new { Category = c.Name, Name = p.Name };

Trong ví dụ trước, các nơi mệnh đề lọc ra tất cả các yếu tố null trong thứ tự danh mục. Kỹ thuật này được độc lập của việc kiểm tra null trong mệnh đề join. Các biểu thức điều kiện với null trong ví dụ này hoạt động bởi vì Products.CategoryID là kiểu int? đó là viết tắt cho Nullable.

Trong một mệnh đề join, nếu chỉ có một trong các phím so sánh là một loại giá trị nullable, bạn có thể bỏ các kia với một loại nullable trong biểu thức query. Trong ví dụ sau đây, giả sử là EmployeeID là một cột chứa giá trị kiểu int?:

void TestMethod(Northwind db)
{
       var query = from o in db.Orders
              join e in db.Employees
                     on o.EmployeeID equals (int?)e.EmployeeID
              select new { o.OrderID, e.FirstName };
}

DangTrung.

Làm thế nào để join bằng cách sử dụng Key Composite

Ví dụ này cho thấy làm thế nào để thực hiện join các hoạt động mà bạn muốn sử dụng nhiều hơn một khóa chính để xác định một trận đấu. Điều này được thực hiện bằng cách sử dụng một khóa composite. Bạn tạo một khóa composite như là một loại anonymous hoặc tên gõ với các giá trị mà bạn muốn so sánh. Nếu biến query sẽ được chuyển qua các biên giới, phương pháp sử dụng một loại có tên overrides Equals và GetHashCode cho khoá. Tên của các thuộc tính, và thứ tự mà chúng xảy ra, phải được giống hệt nhau trong mỗi khóa.

Ví dụ sau đây cho thấy làm thế nào để sử dụng một khóa composite để join dữ liệu từ ba bảng:

var query = from o in db.Orders from p in db.Products
       join d in db.OrderDetails on new {o.OrderID, p.ProductID} equals new {d.OrderID,
              d.ProductID} into details from d in details
       select new {o.OrderID, p.ProductID, d.UnitPrice};

Các khóa composite phụ thuộc vào tên của các thuộc tính trong các khóa, và thứ tự mà chúng xảy ra. Nếu các thuộc tính trong chuỗi nguồn không có tên giống nhau, bạn phải gán tên mới trong các khóa. Ví dụ, nếu bảng Orders và bảng OrderDetails từng được sử dụng tên khác nhau cho các cột của họ, bạn có thể tạo ra phím composite bằng cách chỉ định tên giống hệt nhau trong các loại anonymous:

join...on new {Name = o.CustomerName, ID = o.CustID} equals
        new {Name = d.CustName, ID = d.CustID }

DangTrung.

Chủ Nhật, 15 tháng 2, 2009

Làm thế nào để sắp xếp các kết quả của một Clause join

Ví dụ này cho thấy làm thế nào để sắp xếp các kết quả của một hoạt động join. Lưu ý rằng các lệnh được thực hiện sau khi join. Mặc dù bạn có thể sử dụng một mệnh đề orderby với một hoặc nhiều trình tự mã nguồn trước khi join, nhìn chung chúng takhông giới thiệu nó. Một số nhà cung cấp LINQ có thể không có duy trì lệnh sau khi join.

Truy vấn này tạo ra một group join, và sau đó sắp xếp các group dựa trên các yếu tố thể loại, mà vẫn còn trong phạm vi. Bên trong bộ khởi tạo kiểu anonymous, một sub query orhers tất cả các yếu tố kết hợp từ các chuỗi sản phẩm.

class HowToOrderJoins
{
       #region Data
       class Product
       {
              public string Name { get; set; }
              public int CategoryID { get; set; }
       }

       class Category
       {
              public string Name { get; set; }
              public int ID { get; set; }
       }

       // Specify the first data source.
       List categories = new List()
       {
               new Category(){Name="Beverages", ID=001},
               new Category(){ Name="Condiments", ID=002},
               new Category(){ Name="Vegetables", ID=003},
               new Category() { Name="Grains", ID=004},
               new Category() { Name="Fruit", ID=005}
       };

       // Specify the second data source.
       List products = new List()
       {
               new Product{Name="Cola", CategoryID=001},
               new Product{Name="Tea", CategoryID=001},
               new Product{Name="Mustard", CategoryID=002},
               new Product{Name="Pickles", CategoryID=002},
               new Product{Name="Carrots", CategoryID=003},
               new Product{Name="Bok Choy", CategoryID=003},
               new Product{Name="Peaches", CategoryID=005},
               new Product{Name="Melons", CategoryID=005},
       };
       #endregion
       
       static void Main()
       {
               HowToOrderJoins app = new HowToOrderJoins();
               app.OrderJoin1();

               // Keep console window open in debug mode.
               Console.WriteLine("Press any key to exit.");
               Console.ReadKey();
        }

        void OrderJoin1()
        {
                var groupJoinQuery2 =  from category in categories
                       join prod in products on category.ID equals prod.CategoryID into prodGroup
                       orderby category.Name
                       select new
                       {
                               Category = category.Name,
                               Products = from prod2 in prodGroup  orderby prod2.Name
                               select prod2
                       };
                foreach (var productGroup in groupJoinQuery2)
                {
                        Console.WriteLine(productGroup.Category);
                        foreach (var prodItem in productGroup.Products)
                        {
                                Console.WriteLine(" {0,-10} {1}", prodItem.Name, prodItem.CategoryID);
                         }
                 }
         }
        /* Output :
            Beverages
            Cola 1
            Tea 1
            Condiments
            Mustard 2
            Pickles 2
            Fruit
            Melons 5
            Peaches 5
            Grains
            Vegetables
            Bok Choy 3
            Carrots 3
         */
}
DangTrung.

Sử dụng :animated Selector trong JQuery

Chọn tất cả các phần tử có trong tiến trình hoạt hình có tại thời điểm chọn được chạy.

Ví dụ: Thay đổi màu sắc của bất kỳ div là hoạt hình

    
    
    
    
    









DangTrung.

Làm thế nào biết version của trình duyệt trong JQuery

Làm thế nào biết được phiên bản của trình duyệt trên máy tính người dùng.

Dưới đây là một số kết quả tiêu biểu:
  • Internet Explorer: 6.0, 7.0, 8.0
  • Mozilla/Firefox/Flock/Camino: 1.7.12, 1.8.1.3, 1.9
  • Opera: 10.06, 11.01
  • Safari/Webkit: 312.8, 418.9

Lưu ý rằng yêu cầu IE8 là 7 trong Compatibility View.

Ví dụ: trả về phiên bản của trình duyệt trên máy tính hiện tại của người dùng. Ví dụ, FireFox 4 trả về 2.0 (phiên bản của máy dựng hình Gecko nó sử dụng).

   

   

Ví dụ: Cảnh báo các phiên bản của IE của máy dựng hình đang được sử dụng:

if ( $.browser.msie ) {
alert( $.browser.version );
}

Ví dụ: Thông thường bạn chỉ quan tâm về "major number", toàn bộ số lượng, mà bạn có thể nhận được bằng cách sử dụng JavaScript tích hợp trong chức năng parseInt() :

if ( $.browser.msie ) {
      alert( parseInt($.browser.version, 10) );
}

DangTrung.

Sử dụng jQuery.browser trong JQuery

Tác nhân Người dùng có chứa các cờ, đọc từ navigator.userAgent. Chúng tôi khuyên bạn không nên sử dụng tài sản này, hãy thử sử dụng tính năng phát hiện thay vì (xem jQuery.support). jQuery.browser có thể được chuyển đến một plugin trong một phiên bản tương lai của jQuery.

Properties $.browser cung cấp thông tin về trình duyệt web được truy cập vào trang, theo báo cáo của các trình duyệt riêng của mình. Nó chứa các flag cho mỗi trong số bốn lớp trình duyệt phổ biến nhất (Internet Explorer, Mozilla, Webkit, và Opera) cũng như thông tin phiên bản.
  • webkit (as of jQuery 1.4)
  • safari (deprecated)
  • opera
  • msie
  • mozilla
Properties này là hiện có sẵn ngay phiên bản. Vì vậy, an toàn sử dụng nó xác định có hay không gọi $(document).ready(). Các property $.browser bị phản đối trong jQuery 1.3, và chức năng của nó có thể được chuyển đến một đội ngũ hỗ trợ plugin trong một phiên bản tương lai của jQuery.

$.browser sử dụng navigator.userAgent để xác định nền tảng, do vậy dễ bị giả mạo bởi người dùng hay của bản thân trình duyệt sai. Tốt nhất để tránh mã trình duyệt cụ thể hoàn toàn nếu có thể. Các property $.support có sẵn phát hiện các hỗ trợ cho các tính năng đặc biệt hơn là dựa vào $.browser.

Ví dụ: Hiển thị các thông tin trình duyệt.

    

Browser info:

    

Ví dụ: Trả về true nếu Tác nhân Người dùng hiện nay là một số phiên bản của Internet Explorer của Microsoft.

$.browser.msie;

Ví dụ: Cảnh báo "đây là WebKit!" chỉ cho các trình duyệt WebKit

if ($.browser.webkit) {
      alert( "this is webkit!" );
}

Ví dụ: Cảnh báo "Do các công cụ cho Firefox 3" chỉ dành cho trình duyệt Firefox 3.

var ua = $.browser;
if ( ua.mozilla && ua.version.slice(0,3) == "1.9" ) {
      alert( "Do stuff for firefox 3" );
}

Ví dụ: Thiết lập một tài sản CSS đó là cụ thể cho một trình duyệt cụ thể.

if ( $.browser.msie ) {
      $("#div ul li").css( "display","inline" );
} else {
      $("#div ul li").css( "display","inline-table" );
}

DangTrung.

Làm thế nào để sử dụng Left Outer Joins

Một left outer join là một join, trong đó mỗi phần tử của các bộ sưu tập đầu tiên được trả về, bất kể nó có bất kỳ yếu tố tương quan trong bộ sưu tập thứ hai. Bạn có thể sử dụng LINQ để thực hiện một left outer join bằng cách gọi DefaultIfEmpty kết quả của một group join.

Ví dụ sau đây cho thấy làm thế nào để sử dụng Methos DefaultIfEmpty kết quả của một group join để thực hiện một left outer join.

Bước đầu tiên trong việc tạo ra một left outer join trong hai bộ sưu tập là để thực hiện một bên join bằng cách sử dụng một group join. Trong ví dụ này, danh sách các đối tượng Person inner join vào danh sách các đối tượng PET dựa trên một Person object phù hợp với Pet.Owner.

Bước thứ hai là để bao gồm mỗi yếu tố của bộ sưu tập (left) đầu tiên trong tập hợp kết quả ngay cả khi không có yếu tố phù hợp trong bộ sưu tập phải. Điều này được thực hiện bằng cách gọi DefaultIfEmpty trên mỗi chuỗi kết hợp các yếu tố từ các group join. Trong ví dụ này, DefaultIfEmpty được gọi vào mỗi chuỗi các đối tượng phù hợp với PET. Nó trả về một bộ sưu tập có chứa một giá trị, mặc định duy nhất nếu các trình tự của các đối tượng phù hợp PET trống cho bất kỳ đối tượng Person, qua đó đảm bảo rằng kết quả mỗi đối tượng Person được đại diện trong bộ sưu tập.

class Person
{
       public string FirstName { get; set; }
       public string LastName { get; set; }
}

class Pet
{
       public string Name { get; set; }
       public Person Owner { get; set; }
}

public static void LeftOuterJoinExample()
{
       Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
       Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
       Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
       Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

       Pet barley = new Pet { Name = "Barley", Owner = terry };
       Pet boots = new Pet { Name = "Boots", Owner = terry };
       Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
       Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
       Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

       // Create two lists.
       List people = new List { magnus, terry, charlotte, arlene };
       List pets = new List { barley, boots, whiskers, bluemoon, daisy };

       var query = from person in people
              join pet in pets on person equals pet.Owner into gj
              from subpet in gj.DefaultIfEmpty()
              select new { 
                      person.FirstName, PetName = (subpet == null ? String.Empty : subpet.Name)      
              };

       foreach (var v in query)
       {
              Console.WriteLine("{0,-15}{1}", v.FirstName + ":", v.PetName);
       }
}

// This code produces the following output:
//
// Magnus: --- > Daisy
// Terry: --- > Barley
// Terry: --- >  Boots
// Terry: --- > Blue Moon
// Charlotte: --- > Whiskers
// Arlene: --- >
DangTrung

Làm thế nào để thực hiện Grouped Join

Các group join rất hữu ích cho tạo ra các cấu trúc phân cấp dữ liệu. Những cặp này mỗi yếu tố từ các bộ sưu tập đầu tiên với một tập hợp các yếu tố tương quan từ các bộ sưu tập thứ hai.

Ví dụ, một class hoặc cơ sở dữ liệu một bảng quan hệ có tên là Sinh viên có thể chứa hai lĩnh vực: Id và Name. Một class thứ hai hoặc bảng cơ sở dữ liệu quan hệ có tên là khóa học có thể có hai lĩnh vực: StudentId và CourseTitle. Một nhóm tham gia của hai nguồn dữ liệu, dựa trên kết hợp Student.Id và Course.StudentId, sẽ từng nhóm sinh viên với một bộ sưu tập của các đối tượng học.

Ví dụ đầu tiên trong chủ đề này cho bạn thấy làm thế nào để thực hiện một group join. Ví dụ thứ hai chỉ cho bạn cách sử dụng một nhóm join để tạo ra các phần tử XML.

Ví dụ Group Join :

Ví dụ sau đây thực hiện một nhóm join của các đối tượng của loại hình Person và PET dựa trên những người phù hợp với property Pet.Owner. Không giống như một group không join, mà sẽ tạo ra một cặp của các yếu tố cho mỗi trận đấu, các group join tạo ra chỉ có một kết quả là đối tượng cho từng thành phần của bộ sưu tập đầu tiên, mà trong ví dụ này là một đối tượng Person. Các yếu tố tương ứng từ các bộ sưu tập thứ hai, trong ví dụ này là Pet đối tượng, được nhóm lại thành một bộ sưu tập. Cuối cùng, chức năng kết quả chọn tạo ra một loại giấu tên cho mỗi trận đấu mà bao gồm Person.FirstName và một bộ sưu tập của các đối tượng Pet.

class Person
{
        public string FirstName { get; set; }
        public string LastName { get; set; }
}

class Pet
{
        public string Name { get; set; }
        public Person Owner { get; set; }
}

///
/// This example performs a grouped join.
///
public static void GroupJoinExample()
{
        Person magnus = new Person { FirstName = "Magnus", LastName = "Hedlund" };
        Person terry = new Person { FirstName = "Terry", LastName = "Adams" };
        Person charlotte = new Person { FirstName = "Charlotte", LastName = "Weiss" };
        Person arlene = new Person { FirstName = "Arlene", LastName = "Huff" };

        Pet barley = new Pet { Name = "Barley", Owner = terry };
        Pet boots = new Pet { Name = "Boots", Owner = terry };
        Pet whiskers = new Pet { Name = "Whiskers", Owner = charlotte };
        Pet bluemoon = new Pet { Name = "Blue Moon", Owner = terry };
        Pet daisy = new Pet { Name = "Daisy", Owner = magnus };

        // Create two lists.
        List people = new List { magnus, terry, charlotte, arlene };
        List pets = new List { barley, boots, whiskers, bluemoon, daisy };

        // Create a list where each element is an anonymous type
        // that contains the person's first name and a collection of
        // pets that are owned by them.
        var query = from person in people
                 join pet in pets on person equals pet.Owner into gj
                 select new { OwnerName = person.FirstName, Pets = gj };

        foreach (var v in query)
        {
               // Output the owner's name.
              Console.WriteLine("{0}:", v.OwnerName);
              // Output each of the owner's pet's names.
              foreach (Pet pet in v.Pets)
                    Console.WriteLine(" {0}", pet.Name);
        }
}
Group join rất lý tưởng cho việc tạo ra XML bằng cách sử dụng LINQ to XML. Ví dụ sau là tương tự như ví dụ trước, ngoại trừ thay vì tạo ra các loại giấu tên, chức năng chọn kết quả tạo ra các phần tử XML mà đại diện cho các đối tượng tham gia.

Bạn chỉ cần thay đổi dòng dưới cho ví dụ ở trên.

// Create XML to display the hierarchical organization of people and their pets.
XElement ownersAndPets = new XElement("PetOwners",
       from person in people join pet in pets on person equals pet.Owner into gj
                select new XElement("Person",
                        new XAttribute("FirstName", person.FirstName),
                        new XAttribute("LastName", person.LastName),
                        from subpet in gj
                            select new XElement("Pet", subpet.Name)));


Console.WriteLine(ownersAndPets);

DangTrung.

Thứ Bảy, 14 tháng 2, 2009

Làm thế nào nhóm Kết quả của contiguous keys

Ví dụ sau đây cho thấy làm thế nào để các nguyên tố nhóm thành nhiều phần đại diện cho subsequences của các contiguous keys. Ví dụ, giả sử rằng bạn có các trình tự sau đây của các cặp khóa có giá trị:
  • Key : A, A, A, B, C, A, B, B
  • Value : We, think, that, Linq, is, really, cool, !

Các nhóm sau đây sẽ được tạo ra theo thứ tự này:
  1. We, think, that
  2. Linq
  3. is
  4. really
  5. cool, !
Giải pháp này được thực hiện như là một phương pháp mở rộng đó là thread an toàn và trả về kết quả của nó một cách trực tuyến. Nói cách khác, nó tạo ra nhóm của nó khi nó di chuyển qua các dãy nguồn. Không giống như các nhà điều hành nhóm hay orderby, nó có thể bắt đầu trở lại nhóm người gọi trước khi tất cả các trình tự đã được đọc.

Chủ đề an toàn được thực hiện bằng cách làm một bản sao của từng nhóm hoặc từng đoạn theo trình tự được lặp lại nguồn, như được giải thích trong các ý kiến mã nguồn. Nếu dãy nguồn có một chuỗi lớn các mục liên tiếp, ngôn ngữ chung có thể bỏ một OutOfMemoryException.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ChunkIt
{
      // Static class to contain the extension methods.
      public static class MyExtensions
      {
              public static IEnumerable> ChunkBy(this  
                         IEnumerable source, Func keySelector)
              {
                      return source.ChunkBy(keySelector, EqualityComparer.Default);
              }

              public static IEnumerable> ChunkBy(this 
                         IEnumerable source, Func keySelector, 
                         IEqualityComparer comparer)
             {
                        // Flag to signal end of source sequence.
                        const bool noMoreSourceElements = true;

                        // Auto-generated iterator for the source array.
                        var enumerator = source.GetEnumerator();

                        // Move to the first element in the source sequence.
                        if (!enumerator.MoveNext()) yield break;

                        Chunk current = null;
                        while (true)
                        {
                               // Get the key for the current Chunk. The source iterator will churn through
                               // the source sequence until it finds an element with a key that doesn't match.
                               var key = keySelector(enumerator.Current);

                               // Make a new Chunk (group) object that initially has one 
                               // GroupItem, which is a copy of the current source element.
                               current = new Chunk(key, enumerator, value => 
                                               comparer.Equals(key, keySelector(value)));                              
                               yield return current;
                               if (current.CopyAllChunkElements() == noMoreSourceElements)
                               {
                                        yield break;
                               }
                       }
               }

               class Chunk : IGrouping
               {                       
                       // has a reference to the next ChunkItem in the list.
                       class ChunkItem
                       {
                                public ChunkItem(TSource value)
                                {
                                         Value = value;
                                }
                                public readonly TSource Value;
                                public ChunkItem Next = null;
                       }
                       // The value that is used to determine matching elements
                       private readonly TKey key;

                       // Stores a reference to the enumerator for the source sequence
                       private IEnumerator enumerator;

                       // A reference to the predicate that is used to compare keys.
                       private Func predicate;

                      // Stores the contents of the first source element that belongs with this chunk.
                      private readonly ChunkItem head;

                     // End of the list. It is repositioned each time a new. ChunkItem is added.
                     private ChunkItem tail;

                     // Flag to indicate the source iterator has reached the end of the source sequence.
                     internal bool isLastSourceElement = false;

                     // Private object for thread syncronization
                     private object m_Lock;

                    // REQUIRES: enumerator != null && predicate != null
                    public Chunk(TKey key, IEnumerator enumerator, 
                            Func predicate)
                    {
                            this.key = key;
                            this.enumerator = enumerator;
                            this.predicate = predicate;

                            // A Chunk always contains at least one element.
                            head = new ChunkItem(enumerator.Current);

                           // The end and beginning are the same until the list contains > 1 elements.
                           tail = head;

                           m_Lock = new object();
                    }

                   // Indicates that all chunk elements have been copied to the list of ChunkItems,
                   // and the source enumerator is either at the end, or else on an element with a new key.
                   // the tail of the linked list is set to null in the CopyNextChunkElement method if the
                  // key of the next element does not match the current chunk's key, or there are no more  
                  // elements in the source.
                  private bool DoneCopyingChunk { get { return tail == null; } }

                 // Adds one ChunkItem to the current group 
                 // REQUIRES: !DoneCopyingChunk && lock(this)
                 private void CopyNextChunkElement()
                 {
                         // Try to advance the iterator on the source sequence.
                         // If MoveNext returns false we are at the end, 
                         // and isLastSourceElement is set to true
                         isLastSourceElement = !enumerator.MoveNext();

                         // If we are (a) at the end of the source, or (b) at the end of the current chunk
                         // then null out the enumerator and predicate for reuse with the next chunk.
                         if (isLastSourceElement || !predicate(enumerator.Current))
                         {
                                 enumerator = null;
                                 predicate = null;
                         }
                         else
                         {
                                  tail.Next = new ChunkItem(enumerator.Current);
                         }

                        // tail will be null if we are at the end of the chunk elements
                        // This check is made in DoneCopyingChunk.
                        tail = tail.Next;
               }
               internal bool CopyAllChunkElements()
               {
                       while (true)
               {
               lock (m_Lock)
               {
                     if (DoneCopyingChunk)
                     {
                              // If isLastSourceElement is false,  it signals to the 
                              // outer iterator  to continue iterating.
                              return isLastSourceElement;
                     }
                     else
                     {
                             CopyNextChunkElement();
                      }
              }
       }
}


public TKey Key { get { return key; } }

// Invoked by the inner foreach loop. This method stays just one step ahead
// of the client requests. It adds the next element of the chunk only after
// the clients requests the last element in the list so far.
public IEnumerator GetEnumerator()
{
         //Specify the initial element to enumerate.
         ChunkItem current = head;

         // There should always be at least one ChunkItem in a Chunk.
               while (current != null)
              {
                       // Yield the current item in the list.
                       yield return current.Value;

                       // Copy the next item from the source sequence,
                       // if we are at the end of our local list.
                       lock (m_Lock)
                       {
                              if (current == tail)
                              {
                                      CopyNextChunkElement();
                              }
                       }
                       // Move to the next ChunkItem in the list.
                       current = current.Next;
                 }
           }

           System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
           {
                  return GetEnumerator();
           }
      }
}

       // A simple named type is used for easier viewing in the debugger. Anonymous types
       // work just as well with the ChunkBy operator.
       public class KeyValPair
       {
              public string Key { get; set; }
              public string Value { get; set; }
       }

       class Program
       {
              // The source sequence.
              public static IEnumerable list;

              // Query variable declared as class member to be available
              // on different threads.
              static IEnumerable> query;

              static void Main(string[] args)
              {
                    // Initialize the source sequence with an array initializer.
                    list = new[]
                    {
                          new KeyValPair{ Key = "A", Value = "We" },
                          new KeyValPair{ Key = "A", Value = "Think" },
                          new KeyValPair{ Key = "A", Value = "That" },
                          new KeyValPair{ Key = "B", Value = "Linq" },
                          new KeyValPair{ Key = "C", Value = "Is" },
                          new KeyValPair{ Key = "A", Value = "Really" },
                          new KeyValPair{ Key = "B", Value = "Cool" },
                          new KeyValPair{ Key = "B", Value = "!" }
                    };
                    // Create the query by using our user-defined query operator.
                    query = list.ChunkBy(p => p.Key);
                    // ChunkBy returns IGrouping objects, therefore a nested
                    // foreach loop is required to access the elements in each "chunk".
                    foreach (var item in query)
                    {
                          Console.WriteLine("Group key = {0}", item.Key);
                          foreach (var inner in item)
                          {
                                 Console.WriteLine("\t{0}", inner.Value);
                          }
                    }
                    Console.WriteLine("Press any key to exit");
                    Console.ReadKey();
              } 
       }
}

Để sử dụng Methos mở rộng trong dự án của bạn, sao chép các MyExtensions class Static vào một tập tin mã nguồn mới hoặc hiện tại và nếu nó là cần thiết, thêm một chỉ thị bằng cách sử dụng cho các namespace nơi mà nó được đặt.

 DangTrung.

Sử dụng method val() trong JQuery

Làm thế nào nhận giá trị hiện tại của phần tử đầu tiên trong tập hợp của các phần tử xuất hiện.

Các method .val() này chủ yếu được sử dụng để có được các giá trị của các phần tử form. Trong trường hợp các phần tử trong method .val(). trả về một mảng chứa mỗi tùy chọn được chọn.

Với selects and checkboxes, bạn cũng có thể sử dụng :selected và :checked để có được giá trị, ví dụ:

$('select.foo option:selected').val(); // get the value from a dropdown select
$('select.foo').val(); // get the value from a dropdown select even easier
$('input:checkbox:checked').val(); // get the value from a checked checkbox
$('input:radio[name=bar]:checked').val(); // get the value from a set of radio buttons

Ví dụ: Nhận giá trị duy nhất từ một select duy nhất và một mảng các giá trị từ nhiều select và hiển thị các giá trị của họ.

   

   
   
   

Ví dụ: Tìm các giá trị của một hộp nhập liệu.

      
      

      

Ví dụ: Thiết lập giá trị của một hộp nhập liệu.

   
        
        
        
   
   
   

Ví dụ: Sử dụng các đối số chức năng để sửa đổi các giá trị của một hộp nhập liệu.

     

Type something and then click or tab out of the input.

     
     

DangTrung.