2009-08-06 29 views
59

Tôi có một phần tử DOM với một ID tương tự như:Tìm phần tử DOM theo ID khi ID chứa dấu ngoặc vuông?

something[500] 

được xây dựng bởi Ruby on Rails ứng dụng của tôi. Tôi cần để có thể có được yếu tố này thông qua jQuery để tôi có thể đi qua con đường của tôi lên DOM để xóa cha mẹ của nó cha mẹ, trong đó có một ID biến mà tôi không có quyền truy cập trước.

Có ai biết cách tôi có thể thực hiện việc này không? Các mã sau đây dường như không có tác dụng:

alert($("#something["+id+"]").parent().parent().attr("id")); 

Sau khi kiểm tra hơn nữa, như sau:

$("#something["+id+"]") 

trả về một đối tượng, nhưng khi tôi chạy ".html()" hoặc" .text() "trên đó, kết quả luôn là null hoặc chỉ là một chuỗi rỗng.

Mọi trợ giúp sẽ được đánh giá cao.

+2

Ngoài các câu trả lời đúng (mà là bạn cần phải thoát khỏi dấu ngoặc kép với dấu gạch chéo ngược đôi), bạn thực sự nên sử dụng gần nhất() thay vì nhiều cuộc gọi cha mẹ(). Đó là sạch hơn và ít có khả năng phá vỡ nếu một cấp độ xảy ra để thay đổi ... Vì vậy, nếu bạn đang cố gắng để có được div gần nhất bạn làm .closest ('div') hoặc thậm chí tốt hơn .closest ('div.meaningfulclassthatiwant') –

+0

Cảm ơn lời đề nghị Paolo, nhưng như tôi đã đề cập, tôi không biết ID/lớp của bố mẹ tôi đang tìm kiếm trước, và vì cả hai bố mẹ đều là div, gần nhất sẽ không hoạt động. Cảm ơn mặc dù. –

+0

Ah, xin lỗi, tôi đã không đọc câu hỏi vừa nhìn vào tiêu đề và mã trong đó :) Đoán rằng phục vụ cho tôi về quyền. –

Trả lời

82

Bạn cần phải thoát khỏi các dấu ngoặc vuông để chúng không được tính là bộ chọn thuộc tính. Hãy thử điều này:

alert($("#something\\["+id+"\\]").parent().parent().attr("id")); 

See Special Characters In Selectors, đặc biệt là đoạn thứ hai:

Để sử dụng bất kỳ siêu ký tự (ví dụ như !"#$%&'()*+,./:;<=>[email protected][\]^``{|}~) như là một phần đen của một tên, nó phải được thoát ra với với hai dấu gạch chéo ngược: \\. Ví dụ: một phần tử có id="foo.bar", có thể sử dụng công cụ chọn $("#foo\\.bar"). Đặc tả CSS của W3C chứa complete set of rules regarding valid CSS selectors. Cũng hữu ích là mục blog của Mathias Bynens trên CSS character escape sequences for identifiers.

+2

giải thích ký tự đặc biệt (meta) hiện đang ở đoạn thứ hai trên trang được inidcated trong bài viết của karim79 –

+0

@KKirk - cảm ơn vì điều đó. – karim79

4

Hãy thử điều này:

alert($("#something\\["+id+"\\]").parent()[0].parent()[0].attr("id")); 
9

Dấu ngoặc vuông có ý nghĩa đặc biệt để jQuery selectors, thuộc tính lọc đặc biệt.

Chỉ cần thoát khỏi những điều này và nó sẽ tìm thấy nguyên tố của bạn tốt

$("#something\\[" + id + "\\]") 
9

Một id không thể bao gồm dấu ngoặc vuông. Đó là forbidden by the spec.

Một số trình duyệt có thể sửa lỗi và đối phó, nhưng bạn nên sửa dữ liệu thay vì cố xử lý dữ liệu xấu.

+0

Cảm ơn bạn đã liên kết đến thông số kỹ thuật. Tôi nhận ra rằng họ không phải là ID hợp lệ, nhưng Rails thêm chúng cho tiện ích trong bộ điều khiển. –

+1

Không chỉ đường ray - nhiều ứng dụng web sử dụng thủ thuật này vì nó cho phép trình xử lý biểu mẫu lặp qua một mảng, thay vì tách một số hàng tùy chọn đã được gửi. –

+0

@BryanAgee - 'id' không phải là 'tên', và hầu hết các thư viện xử lý biểu mẫu sử dụng tính để lặp qua nhiều điều khiển có cùng tên thay vì quy ước đặt tên đặc biệt hoặc bói toán. – Quentin

3

Bạn có thể thoát khỏi chúng bằng cách sử \\ hoặc bạn có thể làm một cái gì đó như thế này ...

$(document.getElementById("something[" + id + "]")) 
7

Bạn cũng có thể làm

$('[id="something['+id+']"]') 
3

"Bất cứ các meta-nhân vật

!"#$%&'()*+,./:;<=>[email protected][\]^`{|}~ 

là một phần chữ của tên, nó phải được thoát bằng hai dấu gạch chéo ngược: \\.

Ví dụ, một phần tử với id = "foo.bar", có thể sử dụng bộ chọn

$("#foo\\.bar") 

"[nguồn: jquery doc], và một phần tử với id =" foo [thanh]"(thậm chí mặc dù không hợp lệ cho W3C nhưng công nhận bởi JQuery), có thể sử dụng bộ chọn

$("#foo\\[bar\\]") 

(Chỉ cần một asnwer như nhiều người khác, nhưng tất cả cùng nhau :))

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