2010-07-07 29 views
10

Đây có phải là dòngCú pháp "này" hoạt động như thế nào?

$(this).attr("id").replace("_button",""); 

tương đương với trang này?

this.attr("id").replace("_button",""); 
+2

Ngữ cảnh khác trên mã này sẽ hữu ích. Tôi đã để lại một câu trả lời nhưng tôi đã đưa ra một số giả định có thể sai dựa trên nơi mà điều này xuất phát. – spinon

Trả lời

9

kể từ this luôn chứa tham chiếu đến object of invocation, nó thực sự phụ thuộc vào trong đó bạn gọi mã đó.

Nếu bạn gọi này trong vòng một jQuery event handler, this là một tham chiếu đến DOM element chính nó, vì vậy bạn cần phải dịch nó thành một đối tượng jQuery bằng cách gọi $() trước khi bạn có thể gọi các phương thức jQuery trên đó. Điều đó có nghĩa là

this.attr("id").replace("_button",""); 

sẽ không hoạt động ở đó.

Nếu bạn đang writting một phương pháp plugin cho ví dụ, this đã một jQuery object (reference) và cả hai dòng sẽ thực sự làm như vậy. Tất nhiên, nếu this đã là jQuery object bạn làm thêm công việc, cố gắng phân tích lại lần nữa.

dụ:

$.fn.yourplugin = function(){ 
    // this refers to a jQuery object 
    return this.each(function(i,v){ 
    }); 
}); 
+0

+1 để có những suy nghĩ gần như giống nhau ở đây: p (sao chép dán: D) (và tôi thích * đối tượng yêu cầu *) –

+0

Tôi vừa mới nhận ra rằng crockford là đúng, ông đã đề cập đến một nơi nào đó mà thật khó để nói về 'điều này'. "Nếu bạn gọi đây" là rắc rối cho người đọc rồi. – jAndy

0

No. Có vẻ như bạn đang ở trong bối cảnh đóng cửa được sử dụng cho phương pháp jquery. Trong hàm, nó trỏ tới đối tượng DOM hiện tại, do đó các hàm jquery sẽ không thể thực hiện được. Đó là lý do tại sao nó được bọc bằng hàm jquery để có được đối tượng đó.

4

Tùy thuộc vào ngữ cảnh, nhưng có thể không.

Nếu bạn có một xử lý sự kiện, nói:

$('#_button_foo').click(function() { 
    $(this).attr("id").replace("_button",""); 
}); 

Sau đó this sẽ đề cập đến các yếu tố DOM trong khi $(this) tạo ra một đối tượng jQuery và cho phép bạn gọi chức năng jQuery trên đối tượng này.


Ở phía bên kia, nếu bạn phát triển một plugin và có

jQuery.fn.plugin = function() { 
    this.each(function() {...}); 
} 

sau đó this đề cập đến đối tượng jQuery bạn gọi phương thức trên.

+0

Những người downvote ít nhất có thể giải thích lý do tại sao. Cảm ơn bạn :) –

+0

+1 vì có những suy nghĩ gần như giống nhau ở đây: p – jAndy

1

Các $ (this) sẽ lần lượt đối tượng DOM vào một đối tượng jQuery, vì vậy bạn có thể sử dụng các chức năng jQuery.

Vì vậy, $(this)this không giống nhau.

2

this đề cập đến đối tượng được sử dụng. Trong phạm vi toàn cầu, nó đề cập đến window và trong phương thức gọi nó đề cập đến đối tượng mà phương thức được gọi.

Trong trường hợp của bạn this lẽ sẽ đề cập đến một yếu tố trong DOM mà được nạp với một số cơ chế jQuery khác như một sự kiện (click, hover, vv) hoặc lặp đi lặp lại trên một danh sách các yếu tố (như jQuery.each). Trong trường hợp đó, bạn chỉ nhận được phần tử DOM đó chứ không phải đối tượng jQuery với phần mở rộng của các phương thức jQuery như attr. Vì vậy, bạn cần phải biến nó thành một đối tượng jQuery bằng cách sử dụng hàm xây dựng $.

1

Trong javascript, từ khóa 'this' đề cập đến đối tượng có bối cảnh mà bạn đang ở. Vì vậy, nếu bạn đang gọi điện thoại myObj.method1(), sau đó bên trong mã method1 của, 'this' sẽ tham khảo myObj.

Trong jQuery, hầu hết các hoạt động trả về một đối tượng tập kết quả jQuery, thường được gọi là trình bao bọc jQuery. Ví dụ: công cụ chọn $("a") sẽ trả lại tập kết quả jQuery chứa tất cả các phần tử DOM <a>. $("a").get(0) sẽ quay trở lại các yếu tố neo đầu tiên DOM, $("a").get(1) sẽ trả lại neo thứ hai vv

Vì vậy $(this) đề cập đến đối tượng wrapper jQuery, và this đề cập đến phần tử DOM.

Vì vậy, để tổng hợp tất cả: $(this).get(0) sẽ giống như this.

0

this luôn đề cập đến đối tượng mà hàm hiện tại là thành viên của. Nếu hàm là toàn cầu, thường là đối tượng window, ít nhất là nếu bạn đang ở trong trình duyệt web.

$(this) thực sự là $() (hàm jQuery chính) được gọi với tham số trước this làm tham số. Nó kết thúc tốt đẹp this thành một đối tượng jquery cung cấp tất cả các phương thức jQuery. Các phương thức này không khả dụng trên chỉ this.

1

Tùy thuộc vào ngữ cảnh bạn đang sử dụng.

$(this) là đối tượng jQuery và this là đối tượng DOM.

Vì vậy, chúng không giống nhau.

Nếu bạn đang phát triển plugin jquery thì this giống với $(this).

-1

Tôi nghĩ là không.

Thay vào đó, bạn có thể sử dụng this.id.replace ("_ button", "").

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