2012-08-31 27 views
6

Tôi đang sử dụng một bộ chọn jQuery để kiểm tra các nhân vật trong href:jquery selector chứa dấu bằng

var param = "something"; 
$("a[href*="+param+"]").css("color", "red"); 

này hoạt động tốt cho đến khi "cái gì đó" có chứa một dấu =. Ví dụ:

var param = "xkey=123"; 
$("a[href*="+param+"]").css("color", "red"); 

thì tôi không nhận được kết quả. Bất cứ ai biết một giải pháp?

Trả lời

6

Bạn cần phải thoát khỏi ký tự = vì nó có ý nghĩa đặc biệt khi được sử dụng trong jQuery selector. Dưới đây là danh sách đầy đủ của tất cả các nhân vật mà cần phải được thoát:

#;&,.+*~':"!^$[]()=>|/ 

Vì vậy, bạn có thể sử dụng sau đây để thoát khỏi param:

param.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g,'\\$1') 

Từ jQuery documentation:

Nếu bạn muốn sử dụng bất kỳ ký tự meta nào (chẳng hạn như ! "# $% & '() * +,./:; < =>? @ [] ^` {|} ~) Như một phần chữ của một cái tên, bạn phải thoát khỏi ký tự bằng hai dấu gạch chéo ngược: \.

Đây là DEMO.

+0

Điều đó cũng hoạt động! Cảm ơn –

3

Trích dẫn các tham số:

$("a[href*='"+param+"']") 

Và nếu đó là không đủ (param có thể chứa dấu nháy) sau đó thoát họ:

$("a[href*='"+param.replace(/'/g,"\\'")+"']") 
+0

+1 cho giải pháp đơn giản nhất mà tôi nghi ngờ xử lý bất kỳ thông số nào có thể có. –

+0

Tuyệt vời - chính xác những gì tôi cần. Cảm ơn bạn –

0

Đó là hành xử theo cách đó bởi vì, cuối cùng nó sẽ dịch đến bộ chọn mơ hồ tức là $("a[href*=xkey=123]") mà thực sự không hợp lệ.

thoát dấu bằng với \\ trước mặt và quấn phần tham số với một báo

var param = "xkey\\=123"; 
$("a[href*='"+param+"']").css("color", "red"); 
+0

Trong trường hợp đơn giản này, một hoặc cái kia (trích dẫn tham số hoặc thoát '=') sẽ hoạt động. –

+0

Có, Không cần phải phân tích cú pháp 'param' cho tất cả các ký hiệu. Đó là một trường hợp đơn giản và nên được giữ càng đơn giản càng tốt. – Starx

+0

Thêm dấu ngoặc kép giải quyết được sự cố mà không cần phân tích cú pháp nhưng cảm ơn đề xuất –

0

Bạn có thể xác nhận nó như thế này:

Hy vọng nó phù hợp với các nguyên nhân :)

foo - là chuỗi;

if (! /^[a-zA-Z0-9]+$/.test(foo)) { 
    // Validation failed 
} 

HOẶC

thoát nó như việc kiểm tra này:

if(your_string.indexOf('=') != -1){ 
    alert("equal found."); 
} 

sau đó thay thế = với \\=

2

Bạn cần phải thoát khỏi = với \\=.

param = param.replace(/=/g, '\\\\='); 

Nhưng có các ký tự đặc biệt khác mà bạn cũng cần phải thoát trong bộ chọn jQuery.

function escape(param) { 
    return param.replace(/([ #;&,.+*~\':"!^$[\]()=>|\/@])/g,'\\\\$1'); 
} 

Bạn cũng có thể sử dụng phương thức .filter.

$('a').filter(function() { 
    return $(this).attr('href').indexOf(param) !== -1; 
}) 
Các vấn đề liên quan