Prototypeの多くのボタンのコードを短くする
-
06-07-2019 - |
質問
ボタンがたくさんあり、別のボタンをクリックすると、別の画像とテキストが表示されます。私は望むものを達成することができますが、コードは非常に長く、非常に反復的なようです。 例:
var aaClick = false;
$("aa").observe('click', function() {
unclick();
$('characterPic').writeAttribute('src',"aa.jpg");
$('characterBio').update("aatext");
$('aa').setStyle({ color: '#FFFFFF' });
aaClick = true;
});
$("aa").observe('mouseover', function() {
if (!aaClick) $('aa').setStyle({ color: '#FFFFFF' });
});
$("aa").observe('mouseout', function() {
if (!aaClick) $('aa').setStyle({ color: '#666666' });
});
function unclick() {
aaClick = false;
$('aa').setStyle({ color: '#666666' });
}
bb、ccなどと同じことで、新しいボタンを追加するたびに、クリック解除機能にも追加する必要があります。これはかなり面倒で、グーグルで試してみましたが、リストされたすべてのアイテムのクリックを観察するだけでしたので、他のボタンがクリックされたときにボタンを押す必要があるため、まだわかりませんでした。
異なるIDを使用するがまったく同じことを行う汎用関数を使用する方法はありますか?私が見ることができることから、aaを他のIDに置き換えることができれば、多くのコードを削減できるからです。ありがとう!!!
解決
すべてを関数にビルドし、登録するDIVの名前を単純に渡すことができます。 .jpg名と一致している限り、動作するはずです。
var clicks = []
function regEvents(divName) {
$(divName).observe('click', function() {
unclick(divName);
$('characterPic').writeAttribute('src',divName+".jpg");
$('characterBio').update(divName"text");
$(divName).setStyle({ color: '#FFFFFF' });
clicks[divName] = true
});
$(divName).observe('mouseover', function() {
if (!clicks[divName]) $(divName).setStyle({ color: '#FFFFFF' });
});
$(divName).observe('mouseout', function() {
if (!clicks[divName]) $(divName).setStyle({ color: '#666666' });
});
}
function unclick(divName) {
clicks[divName] = false;
$(clicks[divName]).setStyle({ color: '#666666' });
}
他のヒント
イベントの委任。すべてのボタンにクラス(たとえば、 yourButtonClass
)を指定し、...
var clicks = [];
$('.yourButtonClass').each(function(button) {
clicks.push(button.id);
});
$(document).observe('click', function(e) {
// If your click registered on an element contained by the button, this comes in handy...
var clicked = e.element().up('.yourButtonClass') || e.element();
if(clicked.hasClassName('.yourButtonClass')) {
unclick();
$('characterPic').writeAttribute('src', clicked.id + '.jpg');
$('characterBio').update(clicked.id + 'text');
$(clicked).setStyle({ color: '#FFFFFF' });
clicks[clicked.id] = true;
}
});
など...
イベントハンドラーは、イベントターゲットに設定される引数を持つことができます。その後、同じ関数を再利用できます:
var clickedHandler = function(element) {
$(element).addClass("selected");
};
$("aa").observe('click', clickedHandler);
$("bb").observe('click', clickedHandler);
また、CSSスタイリングを切実に必要としています。以前の質問に対する私の回答をご覧ください。ただし、パターンを他のイベントに再利用できます。
ボタンは共通のコンテナを共有しますか?その後、次のコードが機能します:
$(container).childElements().each(function(element) {
$(element).observe('click', function () { … });
…
});
別の方法として、これを行うこともできます:
["aa", "bb", "cc"].each(function(element) { … same code … });
所属していません StackOverflow