2015-05-11 16 views
5

Tôi tự hỏi tại sao jQuery không cho phép dấu "+". Đây là một ví dụ về cách nó hoạt động với "1" và "3" nhưng không phải với "2+". Chỉ cần di chuột qua văn bản ở trên mỗi div.jQuery với dấu cộng

<div id="div-2+"></div> 

JSFiddle

$('a.hover').mouseover(function() { 
 

 
    dataI = $(this).data('i'); 
 

 
\t $('div#div-' + dataI).addClass('h'); 
 

 
}); 
 

 
$('a.hover').mouseout(function() { 
 

 
    dataI = $(this).data('i'); 
 

 
\t $('div#div-' + dataI).removeClass('h'); 
 

 
});
a { 
 
    display: inline-block; 
 
    width: 100px; 
 
    margin: 60px 20px 60px 0; 
 
    text-align: center; 
 
} 
 

 
div { 
 
    display: inline-block; 
 
    width: 100px; 
 
    height: 100px; 
 
    margin-right: 20px; 
 
    background-color: #ddd; 
 
} 
 

 
div.h { 
 
    background-color: #f00; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<a class="hover" data-i="1">DIV 1</a> 
 

 
<a class="hover" data-i="2+">DIV 2+</a> 
 

 
<a class="hover" data-i="3">DIV 3</a> 
 

 
<br /> 
 

 
<div id="div-1"></div> 
 

 
<div id="div-2+"></div> 
 

 
<div id="div-3"></div>

+1

tôi đã không mất quá nhiều giấc ngủ trên này chưa – garryp

+1

Vui lòng mang theo mã sinh sản ở đây. Liên kết ngoài trang web không đủ. Ngoài ra, thẻ JavaScript như vậy. –

+1

Xem [Làm thế nào để tôi nhận được jQuery để chọn các phần tử có a. (dấu chấm) trong ID của họ?] (http: // stackoverflow.com/q/350292/218196) –

Trả lời

10

Hầu hết-có khả năng vì the plus sign is the adjacent CSS selector, gây ra các thư viện selector sizzle jQuery sử dụng để giả sử bạn có nghĩa là một selector liền kề.

Một cách xung quanh việc này là sử dụng công cụ chọn thuộc tính, chọn thuộc tính id. Mặc dù nhiều người sẽ tranh luận đặt một dấu cộng trong id là một ý tưởng tồi.

làm việc Ví dụ:

$('a.hover').mouseover(function() { 
 

 
    dataI = $(this).data('i'); 
 

 
\t $('div[id="div-' + dataI + '"]').addClass('h'); 
 

 
}); 
 

 
$('a.hover').mouseout(function() { 
 

 
    dataI = $(this).data('i'); 
 

 
\t $('div[id="div-' + dataI + '"]').removeClass('h'); 
 

 
});
a { 
 
    display: inline-block; 
 
    width: 100px; 
 
    margin: 60px 20px 60px 0; 
 
    text-align: center; 
 
} 
 

 
div { 
 
    display: inline-block; 
 
    width: 100px; 
 
    height: 100px; 
 
    margin-right: 20px; 
 
    background-color: #ddd; 
 
} 
 

 
div.h { 
 
    background-color: #f00; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
 
<a class="hover" data-i="1">DIV 1</a> 
 

 
<a class="hover" data-i="2+">DIV 2+</a> 
 

 
<a class="hover" data-i="3">DIV 3</a> 
 

 
<br /> 
 

 
<div id="div-1"></div> 
 

 
<div id="div-2+"></div> 
 

 
<div id="div-3"></div>

+0

Cảm ơn rất nhiều cho câu trả lời và cho "+" trong id tôi biết đó là thực hành xấu nhưng trong trường hợp của tôi đó là một cuộc thăm dò ứng dụng nơi mọi người tạo cuộc thăm dò của riêng họ với một số tùy chọn để chọn và id sẽ là phiên bản chữ thường của tùy chọn. mọi thứ diễn ra tốt đẹp cho đến khi tôi thực hiện một cuộc thăm dò yêu cầu IDE hoặc trình soạn thảo yêu thích mà tôi đặt "Notepad ++" và gặp vấn đề. Và thậm chí cả các tùy chọn khác sau khi nó đã được gửi đi từ mẫu đệ trình. Rất khó để thảo luận về điểm chính xác ở đây. – medk

2

Note, "workaround"

Hãy thử sử dụng css

a { 
 
    display: inline-block; 
 
    width: 100px; 
 
    margin: 60px 20px 60px 0; 
 
    text-align: center; 
 
} 
 

 
div { 
 
    display: inline-block; 
 
    width: 100px; 
 
    height: 100px; 
 
    margin-right: 20px; 
 
    background-color: #ddd; 
 
} 
 

 
a.hover[data-i="1"]:hover ~ div[id$="1"], 
 
a.hover[data-i="2+"]:hover ~ div[id$="2+"], 
 
a.hover[data-i="3"]:hover ~ div[id$="3"] { 
 
    background-color: #f00; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> 
 
</script> 
 
<a class="hover" data-i="1">DIV 1</a> 
 

 
<a class="hover" data-i="2+">DIV 2+</a> 
 

 
<a class="hover" data-i="3">DIV 3</a> 
 

 
<br /> 
 

 
<div id="div-1" class="hover"></div> 
 

 
<div id="div-2+" class="hover"></div> 
 

 
<div id="div-3" class="hover"></div>

1

@Alexander O'Mara thực hiện một công việc tốt đẹp để giải thích lý do tại sao nó không hoạt động và cho thấy một công việc phong nha xung quanh.

Một công việc khác xung quanh là để thoát khỏi dấu cộng bằng cách đặt trước dấu gạch chéo ngược.

dataI = dataI.replace('+', '\\+'); 

jsfiddle

Từ jQuery documentation for Selectors:

Để 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 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"). Thông số W3C CSS 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.

Cũng lưu ý rằng document.querySelector() ném lỗi sau khi được chọn #div-2+:

SyntaxError: An invalid or illegal string was specified. 

jsfiddle

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