मेरे पास यह कार्य है:

public hideOtherQuestions() {
    const questionContainers = document.getElementsByClassName('question-container');

    let questionContainer: Element;
    for (let questionContainer in questionContainers) {
        if (!questionContainer.classList.contains('visible')) {
            document.getElementsByClassName('question-container')[0].setAttribute('style', 'display: none');
        }
    }
}

questionsContainer तत्वों का एक HTMLCollection है। for loop में let questionContainer को string के रूप में परिभाषित किया गया है।

उसके कारण मुझे if कथन के लिए त्रुटि मिलती है कि .classList string पर मौजूद नहीं है

मैं लूप के लिए let के प्रकार को string से Element में कैसे बदलूं?

0
Peter Boomsma 17 अप्रैल 2018, 23:42

2 जवाब

सबसे बढ़िया उत्तर

आप in के बजाय of का उपयोग करना चाहते हैं।

  • in key को संदर्भित करता है जो एक स्ट्रिंग है
  • of value को संदर्भित करता है जो आपकी वस्तु है

तो, निम्नलिखित कदम उठाकर:

  1. अपने संग्रह को Array.from() में लपेटें
  2. अपने for को in से of में बदलें

तब आपको वह परिणाम प्राप्त करना चाहिए जिसकी आप अपेक्षा कर रहे थे

public hideOtherQuestions() {
    const questionContainers = Array.from(document.getElementsByClassName('question-container'));

    let questionContainer: Element;
    for (let questionContainer of questionContainers) {
        if (!questionContainer.classList.contains('visible')) {
            document.getElementsByClassName('question-container')[0].setAttribute('style', 'display: none');
        }
    }
}

अन्यथा आप वैल को लूप में इस तरह सेट करना चाहेंगे:

for (let key in questionContainers) {
  let questionContainer = questionContainers[key]
}
4
Get Off My Lawn 18 अप्रैल 2018, 00:03

in कीवर्ड जब लूप में इस तरह उपयोग किया जाता है, तो आप उस ऑब्जेक्ट की कुंजियों को निकालेंगे, जिन पर आप पुनरावृति कर रहे हैं, मानों को नहीं। किसी वस्तु की कुंजियाँ तार होती हैं, इसलिए उस त्रुटि को इंगित करने में टाइपप्रति सही है।

चूंकि यह एक HTMLCollection है, और उचित सरणी नहीं है, आप for/of लूप का भी उपयोग नहीं कर सकते। तो आप पुराने जमाने के इंडेक्स लूप के साथ फंस जाएंगे:

for (let i = 0; i < questionContainers.length; i++) {
    const questionContainer = questionContainers.item(i)
    if (!questionContainer.classList.contains('visible')) {
        document.getElementsByClassName('question-container')[0].setAttribute('style', 'display: none');
    }
}

या, यदि आप for/of लूप का उपयोग करना चाहते हैं, तो आप संग्रह को वास्तविक सरणी में बदलने के लिए Array.from विधि का उपयोग करने में सक्षम हो सकते हैं:

for (let questionContainer of Array.from(questionContainers)) {
    if (!questionContainer.classList.contains('visible')) {
        document.getElementsByClassName('question-container')[0].setAttribute('style', 'display: none');
    }
}
1
CRice 17 अप्रैल 2018, 23:47