Ich versuche, den Inhalt eines bestimmten Textbereichs-Tags mit einem bestimmten Klick auf eine Schaltfläche abzurufen. Ich denke, eine Schleife wird dieses Problem lösen. Die while-Schleife in PHP übernimmt die Aufgabe, den Namen des Textbereichs und den Onclick-Trigger der Schaltfläche zu ändern. Aber die Schleife in Javascript wird nicht funktionieren. Bitte jemand helfen, was ist das richtige, um meine Aufgabe zu erfüllen? Entschuldigung für schlechtes Englisch ... Vielen Dank im Voraus

    <html>
    <head>
    <script>

    var i = 0;

    while(i < 2000)
    {
        i++;

        function feedbacks+i()
        {
         var feed = document.getElementsByName("feedback"+i)[0].value;
         alert(feed);
        }
    }

    </script>
    </head>

    <body>

    <?php

    while($i < 2000)

    $i++;
    echo "<textarea name='feedback$i' >you post</textarea>";
    echo "<button onclick='feedbacks$i()' >send feedback</button>";

    ?>

    </body>
    </html>
0
AlexJaa 1 Dez. 2013 im 12:19

4 Antworten

Beste Antwort

Ich bin nicht sicher, ob ich Ihre Frage richtig verstehe, aber warum schreiben Sie nicht eine einzige Javascript-Funktion und übergeben den Index als Parameter? mögen:

function feedbacks(index) {
    var feed = document.getElementsByName("feedback"+index)[0].value;
    alert(feed);
}

Und

onclick='feedbacks($i)'
2
JEM 1 Dez. 2013 im 08:25

Ihr JavaScript-Code weist einen Fehler auf:

  1. Sie haben versucht, eine Folge von Funktionen in einer Schleife zu definieren, und die Funktion wurde zu einer lokalen Funktion für diese Schleife. Sie können außerhalb der Schleife nicht auf diese Funktionen zugreifen. Damit dies funktioniert, sollten Sie die Funktion für das Objekt window mit der Syntax window["feedbacks1"] = function () {} definieren.
  2. function feedbacks+i() ist eine ungültige Syntax. Verwenden Sie window['feedbacks' + i], wie in (1) angegeben.
  3. In der Schleife definierte Funktionen teilen sich eine lokale Variable (Schließung). Die Variable in der Funktion feedbacks#{i} hat alle dieselbe i. Nach der Schleife wurde i zu 2001 und alle definierten Funktionen versuchen, einen Textbereich mit dem Namen feedbacks2001 zu erhalten, was natürlich nicht funktioniert. Sie benötigen den Trick (function (i) { /* the code using i */ })(i);, um eine lokale Kopie der gemeinsam genutzten Variablen zu erstellen.

Ich habe eine Demo auf jsFiddle erstellt, die die Fehler korrigiert. Ich habe nur 2 Textbereiche gezeigt. Das folgende Javascript sollte für Sie 2000 Textareas Fall funktionieren.

for (var i = 0; i <= 2; ++i) {
    window["feedbacks" + i] = (function (i) {
        return function (e) {
            var feed = document.getElementsByName("feedback"+i)[0].value;
            alert(feed);
        };
    })(i);
}
-1
Arie Xiao 1 Dez. 2013 im 09:35

Ihr Code ist falsch. Da Sie Ihre Frage mit Jquery markiert haben, möchte ich die folgende Lösung vorschlagen:

$(document).ready(function(){
   $(document).on('click','button',function(){
     alert($(this).prev('textarea').val())
   });
});

Sie erstellen diese Elemente textarea und button zur Laufzeit. Sie müssen also die Delegierung verwenden, um das Klickereignis für diese Schaltflächen zu registrieren. Außerdem müssen Sie Ihren Code in die Funktion .ready() einbinden. Dies bedeutet, dass Sie das DOM erst bearbeiten müssen, nachdem es fertig ist.

Hier finden Sie Referenzen,

2
Rajaprabhu Aravindasamy 1 Dez. 2013 im 08:31

Sie haben hier zwei Hauptprobleme.


Benennen Sie Ihre Funktion

Wenn Sie eine Funktion benennen, können Sie keine Variablen verwenden, sondern nur einen einzigen Bezeichner.

Sie können einen Funktionsausdruck verwenden und dann das Ergebnis etwas zuweisen, das Sie mit einer Variablen identifizieren können. z.B.

an_array_i_created_earlier[i] = function () {
    // etc etc
} 

Verschlüsse

Sie versuchen, i in der von Ihnen erstellten Funktion zu verwenden, ändern sie jedoch außerhalb dieser Funktion, bevor diese Funktion ausgeführt wird.

Sie können dies umgehen, indem Sie einen neuen Verschluss erstellen.

function createFunction(i) {
    return function () {
       // can use i sanely here because it was passed into a local variable belonging to `createFunction`
    };
}

an_array_i_created_earlier[i] = createFunction(i);

Das ist alles sehr chaotisch. Sie können vergessen, sich vollständig mit i befassen zu müssen, und die schrecklich intrinsischen Ereignisattribute wegwerfen, während Sie gerade dabei sind. Navigieren Sie stattdessen durch das DOM, um das Element zu finden:

addEventListener('click', function (evt) {
    var textarea, t = evt.target; 
    if (t.classList.contains('feedback')) {
        textarea = t.previousElementSibling;
        alert(textarea.value);
    }
});

Beachten Sie, dass hierfür einige relativ neue Ergänzungen zum Browser-DOM verwendet werden. Wenn Sie Kompatibilität mit älteren Browsern (insbesondere IE9 und früheren Versionen) wünschen, sollten Sie diese wahrscheinlich neu schreiben, um Unterstützung für ältere Ansätze hinzuzufügen. Eine Bibliothek wie YUI oder jQuery kann dabei helfen.

0
Quentin 1 Dez. 2013 im 08:32