Übergeben Sie den String-Parameter in einer Onclick-Funktion


225

Ich möchte einen Parameter (dh eine Zeichenfolge) an eine Onclick-Funktion übergeben. Im Moment mache ich das:

'<input type="button" onClick="gotoNode(' + result.name + ')" />'

mit result.name zum Beispiel gleich string "Add". Wenn ich auf diese Schaltfläche klicke, wird ein Fehler angezeigt, der besagt, dass Hinzufügen nicht definiert ist. Da dieser Funktionsaufruf mit einem numerischen Parameter perfekt funktioniert, gehe ich davon aus, dass er etwas mit den Symbolen "" in der Zeichenfolge zu tun hat. Hatte jemand dieses Problem schon einmal?


1
In diesem Fall ist es möglicherweise besser, keine Inline-Ereignishandler zu verwenden.
Felix Kling

1
Ihr Problem ist darauf zurückzuführen, dass die Variable nicht ordnungsgemäß maskiert wird. Überprüfen Sie meine Antwort
Starx

Antworten:


351

Es sieht so aus, als würden Sie DOM-Elemente aus Zeichenfolgen erstellen. Sie müssen nur einige Anführungszeichen um result.name hinzufügen:

'<input type="button" onClick="gotoNode(\'' + result.name + '\')" />'

Sie sollten dies jedoch wirklich mit den richtigen DOM-Methoden tun.

var inputElement = document.createElement('input');
inputElement.type = "button"
inputElement.addEventListener('click', function(){
    gotoNode(result.name);
});

document.body.appendChild(inputElement);​

Beachten Sie jedoch, dass sich eine Schleife oder etwas resultanderes ändert, bevor das Ereignis ausgelöst wird, und dass Sie eine zusätzliche Bereichsblase erstellen müssen, um die sich ändernde Variable zu schattieren.


7
Diese Formatierung der Symbole funktioniert, also vielen Dank
JasperTack

2
Hi @ david..Ich habe einen Zweifel ... Ich möchte mehrere Argumente in diesem Onclick übergeben..wie ist das möglich? kannst du mir nützlich machen ..?
VIVEK-MDU

2
@ David, danke, es hat mein String-Parameter-Problem gelöst, aber jetzt muss ich übergeben (String, Boolean). was dafür zu tun?
Zaveed Abbasi

1
Danke, es hat mir wirklich geholfen :)
Hitesh

2
@ David: Kannst du ein bisschen sagen, warum wir ein Zitat hinzufügen müssen
Hitesh

34

Einige Bedenken hinsichtlich der Verwendung von String-Escape in onClick und mit zunehmender Anzahl von Argumenten wird die Wartung umständlich.

Der folgende Ansatz hat einen One-Hop-On-Click - Übertragen Sie das Steuerelement auf eine Handler-Methode, und die Handler-Methode kann basierend auf dem Ereignisobjekt das Klickereignis und das entsprechende Objekt abziehen.

Es bietet auch eine sauberere Möglichkeit, mehr Argumente hinzuzufügen und mehr Flexibilität zu haben.

<button type="button" 
        className="btn btn-default" 
        onClick="invoke" 
        name='gotoNode' 
        data-arg1='1234'>GotoNode</button>

Auf Javascript-Ebene:

  invoke = (event) => {
    let nameOfFunction = this[event.target.name];
    let arg1 = event.target.getAttribute('data-arg1');
    //We can add more args as needed...
    window[nameOfFunction](arg1) 
    //hope function is in window. 
    //Else the respective object need to be used 
    })
  }

Der Vorteil hierbei ist, dass wir so viele Argumente haben können (im obigen Beispiel data-arg1, data-arg2 ....) wie nötig.


2
Ich bin überrascht, dass dies nicht mehr positive Stimmen bringt, da es die sauberere Methode ist, Argumente an einen Ereignishandler zu übergeben.
Tim O'Brien

Dies funktioniert nicht, invokewird nicht aufgerufen, wenn Sie auf die Schaltfläche klicken
tanguy_k

Tolle Lösung! Wenn Sie Arrays oder Objekte übergeben müssen, verwenden Sie diese einfach JSON.stringify(obj)im HTML und JSON.parse(event.target.getAttribute('data-arg'))in der JavaScript-Ebene
leonheess

@SairamKrish In meinem Fall, wenn ich auf die Schaltfläche klicke, die ich eingestellt habe, um ID anzuzeigen, Screenshot: snag.gy/7bzEWN.jpg Code: pastiebin.com/5d35674e2fc31
Gem

Dies mag funktionieren, aber es ist eine abstruse, atypische Implementierung, die für einen anderen Entwickler, der dies beibehalten musste, schwer zu befolgen wäre.
Spencer Sullivan

24

Ich schlage vor, nicht einmal HTML- onclickHandler zu verwenden und etwas häufigeres zu verwenden, wie z document.getElementById.

HTML:

<input type="button" id="nodeGoto" />

JavaScript:

document.getElementById("nodeGoto").addEventListener("click", function() {
    gotoNode(result.name);
}, false);

onclickist keine Funktion, es ist eine Eigenschaft, der Sie eine Funktion zuweisen müssen:....onclick = function() {...};
Felix Kling

@FelixKling Danke dafür, mein Kopf ist immer noch im jQuery-Modus.
Kevinji

4
Sie gehen davon aus, dass es nur einen dieser Eingänge gibt.
Madbreaks

Nun, die Frage des OP impliziert, dass es nur eine Eingabe geben wird.
Kevinji

Ich denke, diese Option funktioniert bei mir nicht, da ich als Ergebnis einer Suchoperation mehrere Schaltflächen generiere. Ich könnte dies lösen, indem ich einen Zähler verwende, um die
IDs

21

Ich vermute, Sie erstellen eine Schaltfläche mit JavaScript. Der Fehler in Ihrem Code ist also, dass er in dieser Form gerendert wird

<input type="button" onClick="gotoNode(add)" />'

In diesem aktuellen Zustand addwird als Bezeichner wie Variablen oder Funktionsaufrufe betrachtet. Sie sollten dem Wert so entkommen

'<input type="button" onClick="gotoNode(\'' + result.name + '\')" />'

16

Dies ist eine schöne und übersichtliche Möglichkeit, Werte oder Objekte zu senden.

<!DOCTYPE html>
<html>
<body>
<h1  onclick="test('wow',this)">Click on this text!</h1>
<script>
var test =function(value,object){  
object.innerHTML=value;
};     
</script>
</body>
</html>

8

Versuche dies..

HTML:

<button id="a1" type="button" onclick="return a1_onclick('a1')">a1</button> 

JavaScript:

<script language="javascript" type="text/javascript">
    function a1_onclick(id) {
        document.getElementById(id).style.backgroundColor = "#F00";   
    }
</script>

Hinweis: Stellen Sie sicher, dass Sie Argumente zwischen '' Zeichen wie ('a1') im HTML-Code senden


Vielen Dank!! Ich habe nach diesem Prob für ein paar Stunden gesucht
am

Hilft jemand? In meinem Fall, wenn ich auf die Schaltfläche klicke, die ich eingestellt habe, um ID anzuzeigen, Screenshot: snag.gy/7bzEWN.jpg Code: pastiebin.com/5d35674e2fc31
Gem

6

Außerdem verwenden Sie das Grabakzent-Symbol (`) in der Zeichenfolge

Versuchen :

`<input type="button" onClick="gotoNode('${result.name}')" />`

Weitere Informationen finden Sie unter MDN und Stackoverflow

Von Chrome, Edge, Firefox (Gecko), Opera, Safari unterstützt, aber nicht Internet Explorer.


6

Wenn Ihre Schaltfläche dynamisch generiert wird:

Sie können Zeichenfolgenparameter an Javascript-Funktionen wie den folgenden Code übergeben:

Ich habe 3 Parameter übergeben, wobei der dritte ein String-Parameter ist. Ich hoffe, das hilft.

var btn ="<input type='button' onclick='RoomIsReadyFunc("+ID+","+RefId+",\""+YourString+"\");'  value='Room is Ready' />";

//your javascript function

function RoomIsReadyFunc(ID, RefId, YourString)
{
  alert(ID);
  alert(RefId);
  alert(YourString);
}

1
Schön, sauber und einfach. Danke

5

Bearbeitet: Wenn Sie auf das globale Objekt (js) in Ihrem HTML-Code verweisen möchten, können Sie dies versuchen. [Verwenden Sie keine Anführungszeichen ('oder ") um die Variable]

Geigenreferenz .

Javascript:

var result = {name: 'hello'};
function gotoNode(name) {
    alert(name);
}

HTML:

<input value="Hello" type="button" onClick="gotoNode(result.name)" />​

Ich erhalte eine Fehlermeldung, wenn ich diese Lösung versuche: Der Teil "+ result.name +" wird in diesem Fall als Zeichenfolge verwendet
JasperTack

Was ist ein "Ergebnis" -Objekt? Ist es eine globale Variable, die in JS deklariert ist? wie ... var result = {name: 'javascript'};
Sandeep GB

Ergebnis enthält einen Datensatz aus der Jowl-Bibliothek: Es ist eine JSON-Struktur mit Attributen Name, Typ, ...
JasperTack

Jaspack, ich habe die Antwort aktualisiert. Funktioniert es jetzt für Sie?
Sandeep GB

Vielen Dank für das Beispiel, aber das funktioniert in meinem Fall nicht: Die Ergebnisvariable ist nicht global, sondern eine Variable innerhalb einer Prozedur. Wenn ich also die Funktion mit result.name aufrufe, ist das Ergebnis nicht bekannt
JasperTack

4

Mehrere Parameter:

   bounds.extend(marker.position);
        bindInfoWindow(marker, map, infowindow,
     '<b>' + response[i].driver_name + '</b><br>' + 
     '<b>' +moment(response[i].updated_at).fromNow() + '</b>
      <button onclick="myFunction(\''+response[i].id+'\',\''+driversList+'\')">Click   me</button>'
    );

2

Um mehrere Parameter zu übergeben, können Sie die Zeichenfolge umwandeln, indem Sie sie mit dem ASCII-Wert verketten. Für einfache Anführungszeichen können wir '

var str= "&#39;"+ str+ "&#39;";

2

Hier ist eine Jquery-Lösung, die ich verwende.

Jquery

$("#slideshow button").click(function(){
    var val = $(this).val();
    console.log(val);
});

HTML

<div id="slideshow">
    <img src="image1.jpg">
    <button class="left" value="back">&#10094;</button>
    <button class="right" value="next">&#10095;</button>
</div>

1

Sie können eine Aktualisierung oder einen Zeichenfolgenwert übergeben, indem Sie die Funktion einfach in die Doube-Kommas "" asp unterhalb des Schnappschusses einfügen

Geben Sie hier die Bildbeschreibung ein


0

Zum Übergeben mehrerer Parameter können Sie die Zeichenfolge umwandeln, indem Sie sie mit dem ASCII-Wert verketten, z. B. für einfache Anführungszeichen &#39;

var str= "&#39;"+ str+ "&#39;";

Der gleiche Parameter kann an das onclick()Ereignis übergeben werden. In den meisten Fällen funktioniert er mit jedem Browser.


0

wenn für die Erzeugung eines Satzes von Schaltflächen mit verschiedenen Parametern von Handlern verwendet werden soll. https://www.w3schools.com/js/js_function_closures.asp

let some_button = document.createElement( "button" );
some_button.type = "button";

some_button.onclick = doWithParam( some_param );

function doWithParam( param ){
   return function(){
      alert( param );//<------Your code here
   }
}

wenn wir es tun:

some_button.onclick = foo( some_param );
function foo( param ){
    alert( param );
}

dann startet die Funktion foo nach jeder Aktualisierungsseite.

wenn wir es tun:

for( let i = 0; i < 10; ++i ){
    var inputElement = document.createElement('input');
    inputElement.type = "button"
    inputElement.addEventListener('click', function(){
        gotoNode(result.name);
    });

   document.body.appendChild(inputElement);​
}

dann für alle in der Schleife erstellten Schaltflächen der letzte Wert des Parameters "result.name"


0

Wenn Sie asp verwenden, können Sie Javascript verwenden:

HTML:

<input type='button' value='test' onclick='javascript: EditSelectedOptionName(x,y)' />"

Javascript:

function EditSelectedOptionName(id, name) {
        console.log(id);
        console.log(name);
 }

0

Wenn Sie eine Schaltfläche oder einen Link dynamisch hinzufügen und sich dem Problem stellen, kann dies hilfreich sein. Ich habe auf diese Weise gelöst.

var link= $(contentData1[i]).find("td:first font b a").attr("href",'javascript:onClick=openWin(\'' + tdText + '\')');

Ich bin neu in HTML, JQuery und JS. Vielleicht wird mein Code nicht optimiert oder die Syntax wird nicht angezeigt, aber es hat bei mir funktioniert.


0

In Razor können Sie Parameter dynamisch übergeben: @ Model.UnitNameVMs [i] .UnitNameID


0

Sie können dies verwenden,

'<input id="test" type="button" value="' + result.name + '" />'

$(document)..on('click', "#test", function () {
        alert($(this).val());
});

seine Arbeit für mich


-1
    <style type="text/css">
        #userprofile{
              display: inline-block;
              padding: 15px 25px;
              font-size: 24px;
              cursor: pointer;
              text-align: center;
              text-decoration: none;
              outline: none;
              color: #fff;
              background-color: #4CAF50; //#c32836
              border: none;
              border-radius: 15px;
              box-shadow: 0 9px #999;
              width: 200px;
              margin-bottom: 15px;

        }
        #userprofile:hover {
            background-color: #3e8e41
        }
        #userprofile:active {
              background-color: #3e8e41;
              box-shadow: 0 5px #666;
              transform: translateY(4px);
        }
        #array {
                border-radius: 15px 50px;
                background: #4a21ad;
                padding: 20px;
                width: 200px;
                height: 900px;
                overflow-y: auto;
            }

    </style>
if(data[i].socketid!=""){
$("#array").append("<button type='button'  id='userprofile' class='green_button' name="+data[i]._id+" onClick='chatopen(name)'>"+data[i].username+"</button></br>");                    
                }else{
                    console.log('null socketid  >>', $("#userprofile").css('background-color')); 
                    //$("#userprofile").css('background-color','#c32836 ! important');


$("#array").append("<button type='button'  id='userprofile' class='red_button' name="+data[i]._id+" onClick='chatopen(name)'>"+data[i].username+"</button></br>");  
                $(".red_button").css('background-color','#c32836');             
                }

Bitte erläutern Sie Ihren Code, diese Antwort allein ist nicht nützlich
Phil Hudson

-1

Folgendes funktioniert bei mir sehr gut,

<html>
<head>
    <title>HTML Form</title>
</head>
<body>
    <form>
        <input type="button" value="ON" onclick="msg('ON')">
        <input type="button" value="OFF" onclick="msg('OFF')">
    </form>
    <script>
        function msg(x){
            alert(x);
        }
    </script>
</body>
</html>

1
OP fragt nicht nach einem konstanten Wert. Dies beantwortet die Frage nicht.
RubioRic

-1

Sie können diesen Code in Ihrer Button-On-Click-Methode verwenden:

<button class="btn btn-danger" onclick="cancelEmployee(\''+cancelButtonID+'\')" > Cancel </button>
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.