onclick関数で文字列パラメータを渡す


225

Onclick関数にパラメーター(つまり文字列)を渡したいのですが。当分の間、私はこれを行います:

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

たとえば、result.nameは文字列「Add」と同じです。このボタンをクリックすると、「追加が定義されていません」というエラーが表示されます。この関数呼び出しは数値パラメーターで完全に機能するので、文字列内の記号 ""と関係があると思います。以前に誰かがこの問題を抱えていましたか?


1
この場合は、単にインラインイベントハンドラーを使用しない方がよい場合があります。
Felix Kling 2012年

1
問題は、変数が適切にエスケープされていないことが原因です。私の答えを
Starx

回答:


351

文字列からDOM要素を構築しているようです。あなただけのresult.nameの周りにいくつかの引用符を追加する必要があります:

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

ただし、適切なDOMメソッドを使用してこれを行う必要があります。

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

document.body.appendChild(inputElement);​

これがループか何かでresultある場合、イベントが発生する前に変更され、変化する変数を隠すために追加のスコープバブルを作成する必要があることに注意してください。


7
シンボルのこのフォーマットは機能します。よろしくお願いします
JasperTack

2
こんにちは@ david..1つの疑問があります...そのonclick..howで複数の引数を渡したいのですが、どのように可能ですか?あなたは私に役立つようにすることができます。
VIVEK-MDU 2013

2
@david、おかげで私の文字列パラメーターの問題は解決しましたが、今は(string、boolean)を渡す必要があります。そのために何をすべきか?
Zaveed Abbasi 2014

1
おかげで、本当に
助かり

2
@david:なぜそれを引用する必要があるのか​​を少し教えてください
Hitesh

34

onClickでの文字列エスケープの使用に関するいくつかの懸念と、引数の数が増えるにつれて、維持するのが面倒になります。

次のアプローチでは、1ホップ(クリック時)でハンドラーメソッドに制御を移動し、イベントオブジェクトに基づいてハンドラーメソッドを使用して、クリックイベントと対応するオブジェクトを差し引くことができます。

また、より多くの引数を追加するためのより明確な方法を提供し、柔軟性を高めます。

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

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

ここでの利点は、必要な数の引数(上記の例ではdata-arg1、data-arg2 ....)を持つことができることです。


2
これは、イベントハンドラーに引数を渡すよりクリーンな方法であるため、これ以上の投票が得られないことに驚いています。
Tim O'Brien

これは機能せずinvoke、ボタンをクリックしても呼び出されません
tanguy_k

素晴らしい解決策!配列またはオブジェクトを渡す必要がある場合JSON.stringify(obj)は、HTMLとJSON.parse(event.target.getAttribute('data-arg'))JavaScriptレイヤーで使用するだけです
leonheess

@SairamKrish私の場合、IDを表示するように設定したボタンをクリックすると、スクリーンショット:snag.gy/7bzEWN.jpg コード:pastiebin.com/5d35674e2fc31
Gem

これはうまくいくかもしれませんが、これを維持する必要があった別の開発者にとって従うのが難しい、厄介で非典型的な実装です。
スペンサーサリバン

24

HTML onclickハンドラーを使用することはお勧めせず、などのより一般的なものを使用することをお勧めしますdocument.getElementById

HTML:

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

JavaScript:

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

onclickそれはあなたがに機能を割り当てる必要が財産だ、関数ではありません:....onclick = function() {...};
フェリックスクリング

@FelixKlingおかげで、私の頭はまだjQueryモードです。
kevinji 2012年

4
これらの入力の1つだけが存在すると想定しています。
Madbreaks 2012年

まあ、OPの質問は1つだけの入力があることを意味します。
kevinji 2012年

検索操作の結果として複数のボタンを生成するため、このオプションは私には機能しないと思います。カウンターを使用してIDに追加することでこれを解決できますが、単純にしてインラインに維持したいと思います
JasperTack

21

JavaScript自体を使用してボタンを作成していると思います。したがって、コードのエラーは、この形式でレンダリングされるということです

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

この現状でaddは、変数や関数呼び出しのような識別子と見なされます。このような値をエスケープする必要があります

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

16

これは、値またはオブジェクトを送信するための優れた方法です。

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

これを試して..

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>

注:htmlコード内の( 'a1')のような ''記号の間に必ず引数を送信してください


ありがとう!! 数時間この確率を探していました
cweitat

誰か助けてくれますか?私の場合、IDを表示するように設定したボタンをクリックすると、スクリーンショット:snag.gy/7bzEWN.jpg コード:pastiebin.com/5d35674e2fc31
Gem

6

また、文字列でアクサングラーブ記号( `)を使用します

試してください:

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

より多くの情報訪問のためMDN Stackoverflowを

Chrome、Edge、Firefox(Gecko)、Opera、Safariはサポートしていますが、Internet Explorerはサポートしていません。


6

ボタンが動的に生成される場合:

以下のコードのように、文字列パラメータをJavaScript関数に渡すことができます。

私は3つのパラメーターを渡しました。3番目のパラメーターは文字列パラメーターで、これが役立つことを願っています。

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
素敵で、クリーンでシンプル。ありがとう

5

編集:HTMLコードでグローバルオブジェクト(js)を参照する必要がある場合は、これを試すことができます。[変数を引用符( 'または ")で囲まないでください]

フィドル参照。

JavaScript:

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

HTML:

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

このソリューションを試すとエラーが発生します。この場合、「+ result.name +」の部分が文字列として使用されます
JasperTack

「結果」オブジェクトとは それはJSで宣言されたグローバル変数ですか?like ... var result = {name: 'javascript'};
Sandeep GB

結果には、jowlライブラリからのレコードが含まれます。これは、名前、タイプなどの属性を持つjson構造です
JasperTack

Jaspack、答えを更新しました。今はうまくいきますか?
Sandeep GB

例をありがとうございますが、私の場合はうまくいきません。結果の変数はグローバルではなく、プロシージャ内の変数です。したがって、result.nameを使用して関数を呼び出すと、結果が
わかり

4

複数のパラメータ:

   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

複数のパラメータを渡す場合は、文字列をASCII値と連結してキャストできます。単一引用符の場合は '

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

2

これが私が使用しているJqueryソリューションです。

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>


0

複数のパラメータを渡す場合は、ASCII値と連結して文字列をキャストできます。単一引用符の場合は、次のように使用できます &#39;

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

onclick()イベントに渡すことができる同じパラメーター。ほとんどの場合、すべてのブラウザーで機能します。


0

ハンドラーの異なるパラメーターを持つ一連のボタンの生成に使用する場合。 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
   }
}

私たちが行う場合:

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

次に、ページを更新するたびに関数fooが開始します。

私たちが行う場合:

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

次に、ループで作成されたすべてのボタンについて、パラメーター「result.name」の最後の値


0

ASPを使用している場合は、JavaScriptを使用できます。

HTML:

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

JavaScript:

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

0

ボタンまたはリンクを動的に追加して問題に直面している場合、これが役立つことがあります。この方法で解決しました。

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

HTML、JQuery、JSは初めてです。だから私のコードは最適化されないか構文ではないかもしれませんが、それは私のために働いていました。



0

これを使えます

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

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

私の仕事


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

コードについて説明してください。この回答自体は役に立ちません
Phil Hudson、

-1

以下は私にとってとてもうまくいきます、

<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は定数値について尋ねていません。これは質問の答えにはなりません。
RubioRic

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.