4

div内のボタンonclick機能を変更したい。HTMLコードは次のとおりです

<div class="buttons-set" id="payment-buttons-container">
    <button type="button" class="button" onclick="payment.save()" id="payment_button"></button>
</div>

次のプロトタイプを使用して、onlick 関数 payment.save() を別のものに変更しています。

if(payment_method=='gate') {
   var e = $$('div#payment-buttons-container button.button');
   e.setAttribute('onclick','return false;'); // not working
} else {
    var e = $$('div#payment-buttons-container button.button');
    e.setAttribute('onclick','payment.save();'); // not working
}

「Uncaught TypeError: Object [object HTMLButtonElement] has no method 'setAttribute'」と言っていますが、ボタンの ID を静的に取得してこのコードを使用している場合、その動作よりも

if(payment_method=='gate') {
    $('payment_button').setAttribute('onclick','return false;');// Works
}
else {
    $('payment_button').setAttribute('onclick','payment.save();');// Works
}

「payment_button」は、私が取ったボタンのIDです。

4

1 に答える 1

10

問題は$$()、CSS セレクターに一致する要素のリストを返すことです。

セレクターに一致する最初の要素だけが必要な場合は、これを試してください

if(payment_method=='gate') {
   var e = $$('div#payment-buttons-container button.button')[0];
   e.setAttribute('onclick','return false;'); // not working
} else {
   var e = $$('div#payment-buttons-container button.button')[0];
   e.setAttribute('onclick','payment.save();'); // not working
}

CSSセレクターが一致するすべての要素に適用したい場合は、invoke()メソッドを使用してこのようにします

if(payment_method=='gate') {
   $$('div#payment-buttons-container button.button').invoke('writeAttribute','onclick','return false;');
} else {
    $$('div#payment-buttons-container button.button').invoke('writeAttribute','onclick','payment.save();'); // not working
}

writeAttribute()代わりに使用した理由setAttribute()writeAttribute()、PrototypeJS メソッドであり、PrototypeJS がサポートするすべてのブラウザーで機能するためsetAttbribute()です。これは、常に使用できるとは限らない標準メソッドです。

于 2013-02-01T20:05:49.840 に答える