passa il parametro stringa in una funzione onclick


225

Vorrei passare un parametro (cioè una stringa) a una funzione Onclick. Per il momento, faccio questo:

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

con result.name ad esempio uguale alla stringa "Aggiungi". Quando faccio clic su questo pulsante, ho un errore che dice che Aggiungi non è definito. Dato che questa funzione funziona perfettamente con un parametro numerico, suppongo che abbia qualcosa a che fare con i simboli "" nella stringa. Qualcuno ha avuto questo problema prima?


1
Potrebbe essere meglio in questo caso semplicemente non usare i gestori di eventi inline.
— Felix Kling

1
Il tuo problema è dovuto al fatto che la variabile non è stata salvata correttamente. Controlla la mia risposta
— Starx

Risposte:


351

Sembra che tu stia costruendo elementi DOM da stringhe. Devi solo aggiungere alcune virgolette intorno a result.name:

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

Dovresti davvero farlo con i metodi DOM corretti.

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

​document.body.appendChild(inputElement);​

Basta essere consapevoli del fatto che se si tratta di un ciclo o qualcosa del genere, resultcambierà prima che l'evento si attivi e sarà necessario creare un fumetto aggiuntivo per oscurare la variabile in evoluzione.


7
Questa formattazione dei simboli funziona, quindi grazie mille
— JasperTack

2
Ciao @ David .. Ho un dubbio ... Voglio passare più argomenti in quel clic ... come è possibile? puoi rendermi utile per me ..?
— VIVEK-MDU,

2
@ David, grazie ha risolto il problema con i parametri della stringa ma ora devo passare (stringa, booleano). cosa fare per quello?
— Ha salvato Abbasi il

1
Grazie, mi ha davvero aiutato :)
— Hitesh,

2
@david: puoi dirci un po 'perché dobbiamo aggiungere un preventivo in
— proposito

34

Un paio di preoccupazioni per me riguardo all'uso della stringa escape in onClick e con l'aumentare del numero di argomenti, diventerà complicato da mantenere.

L'approccio seguente avrà un hop: Al clic, il controllo su un metodo del gestore e il metodo del gestore, basato sull'oggetto evento, può dedurre l'evento clic e l'oggetto corrispondente.

Fornisce anche un modo più pulito per aggiungere più argomenti e avere maggiore flessibilità.

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

Sul livello javascript:

  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 
    })
  }

Il vantaggio qui è che possiamo avere tutti gli argomenti (nell'esempio sopra, data-arg1, data-arg2 ....), se necessario.


2
Sono sorpreso che questo non ottenga più voti in quanto è il metodo più pulito di passare argomenti a un gestore di eventi.
— Tim O'Brien,

Questo non funziona, invokenon viene chiamato quando si fa clic sul pulsante
— tanguy_k

Ottima soluzione! Se hai bisogno di passare array o oggetti, basta usare JSON.stringify(obj)nell'HTML e JSON.parse(event.target.getAttribute('data-arg'))nel livello JavaScript
— leonheess

@SairamKrish Nel mio caso, se faccio clic sul pulsante ho impostato per visualizzare l'ID, screenshot: snag.gy/7bzEWN.jpg codice: pastiebin.com/5d35674e2fc31
— Gem

Questo potrebbe funzionare, ma è un'implementazione astrusa e atipica che sarebbe difficile seguire per un altro sviluppatore che aveva bisogno di mantenerlo.
— Spencer Sullivan,

24

Suggerisco di non usare nemmeno i onclickgestori HTML e di usare qualcosa di più comune come document.getElementById.

HTML:

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

JavaScript:

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

onclicknon è una funzione, è una proprietà a cui devi assegnare una funzione a:....onclick = function() {...};
— Felix Kling

@FelixKling Grazie, la mia testa è ancora in modalità jQuery.
— Kevin

4
Stai assumendo che ci sarà solo uno di questi input.
— Madbreaks

Bene, la domanda del PO implica che ci sarà un solo input.
— Kevin

Penso che questa opzione non funzioni per me, perché ho generato più pulsanti a seguito di un'operazione di ricerca. Potrei risolverlo usando un contatore per aggiungere l'id, ma voglio mantenerlo semplice e tenerlo in linea
— JasperTack

21

Immagino che tu stia creando un pulsante usando JavaScript stesso. Quindi, l' errore nel tuo codice è che, verrà visualizzato in questo modulo

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

Allo stato attuale, addverrà considerato un identificatore come variabili o chiamate di funzione. Dovresti sfuggire al valore in questo modo

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

16

Questo è un modo carino e pulito per inviare valore o oggetto.

<!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

Prova questo..

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>

Nota: assicurati di inviare argomenti tra '' segni come ('a1') nel codice html


Grazie!! cerco questa prob per un paio d'ore
— cweitat

Qualcuno aiuta? Nel mio caso, se fa clic sul pulsante ho impostato per visualizzare id, screenshot: snag.gy/7bzEWN.jpg Codice: pastiebin.com/5d35674e2fc31
— Gem

6

inoltre usi il simbolo di accento grave (`) nella stringa

provare :

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

per maggiori informazioni visita MDN e StackOverflow

Con Chrome, Edge, Firefox (Gecko), Opera, supporto Safari, ma non supporta Internet Explorer.


6

se il tuo pulsante viene generato dinamicamente:

È possibile passare parametri di stringa a funzioni javascript come il codice seguente:

Ho passato 3 parametri in cui il terzo è un parametro stringa spero che questo aiuti.

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
Bello, pulito e semplice. Grazie

5

Modificato: se il requisito è fare riferimento all'oggetto globale (js) nel tuo codice HTML, puoi provare questo. [Non usare virgolette ('o ") attorno alla variabile]

Riferimento violino .

Javascript:

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

HTML:

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

Ottengo un errore quando provo questa soluzione: la parte "+ result.name +" viene utilizzata come stringa in questo caso
— JasperTack

che cos'è l'oggetto "risultato"? È una variabile globale dichiarata in JS? come ... var result = {name: 'javascript'};
— Sandeep GB

risultato contiene un record della libreria jowl: è una struttura json con attributi nome, tipo, ...
— JasperTack

Jaspack, ho aggiornato la risposta. Funziona per te adesso?
— Sandeep GB

Grazie per l'esempio, ma nel mio caso non funziona: la variabile del risultato non è globale, ma è una variabile all'interno di una procedura. Quindi quando chiamo la funzione con result.name, il risultato non è noto
— JasperTack

4

Parametro multiplo:

   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

Per passare più parametri puoi lanciare la stringa concatenandola con il valore ASCII come, per virgolette singole possiamo usare "

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

2

Ecco una soluzione Jquery che sto usando.

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

Puoi passare il riferimento o il valore di stringa semplicemente inserendo la funzione all'interno delle virgole di doube "" asp sotto lo snapshot

inserisci qui la descrizione dell'immagine


0

Per passare più parametri puoi lanciare la stringa concatenandola con il valore ASCII come, per virgolette singole che possiamo usare &#39;

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

lo stesso parametro è possibile passare onclick()all'evento. Nella maggior parte dei casi funziona con tutti i browser.


0

se usare per la generazione di una serie di pulsanti con diversi parametri di gestori. 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
   }
}

se lo facciamo:

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

quindi funzione per iniziare dopo ogni pagina di aggiornamento.

se lo facciamo:

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);​
}

quindi per tutti i pulsanti creati nel loop, l'ultimo valore del parametro "nome.risultato"


0

se stai usando asp puoi usare javascript:

HTML:

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

Javascript:

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

0

Se stai aggiungendo il pulsante o il link in modo dinamico e stai affrontando il problema, questo può essere d'aiuto. Ho risolto in questo modo.

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

Sono nuovo di HTML, JQuery e JS. Quindi potrebbe essere il mio codice non sarà ottimizzato o sintassi, ma funzionava per me.


0

In Razor, puoi passare i parametri in modo dinamico: @ Model.UnitNameVMs [i] .UnitNameID


0

Puoi usare questo,

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

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

funziona per me


-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');             
                }

Spiega il tuo codice, questa risposta di per sé non è utile
— Phil Hudson,

-1

Quanto segue funziona molto bene per me,

<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 non chiede un valore costante. Questo non risponde alla domanda.
— RubioRic,

-1

È possibile utilizzare questo codice nel metodo onclick del pulsante:

<button class="btn btn-danger" onclick="cancelEmployee(\''+cancelButtonID+'\')" > Cancel </button>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.