Fehler: Fehler beim Ausführen von 'appendChild' auf 'Node': Parameter 1 ist nicht vom Typ 'Node'.


130

Ich versuche, ein Bild auf ein Div zu ziehen und dort abzulegen. Das Bild wird nicht auf das div gezogen und gibt den folgenden Fehler aus

Uncaught TypeError: Failed to execute 'appendChild' on 'Node': parameter 1 is not of type 'Node'.draganddrop.html:20 dropdraganddrop.html:26 ondrop

Code

  <!DOCTYPE HTML>
  <html>
     <head>
        <meta charset="utf-8">
        <title>Creativity Dashboard</title>

        <!-- Required CSS -->
        <link href="css/movingboxes.css" rel="stylesheet">
        <link href="css/compare.css" rel="stylesheet">

        <!--[if lt IE 9]>
           <link href="css/movingboxes-ie.css" rel="stylesheet" media="screen">
        <![endif]-->

        <!-- Required script -->
        <script src="http://code.jquery.com/jquery-1.8.0.min.js"></script>
        <script src="js/jquery.movingboxes.js"></script>

        <!-- Demo only -->
        <link href="demo/demo.css" rel="stylesheet">
        <script src="demo/demo.js"></script>

        <script>
           function allowDrop(ev) {
              ev.preventDefault();
           }

           function drag(ev) {
              ev.dataTransfer.setData("text", ev.target.id);
           }

           function drop(ev) {
              ev.preventDefault();
              var data = ev.dataTransfer.getData("text");
              ev.target.appendChild(document.getElementById(data));
           }
        </script>
        <style>
           /* Overall & panel width defined using css in MovingBoxes version 2.2.2+ */
           #slider-one {
              width: 1003px;
           }

           #slider-one>li {
              width: 150px;
           }
        </style>
     </head>

     <body>
        <div class="wrapper">
           <!-- Slider #1 -->
           <ul id="slider-one">

              <li><img id="drag1" src="demo/1.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

              <li><img id="drag2" src="demo/2.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

              <li><img id="drag3" src="demo/3.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

              <li><img id="drag5" src="demo/4.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

              <li><img id="drag6" src="demo/5.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

              <li><img id="drag7" src="demo/6.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture" id="astronaut"></li>

              <li><img id="drag8" src="demo/7.jpg" draggable="true"
                 ondragstart="drag(event)" alt="picture"></li>

           </ul>
           <!-- end Slider #1 -->
           <div id="dragAnddrop" ondrop="drop(event)"
              ondragover="allowDrop(event)" style="width: 12em; height: 12em">
           </div>
        </div>

        <div>
           <div class="left">
              <img id="drag" draggable="true" ondragstart="drag(event)"
                 src="images/startingImage.jpg" style="width: 12em;" alt="picture">

           </div>
           <div class="middle ">
              <img id="image3" src="images/startingImage.jpg" class="image-size"
                 alt="picture" draggable="true" ondragstart="drag(event)"> <img
                 src="images/harvest.jpg" class="image-size" alt="picture">
           </div>
           <div class="right">
              <img src="images/startingImage.jpg" style="width: 12em;"
                 alt="picture">
           </div>
        </div>
     </body>
  </html>

5
document.getElementByIdwird wahrscheinlich null zurückgeben, überprüfen Sie den Wert vondata
SmokeyPHP

1
Sie verwenden , ev.target.appendChild(document.getElementById(data));aber wenn es kein Element mit der ID ist datadann document.getElementByIdzurückkehren wird null. Also ev.target.appendChild(null)werde werfen.
Oriol

Es heißt Uncaught TypeError: undefined ist keine functioncompare.html: 92 ondragstart
MindBrain

Antworten:


201

Es ist eigentlich eine einfache Antwort.

Ihre Funktion gibt eher eine Zeichenfolge als den divKnoten zurück. appendChildkann nur einen Knoten anhängen.

Wenn Sie beispielsweise versuchen, die Zeichenfolge anzuhängen, erstellen Sie Folgendes:

var z = '<p>test satu dua tiga</p>'; // is a string 
document.body.appendChild(z);

Der obige Code wird niemals funktionieren. Was funktionieren wird ist:

var z = document.createElement('p'); // is a node
z.innerHTML = 'test satu dua tiga';
document.body.appendChild(z);

@nmnsud, es ist heutzutage in praktisch jedem Projekt enthalten.
Lodewijk

Schlechte Frage, aber müssen wir das neu erstellte Element nach dem Anhängen entfernen? Ich frage dies, da in einigen Situationen, in denen es eine Schleife gibt und im Klo untergeordnete Optionen angehängt werden. Wird es ein Speicherproblem oder mehr Müllelemente geben, die in dom erstellt wurden?
Kurkula

In diesem Fall erhalten Sie ein zusätzliches <p> -Tag.
Kurkula

13

Dies kann passieren, wenn Sie versehentlich nicht das Element ziehen, dem eine ID zugewiesen wurde (z. B. das umgebende Element). In diesem Fall ist die ID leer und die Funktion drag () weist einen leeren Wert zu, der dann an drop () übergeben wird und dort fehlschlägt.

Versuchen Sie, die IDs allen Ihren Elementen zuzuweisen, einschließlich der tds, divs oder was auch immer sich um Ihr ziehbares Element befindet.


5

In meinem Fall gab es keine Zeichenfolge, die ich aufrief appendChild, das Objekt, das ich als appendChildArgument weitergab, war falsch, es war ein Array und ich hatte ein Elementobjekt übergeben, also habe ich divel.appendChild(childel[0])stattdessen verwendet divel.appendChild(childel)und es hat funktioniert. Hoffe es hilft jemandem.



0

Sie können auch verwenden element.insertAdjacentHTML('beforeend', data);

Bitte lesen Sie die "Sicherheitsüberlegungen" auf MDN .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.