नंबर वाले ID के साथ querySelector का उपयोग करना


94

एचटीएमएल 5 युक्ति जो मुझे समझ में आती है उससे आप उन आईडी का उपयोग कर सकते हैं जो इस तरह की संख्याएँ हैं।

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

मैं इन बारीकियों का उपयोग कर सकता हूं getElementByIdलेकिन साथ नहीं querySelector। अगर मैं निम्नलिखित करने की कोशिश करता हूं तो मुझे सिंटैक्सएर्रर मिलता है : कंसोल में डोम एक्सेप्शन 12

document.querySelector("#1")

मैं बस उत्सुक हूं कि आईडी के रूप में संख्याओं का उपयोग क्यों नहीं करता है querySelectorजब एचटीएमएल 5 युक्ति कहती है कि ये वैध हैं। मैंने कई ब्राउज़रों की कोशिश की।


1
मुझे नहीं लगता कि HTML5 कल्पना कहती है कि वे मान्य हैं। मैं चेक दोगुना कर देंगे ...
beautifulcoder

3
@beautifulcoder वे मान्य हैं
dsgriffin

1
Nevermind, validator.w3.org/check के अनुसार संख्याओं का उपयोग करना मान्य है। शायद आधुनिक ब्राउज़रों ने मानक को लागू नहीं किया है?
beautifulcoder

जवाबों:


108

यह मान्य है, लेकिन कुछ विशेष हैंडलिंग की आवश्यकता है। यहाँ से: http://mathiasbynens.be/notes/css-escapes

प्रमुख अंक

यदि किसी पहचानकर्ता का पहला वर्ण संख्यात्मक है, तो आपको इसके यूनिकोड कोड बिंदु के आधार पर बच निकलने की आवश्यकता होगी। उदाहरण के लिए, वर्ण 1 के लिए कोड बिंदु U + 0031 है, इसलिए आप इसे \ 000031 या 31 के रूप में छोड़ देंगे।

मूल रूप से, किसी भी संख्यात्मक चरित्र से बचने के लिए, बस इसे \ 3 के साथ उपसर्ग करें और अंतरिक्ष वर्ण () जोड़ें। याय यूनिकोड!

तो आपका कोड समाप्त हो जाएगा (CSS पहले, JS दूसरा):

#\31  {
    background: hotpink;
}

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

9 से अधिक के मानों के लिए वाक्यविन्यास क्या होगा? मुझे यह आईडी के साथ काम करने के लिए नहीं मिल सकता है जैसे कि 10.
बेरी ब्लू

5
आपको पहले चरित्र के बाद एक स्थान की आवश्यकता है: #\\31 0- आप mothereffingcssescapes.com
डेनिस

अनुवर्ती और लिंक के लिए धन्यवाद!
बेरी ब्लू

1
ध्यान दें कि अंतरिक्ष केवल आवश्यक है यदि एक चरित्र जो कि एक हेक्स अंक है वह तुरंत भागने के अनुक्रम का अनुसरण करता है, ताकि उस चरित्र को भागने के क्रम से अलग किया जा सके। अधिक जानकारी के लिए w3.org/TR/CSS21/syndata.html#characters देखें ।
BoltClock

83

क्योंकि जब वे HTML5 युक्ति में मान्य होते हैं, तो वे CSS में मान्य नहीं होते हैं, जो कि "क्वेरी चयनकर्ता " का अर्थ है।

इसके बजाय, आपको यह करना होगा: document.querySelector("[id='1']")जो बहुत लंबी-घुमावदार है, इस पर विचार करते हुए कि आप इसे कुछ या जैसी सार्थक आईडी दे सकते हैं message1;)


1
आपके पास "करने के लिए" नहीं है - एक अग्रणी चयन के साथ एक आईडी चयनकर्ता का उपयोग करने का एक तरीका है। मैं इस बात से सहमत हूं कि सार्थक आईडी होना बेहतर है।
डेनिस

9
UUIDs एक नंबर से शुरू हो सकते हैं।
अल्फोंसो निशिकावा

20

मुझे एक दृष्टिकोण की आवश्यकता थी जो स्वचालित था। हाल के बदलाव का मतलब था कि उपयोग किए जाने वाले आईडी मूल्य अब सरल वर्णमाला वर्ण नहीं थे और इसमें संख्या और विशेष वर्ण शामिल थे।

मैंने प्रयोग करके समाप्त किया CSS.escape: https://developer.mozilla.org/en-US/docs/Web/API/CSS/presscape

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

सबसे पहले, यह विफल मामला है:

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

और अब उपयोग कर रहे हैं CSS.escape:

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

देखें कि यह सही ढंग से कैसे बदल जाता है After, चयनकर्ता का प्रदर्शन!


आज तक, जब आपको कुछ अजीब आईडी से निपटने की आवश्यकता होती है जिसे आप नियंत्रित नहीं करते हैं, तो यह सबसे साफ समाधान है, क्योंकि यह सभी आधुनिक ब्राउज़र द्वारा समर्थित है।
लासालेफामाइन

3

W3C प्रलेखन से चयनकर्ताओं सिंटैक्स को अट्रैक्ट करें

गुण मान एक मान्य सीएसएस पहचानकर्ता या स्ट्रिंग होना चाहिए।

इस प्रकार, प्रमुख अंक वाले अंक या अल्फ़ान्यूमेरिक तार एक मान्य पहचानकर्ता के रूप में योग्य नहीं होते हैं।

यदि आप पहचानकर्ता बनाने के लिए आईडी जनरेटर उपयोगिता का उपयोग कर रहे हैं, तो आप प्रमुख अंकों के साथ अल्फा न्यूमेरिक आईडी के साथ समाप्त हो सकते हैं।

जनरेटर के SEED से (या इसे संशोधित किया जा सकता है) या तो एक स्ट्रिंग को ठीक करने के लिए एक त्वरित फिक्स होगा या हमेशा जनरेट किए गए आईडी में एक स्ट्रिंग संलग्न करेगा।


2

यहाँ एक फ़ंक्शन है जिसे मैंने अभी अभी सीएसएस चयनकर्ताओं में अग्रणी नंबर आईडी से निपटने के लिए बनाया है, और यह IE सुरक्षित है क्योंकि CSS.escape नहीं है।

उपयोग करने से पहले इस क्लीनसेलर फ़ंक्शन के माध्यम से चयनकर्ता को पास करें:

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 ); 

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.