2012-03-31 38 views
18

tôi thấy regex sau đây từ một câu hỏi Stack Overflow: Change an element's class with JavaScriptRemove classname từ phần tử với javascript

Và đã sử dụng nó trong một phần của kịch bản của tôi với thành công, tuy nhiên trong một nó có vẻ là không.

Tôi ném cùng một trường hợp thử nghiệm rất nhỏ gọn trên jsFiddle, và nó cũng là thất bại:

http://jsfiddle.net/ew47Y/1/

HTML:

<div class="foo" id="foo"> 
    hello 
</div>​ 

JS:

$(document).ready(function(){ 
    foo = document.getElementById('foo'); 
    foo.className += ' bar foobar'; 
    alert(foo.className); 
    foo.className.replace(/(?:^|\s)bar(?!\S)/ , '') 
    alert(foo.className); 
})​ 
+0

Tôi bối rối bởi sự hỗn hợp của jQuery và phi jQuery để làm jQuery điều đơn giản –

+1

Tôi đang viết một thư viện và tôi thấy nó xấu thực hành để làm một thư viện yêu cầu khác. –

+0

hãy kiểm tra câu trả lời này [Xóa và thêm lớp css bằng javascript] (http://stackoverflow.com/a/33434902/2466310) – thejustv

Trả lời

38

Đó là bởi vì replace không thực sự sửa đổi chuỗi bạn gọi nó; thay vào đó, nó trả về một chuỗi mới. Vì vậy:

 foo.className = foo.className.replace(/(?:^|\s)bar(?!\S)/ , '') 

(Bằng cách này, bạn không thực sự cần phải làm điều này trong nguyên JavaScript, kể từ khi đối tượng jQuery cung cấp một phương pháp removeClass:. http://api.jquery.com/removeClass/ Vì vậy, bạn có thể viết:

 $('#foo').removeClass('bar'); 

hoặc :

 $(foo).removeClass('bar'); 

)

+15

Chức năng JS thuần túy: 'function removeClass (e, c) {e.className = e.className .replace (mới RegExp ('(?:^| \\ s)' + c + '(?!\\ S) '),' ');} ' – pppglowacki

+0

Nếu bạn muốn xóa tất cả các lần xuất hiện của tên lớp, hãy sử dụng công cụ sửa đổi [' g'] (http://www.w3schools.com/jsref/jsref_regexp_g.asp) ở cuối biểu thức chính quy, như thế này: 'foo.className.replace (/ (^ | \ s) thanh (?! \ S)/g, '')'. Nhân tiện, việc sử dụng [nhóm không chụp] (http://www.regular-expressions.info/refadv.html) '(? :)' không cần thiết ở đây. – Adam

+1

Lưu ý rằng việc sử dụng [metacharacter word word '\ b'] (http://www.regular-expressions.info/wordboundaries.html), như:' foo.className.replace (/ \ bbar \ b/g , '') ', không phù hợp ở đây, vì ranh giới từ cũng xuất hiện giữa ký tự từ' [A-Za-z0-9_] 'và ký tự gạch ngang' -'. Do đó, một tên lớp, ví dụ: * 'khác nhau-bar-class' * cũng sẽ được thay thế dẫn đến * 'khác nhau - lớp' *. Tuy nhiên, trái ngược với các giải pháp trên, giải pháp "' \ b' "không loại bỏ ký tự khoảng trống' \ s' trước tên lớp, do đó, một chuỗi, ví dụ: * 'thanh đầu tiên' * sẽ kết thúc dưới dạng * 'firstbar' *. – Adam

6
foo.className = foo.className.replace(/(?:^|\s)bar(?!\S)/ , ''); 

hoặc với jQuery (mà bạn đang sử dụng):

foo.removeClass('bar'); 
1

Ngoài ra còn có một giải pháp mà sử dụng word boundary metacharacter \b:

foo.className.replace(/\bbar\b/g ,''); 

này có thể phù hợp với ai đó, nhưng lưu ý ranh giới từ xảy ra cũng giữa một ký tự từ [A-Za-z0-9_] và dấu gạch ngang - ký tự. Do đó, một tên lớp, ví dụ: 'khác nhau-bar-class' cũng sẽ được thay thế dẫn đến 'khác nhau - lớp'. Tuy nhiên, trái ngược với các giải pháp trên, giải pháp "\b" không xóa ký tự khoảng trắng \s trước tên lớp, có thể được mong muốn, vì vậy, ví dụ: 'thanh đầu tiên' sẽ kết thúc dưới dạng 'firstbar'.

19

Đừng quên khoảng classList.

el.classList.remove('boop');

http://jsfiddle.net/yXQL3/

+2

không hoạt động (chỉ) trên IE 8, 9 và Opera Mini 8 http://caniuse.com/#feat=classlist – maciek

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