IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Uncaught TypeError: document.getElementById() is null


Sujet :

JavaScript

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 23
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2024
    Messages : 3
    Points : 4
    Points
    4
    Par défaut Uncaught TypeError: document.getElementById() is null
    Salut les Geeks j'espère que vous allez bien jai un souci svp je ne comprend pas pourquoi le navigateur ma dit que parseFloat(document.getElementById(idLigne).querySelector(".n1").value); is null

    voici le code html :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="utf-8">
    <title>My_page_Test</title>
    <script src ="Test.js"></script>
    </head>
     
    <body>
     
     
    <table>
    <tr id="Ligne1">
    <td>n1<input type="text" onkeyup="cal('Ligne1')" size="3" class="n1"/></td>
    <td>n2<input type="text" onkeyup="cal('Ligne1')" size="4" class="n2"/></td>
    <td>Somme<span id="n1D"><input type="text" size="4" class="somme"/></span></td>
    </tr>
     
    </table>
     
    </body>
    <button type="button" onclick="add()" >Add</button>
     
    </html>


    et voici le javascript :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    function cal(idLigne){
     
    let n1 = parseFloat(document.getElementById(idLigne).querySelector(".n1").value);
    let n2 = parseFloat(document.getElementById(idLigne).querySelector(".n2").value);
    let somme = document.getElementById(idLigne).querySelector(".somme").value = (n1+n2);
     
    return(somme);
     
    }
     
    function add(){
    let Leprincipal = document.getElementById("n1D");
    Leprincipal.insertAdjacentHTML("afterend", NewLigne());
    // apllique le fontion cal a toutes lignes
     
    let lignes = document.querySelectorAll("tr[id='idLigne']");
    lignes.forEach((ligne) => {
    let n1Input = ligne.querySelector(".n1");
    let n2Input = ligne.querySelector(".n2");
    n1Input.addEventListener("input", function() {
    cal(ligne.id);
    });
    n2Input.addEventListener("input", function() {
    cal(ligne.id);
    });
    });
     
    }
    function NewLigne(){
    let NewLign =
    `<tr id="idLigne">
    <td>n1<input type="text" onkeyup="cal('idLigne')" size="3" class="n1"/></td>
    <td>n2<input type="text" onkeyup="cal('idLigne')" size="4" class="n2"/></td>
    <td>Somme<input type="text" size="4" class="somme"/></td>
    </tr>`;
    return(NewLign);
     
    }

  2. #2
    Expert confirmé
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 452
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 452
    Points : 4 601
    Points
    4 601
    Par défaut
    le HTML est "lu" de haut en bas.. a ce moment, il tombe sur le fichier "test.js" => qu'il execute directement.
    ce script fait appel a des elements du DOM ... qui... du coup, n'existent pas encore (d'ou ton erreur)
    puis le HTML poursuit la lecture du fichier, et tombe "enfin" sur les elements du DOM a creer/afficher

    => 2 solutions :

    1. mettre ton fichier JS a la fin de ton body
    2. ajouter l'attribut defer a ton fichier developer.mozilla.org/fr/docs/Web/HTML/Element/script#defer
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  3. #3
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Bonjour,
    Citation Envoyé par Doksuri
    le HTML est "lu" de haut en bas.. a ce moment, il tombe sur le fichier "test.js" => qu'il execute directement.
    Le mal est plus profond

    Avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    let Leprincipal = document.getElementById("n1D");
    Leprincipal.insertAdjacentHTML("afterend", NewLigne());
    ... l'élément <tr> est ajouté àprès l'élément <span>, en conséquence cela n'ayant aucun sens seuls les <input> sont ajoutés et non la <tr id="idLigne">.

    Ceci étant une ID doit être unique dans la page ce qui ne serait pas le cas si l'ajout se faisait correctement.

    On devrait trouver plutôt quelque chose comme en prenant soin de ne pas mettre d'ID qui de toute manière est inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function add(){
      const elemDest = document.querySelector("table");
      elemDest.tBodies[0].insertAdjacentHTML("beforeend", NewLigne());
    }
    ... et c'est tout, inutile d'ajouter des événements qui sont déjà ajoutés inline !

    Voilà pour un début de correction.

  4. #4
    Membre averti Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte passionné

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Points : 408
    Points
    408
    Par défaut
    Une méthode pour le calcul des champs.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    <body>
     
            <table>
                <tr>
                    <td>n1 <input type="text" size="3" class="input-a" /></td>
                    <td>n2 <input type="text" size="4" class="input-b" /></td>
                    <td>Somme <input type="text" size="4" class="somme" value="0" /></td>
                </tr>
                <tr>
                    <td>n1 <input type="text" size="3" class="input-a" /></td>
                    <td>n2 <input type="text" size="4" class="input-b" /></td>
                    <td>Somme <input type="text" size="4" class="somme" value="0" /></td>
                </tr>
                <tr>
                    <td>n1 <input type="text" size="3" class="input-a" /></td>
                    <td>n2 <input type="text" size="4" class="input-b" /></td>
                    <td>Somme <input type="text" size="4" class="somme" /></td>
                </tr>
     
            </table>
     
     
        <script>
            let inputS = document.querySelectorAll('.input-a, .input-b')
     
            inputS.forEach((inpuSelect) => { //On boucle les balises input class "input-a" & "input-b"
                inpuSelect.addEventListener('keyup', () => {
                    let ligneTR = inpuSelect.closest('TR'), // Balise parent -> "<tr>"
                        inputA = parseInt(ligneTR.children[0].children[0].value), // Parent -> <input> class "input-a"
                        inputB = parseInt(ligneTR.children[1].children[0].value), // Parent -> <input> class "input-b"
                        inputResult = ligneTR.children[2].children[0] // Parent -> <input> class "somme"
     
                    if (isNaN(inputA)) inputA = '' // Si NaN
                    if (isNaN(inputB)) inputB = ''
     
                    inputResult.value = inputA + inputB
                })
     
            })
        </script>
    </body>

  5. #5
    Modérateur

    Avatar de NoSmoking
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    16 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 16 959
    Points : 44 122
    Points
    44 122
    Par défaut
    Une méthode pour le calcul des champs.
    tu oublies que la <table> est dynamique donc des lignes sont susceptibles d'être ajoutées.

    Une « façon élégante » serait d'utiliser la délégation et là il y aurait également plusieurs méthodes.

  6. #6
    Membre averti Avatar de ASCIIDEFOND
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2002
    Messages
    220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Autodidacte passionné

    Informations forums :
    Inscription : Novembre 2002
    Messages : 220
    Points : 408
    Points
    408
    Par défaut
    Citation Envoyé par NoSmoking Voir le message
    tu oublies que la <table> est dynamique donc des lignes sont susceptibles d'être ajoutées...
    Oui, effectivement.

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    <!DOCTYPE html>
    <html lang="en">
     
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
     
    <body>
     
        <table>
            <tr>
                <td>n1 <input type="text" size="4" class="input-A" /></td>
                <td>n2 <input type="text" size="4" class="input-B" /></td>
                <td>Somme <input type="text" size="4" class="somme" value="0" /></td>
            </tr>
            <tr>
                <td>n1 <input type="text" size="4" class="input-A" /></td>
                <td>n2 <input type="text" size="4" class="input-B" /></td>
                <td>Somme <input type="text" size="4" class="somme" value="0" /></td>
            </tr>
            <tr>
                <td>n1 <input type="text" size="4" class="input-A" /></td>
                <td>n2 <input type="text" size="4" class="input-B" /></td>
                <td>Somme <input type="text" size="4" class="somme" /></td>
            </tr>
     
        </table>
     
        <button style="width: 220px; height: 25px;margin: 20px; cursor: pointer;" onclick="ajoutLigne()">Ajouter</button>
     
        <script>
            var table = document.getElementsByTagName('table')[0], nomClass = ["input-A", "input-B", "somme"]
     
            function ajoutLigne() {
                let tr, td, tdText, tdInput, attributs, texteTd = ["n1 ", "n2 ", "Somme "]
     
                for (var i = 0; i < 3; i++) {
                    tr = document.createElement('tr')
                    for (var ii = 0; ii < 3; ii++) {
                        td = document.createElement('td')
                        tdText = document.createTextNode(texteTd[ii])
                        td.appendChild(tdText)
                        tr.appendChild(td)
     
                        attributs = {
                            type: 'text',
                            class: nomClass[ii],
                            size: '4'
                        }
                        tdInput = document.createElement('input')
     
                        Object.keys(attributs).forEach(attr => {
                            tdInput.setAttribute(attr, attributs[attr]);
                        })
     
                        td.appendChild(tdInput)
                    }
                    table.appendChild(tr)
                }
            }
     
            table.addEventListener('keyup', (event) => {
                let inputSelect = event.target.closest(`.${nomClass[0]}, .${nomClass[1]}`)
     
                if (!inputSelect) return
     
                let ligneTR = inputSelect.closest('tr'),
                    inputs = ['inputA', 'inputB']
     
                for (i = 0; i < 2; i++) {
                    inputs[i] = parseInt(ligneTR.children[i].children[0].value)
                    if (isNaN(inputs[i])) inputs[i] = ''
                }
     
                ligneTR.children[2].children[0].value = inputs[0] + inputs[1]
            })
     
        </script>
    </body>
     
    </html>

Discussions similaires

  1. ERREUR Uncaught TypeError: document.querySelector() is null SOUS MOZILLA
    Par svan1812 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 14/10/2020, 18h49
  2. TypeError: document.getElementById() is null
    Par aliounekanoute dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/02/2019, 16h18
  3. document.getElementById retourne null
    Par gabdeschenes dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 31/10/2009, 08h45
  4. [DOM] document.getElementById is null
    Par camyo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 11/06/2009, 07h24
  5. La fonction document.getElementById retourne NULL
    Par zaineb.z dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 14/05/2008, 18h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo