QuerySelector'ı sayı olan kimliklerle kullanma


101

Anladığım kadarıyla HTML5 spesifikasyonu bunun gibi numaralar olan kimlikleri kullanmanıza izin veriyor.

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

Bunlara iyi kullanarak erişebilirim getElementByIdama ile erişemiyorum querySelector. Aşağıdakileri yapmayı denersem , konsolda SyntaxError: DOM Exception 12 alıyorum .

document.querySelector("#1")

querySelectorHTML5 spesifikasyonu bunların geçerli olduğunu söylediği halde neden kimlik olarak sayıların kullanılmasının işe yaramadığını merak ediyorum . Birden çok tarayıcı denedim.


1
HTML5 spesifikasyonunun geçerli olduklarını söylediğini sanmıyorum. Tekrar kontrol edeceğim ...
beautifulcoder

3
@beautifulcoder Bunlar geçerlidir
dsgriffin

1
Nevermind, validator.w3.org/check'e göre sayıları kullanmak geçerlidir. Belki modern tarayıcılar standardı tam olarak uygulamamıştır?
beautifulcoder

Yanıtlar:


114

Bu geçerlidir, ancak bazı özel işlem gerektirir. Buradan: http://mathiasbynens.be/notes/css-escapes

Baştaki rakamlar

Bir tanımlayıcının ilk karakteri sayısal ise, Unicode kod noktasına göre ondan çıkmanız gerekir. Örneğin, 1 karakteri için kod noktası U + 0031'dir, bu nedenle \ 000031 veya \ 31 olarak kaçabilirsiniz.

Temel olarak, herhangi bir sayısal karakterden kaçınmak için, sadece \ 3 önekini ve bir boşluk karakteri () ekleyin. Yaşasın Unicode!

Yani kodunuz şu şekilde biter (önce CSS, JS saniye):

#\31  {
    background: hotpink;
}

document.getElementById('1');
document.querySelector('#\\31 ');

9'dan büyük değerler için sözdizimi ne olur? Bunu 10 gibi kimliklerle çalıştıramıyorum.
Berry Blue

5
İlk karakterden sonra bir boşluk #\\31 0bırakmanız gerekir: - mothereffingcssescapes.com'a başvurabilirsiniz
Dennis

Takip ve bağlantı için teşekkür ederiz!
Berry Blue

1
Boşluğun, yalnızca onaltılık rakam olan bir karakter çıkış sırasından hemen sonra, bu karakteri çıkış dizisinden ayırmak için gerekli olduğuna dikkat edin. Daha fazla ayrıntı için w3.org/TR/CSS21/syndata.html#characters adresine bakın.
BoltClock

87

Çünkü HTML5 spesifikasyonunda geçerli olsalar da, CSS'de geçerli değildirler, bu "sorgu seçici " anlamına gelir.

Bunun yerine, şunu yapmanız gerekir: Bu document.querySelector("[id='1']"), ona anlamlı bir kimlik message1veya benzeri bir şey verebileceğiniz düşünülürse, çok uzun bir süredir ;)


1
"Yapmak zorunda" değilsiniz - başında bir rakam olan bir id seçici kullanmanın bir yolu var. Anlamlı bir kimliğe sahip olmanın daha iyi olduğuna katılıyorum.
Dennis

9
UUID'ler bir sayıyla başlayabilir.
Alfonso Nishikawa

25

Otomatikleştirilmiş bir yaklaşıma ihtiyacım vardı. Yakın zamanda yapılan bir değişiklik, kullanılan kimlik değerlerinin artık basit alfabetik karakterler olmadığı ve sayılar ve özel karakterler içerdiği anlamına geliyordu.

Sonunda şunu kullandım CSS.escape: https://developer.mozilla.org/en-US/docs/Web/API/CSS/escape

console.log(CSS.escape('1'));

İlk olarak, başarısız durum budur:

const theId = "1";
document.querySelector(`#${theId}`);
const el = document.querySelector(`#${theId}`);
el.innerHTML = "After";
<div id="1">Before</div>

Ve şimdi kullanılıyor CSS.escape:

const theId = "1";
const el = document.querySelector(`#${CSS.escape(theId)}`);
el.innerHTML = "After";
<div id="1">Before</div>

AfterSeçicinin çalıştığını göstererek nasıl doğru şekilde değiştiğini görün !


Bugün itibariyle, kontrol etmediğiniz garip bir kimlik ile uğraşmanız gerektiğinde, bu en temiz çözümdür, çünkü bu tüm modern tarayıcılar tarafından desteklenmektedir.
LasaleFamine

Bunu üretimde kullanarak harika bir çözüm.
DöngülerGod

3

W3C belgelerinden Öznitelik seçiciler sözdizimi

Öznitelik değerleri, geçerli bir CSS tanımlayıcıları veya Dize olmalıdır.

Bu nedenle, basamağı olan basamaklar veya alfanümerik dizeler geçerli bir tanımlayıcı olarak nitelendirilmez.

Bir tanımlayıcı oluşturmak için bir kimlik üretme yardımcı programı kullanıyorsanız, baştaki rakamlara sahip alfanümerik kimliklerle karşılaşabilirsiniz.

Hızlı bir düzeltme, ya jeneratörün SEED'indeki rakamları çıkarmak (eğer değiştirilebiliyorsa) ya da üretilen kimliğe her zaman bir dize eklemek olacaktır.


2

İşte şimdi CSS seçicilerinde önde gelen numara kimlikleri ile uğraşmak için yaptığım bir işlev ve CSS.escape olmadığı gibi IE güvenli.

Seçiciyi kullanmadan önce bu cleanSelector işlevinden geçirin:

var cleanSelector = function(selector){
    (selector.match(/(#[0-9][^\s:,]*)/g) || []).forEach(function(n){
        selector = selector.replace(n, '[id="' + n.replace("#", "") + '"]');
    });
    return selector;
};

var myselector = ".dog #980sada_as div span#aside:hover div.apple#05crab:nth-of-type(2), .ginger #2_green_div, div.cupcake #darwin p#23434-346365-53453";

var clean_myselector = cleanSelector(myselector);

// print to show difference
console.log(myselector);
console.log(clean_myselector);

//use the new selector like normal
var elems = document.querySelectorAll( clean_myselector ); 


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.