2011-10-02 9 views
16

Jestem pewien, że to musiało zostać zadane wcześniej, ale nie może znaleźć żadnych w wyszukiwaniu. Jaki jest najszybszy sposób na usunięcie wszystkich niechronionych znaków z ciągu znaków, aby można było użyć ich w nazwie klasy CSS?Konwertuję ciąg znaków javascript na bezpieczną nazwę klasy dla css

+1

najszybciej? https://mothereff.in/css-escapes#0~!%40%24%25%5E%26%2a%28%29%5f%2B-%3D%2C.%2F%27%3B%3A% 22% 3F% 3E% 3C% 5B% 5D% 5C% 7B% 7D% 7C% 60% 23 – Mottie

Odpowiedz

30

Zamieniłbym wszystko, co nie jest małą literą lub cyfrą, a następnie dodałbym specjalny przedrostek, aby uniknąć kolizji z nazwami klas, które zostały użyte do innych celów. Na przykład, oto jeden z możliwych sposobów:

function makeSafeForCSS(name) { 
    return name.replace(/[^a-z0-9]/g, function(s) { 
     var c = s.charCodeAt(0); 
     if (c == 32) return '-'; 
     if (c >= 65 && c <= 90) return '_' + s.toLowerCase(); 
     return '__' + ('000' + c.toString(16)).slice(-4); 
    }); 
} 

// shows "prefix_c_a_p_s-numb3rs-__0024ymbols" 
alert("prefix" + makeSafeForCSS("CAPS numb3rs $ymbols")); 
10

Jeśli masz na myśli następujące symbole

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

potem po prostu wymienić je z niczym:

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

(może Dodałem dodatkowe, czy też nie na tyle, ucieczka znaki tam)

Oto quick demo.

Ale jeśli wiesz, że nie wszystkie z tych symboli są "niebezpieczne", możesz po prostu uciec od symbolu podczas kierowania na nazwę klasy (ref).

+2

Nie spowoduje to przechwycenia znaków międzynarodowych (np. À, è, ì, ò, ù, À, È, Ì, Ò , Ù). – NexusRex

+0

@NexusRex te są poprawne do użycia w nazwach klas. W rzeczywistości [właściwie wszystko jest poprawne] (https://mathiasbynens.be/notes/css-escapes), jeśli poprawnie się udało; to teraz [zawiera id w HTML5] (https://mathiasbynens.be/notes/html5-id-class). [Zobacz także tę stronę] (https://mothereff.in/css-escapes). – Mottie

0

Jeśli ktoś jest zainteresowany w sposób kawy to:

window.make_safe_for_css = (name) -> 
    name.replace /[^a-z0-9]/g, (s) -> 
     c = s.charCodeAt(0) 
     if c == 32 then return '-' 
     if c >= 65 && c <= 90 then return '_' + s.toLowerCase() 
     '__' + '000' + c.toString(16).slice -4 
2

Używam tego dla moich selektory, identyfikatory lub klas nazwami:

String.prototype.safeCSSId = function() { 
 
    return encodeURIComponent(
 
    this.toLowerCase() 
 
    ).replace(/%[0-9A-F]{2}/gi,''); 
 
}

0

z jQuery:

$.escapeSelector(stringToEscape); 
Powiązane problemy