[英]Keeping track of multiple buttons and how many each have been clicked
我的html中有多個clickable元素,並希望跟蹤每個按鈕的點擊次數。 我可以做一個非常優雅的解決方案,其中包括為每個按鈕都具有特定的功能,例如功能button1(),功能button2()等...由onclick調用,但我相信這樣做的更好方法是。 謝謝您的幫助。
<div class="starter">
<h3>Starter</h3>
<div class="starterItems">
<button type="button" id="salmon" >Salmon Tartare with fresh diced tomatoes</button>
<button type="button" id="prawn" >Prawn Cocktail with homemade marrinade</button>
<button type="button" id="soup">Asparagus Soup served with croutons</button>
</div>
</div>
var salmon = document.getElementById('salmon'),
prawn = document.getElementById('prawn'),
soup = document.getElementById('soup'),
clicks = {};
function click(e){
var id = e.target.id;
if(!clicks[id])
clicks[id]=0;
clicks[id]++;
e.target.textContent = clicks[id];
}
salmon.addEventListener('click', click);
prawn.addEventListener('click', click);
soup.addEventListener('click', click);
var b1 = document.getElementById('b1'), b2 = document.getElementById('b2'), b3 = document.getElementById('b3'), clicks = {}; function click(e) { var id = e.target.id; if (!clicks[id]) clicks[id] = 0; clicks[id]++; e.target.textContent = clicks[id]; } b1.addEventListener('click', click); b2.addEventListener('click', click); b3.addEventListener('click', click);
<button id="b1">Button 1</button> <button id="b2">Button 2</button> <button id="b3">Button 3</button>
data-
屬性: var b1 = document.getElementById('b1'), b2 = document.getElementById('b2'), b3 = document.getElementById('b3'); function click(e) { if (!e.target.getAttribute('data-clicks')) e.target.setAttribute('data-clicks', 0); var clicks = parseInt(e.target.getAttribute('data-clicks')); e.target.setAttribute('data-clicks', clicks + 1); e.target.textContent = clicks + 1; } b1.addEventListener('click', click); b2.addEventListener('click', click); b3.addEventListener('click', click);
<button id="b1">Button 1</button> <button id="b2">Button 2</button> <button id="b3">Button 3</button>
而且,正如其他人提到的那樣,使用localStorage
也是有效的選擇。 該實現將類似於使用id作為上方的鍵。
這實際上取決於您現有的代碼庫。 一種簡單的方法是為要跟蹤的所有按鈕(例如,一個類)都有一個標識符。 然后,您只需為該特定類綁定和事件。 就如此容易。
舉個例子,對於每個按鈕(或其他任何元素,都沒有關系),我們將選擇以下屬性作為標識符: data-count-clicks
。 為了給他們一個身份,上述標識符也將具有可選值。 例如,我們將有類似data-count-clicks="salmon"
或data-count-clicks="prawn"
。
這適用於動態生成的元素(不要忘記檢查控制台日志):
(function() { var counter = {}; document.addEventListener('click', onClickFn); function onClickFn(event) { var el = event.target; while (el) { if (matches(el, '[data-count-clicks]')) { var elemName = el.getAttribute('data-count-clicks') || 'nameless'; if (typeof counter[elemName] === 'number') { counter[elemName] += 1; } else { counter[elemName] = 1; } console.log(counter); } el = el.parentElement; } } // Polyfill for element.matches // https://developer.mozilla.org/en-US/docs/Web/API/Element/matches function matches(elm, selector) { var matches = (elm.document || elm.ownerDocument).querySelectorAll(selector), i = matches.length; while (--i >= 0 && matches.item(i) !== elm); return i > -1; } })();
<body> <button data-count-clicks="salmon">salmon</button> <button data-count-clicks="prawn">prawn</button> <button data-count-clicks="soup">soup</button> <button data-count-clicks>no name</button> <button data-count-clicks>no name</button> <div> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis, quisquam!</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque nostrum repellendus consectetur, doloribus eaque nobis rerum minima aut porro ducimus possimus eligendi <strong data-count-clicks="strong-tag">you can also click me</strong> expedita corrupti, ut vero atque ratione fugiat itaque, voluptatum. Quidem, ullam.</p> <p data-count-clicks="nested--parent"><strong data-count-clicks="nested--child">nested clicks</strong> </p> </div> </body>
一個更簡單的解決方案,不適用於動態生成的元素(請不要忘記檢查控制台日志):
(function() { var counter = {}; var clickElements = document.querySelectorAll('[data-count-clicks]'); for (var i = 0; i < clickElements.length; i++) { clickElements[i].addEventListener('click', onClickFn); } function onClickFn() { var elemName = this.getAttribute('data-count-clicks') || 'nameless'; if (typeof counter[elemName] === 'number') { counter[elemName] += 1; } else { counter[elemName] = 1; } console.log(counter); } })();
<body> <button data-count-clicks="salmon">salmon</button> <button data-count-clicks="prawn">prawn</button> <button data-count-clicks="soup">soup</button> <button data-count-clicks>no name</button> <button data-count-clicks>no name</button> <div> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Blanditiis, quisquam!</p> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Neque nostrum repellendus consectetur, doloribus eaque nobis rerum minima aut porro ducimus possimus eligendi <strong data-count-clicks="strong-tag">you can also click me</strong> expedita corrupti, ut vero atque ratione fugiat itaque, voluptatum. Quidem, ullam.</p> <p data-count-clicks="nested--parent"><strong data-count-clicks="nested--child">nested clicks</strong> </p> </div> </body>
優雅的解決方案是根據需要使用localStorage or sessionStorage
。
var count = 0;
function yourFunction(e) {
count= parseInt(count) + parseInt(1);
localStorage['button1'] = count; OR
localStorage[e.target.id] = count; OR
}
您肯定可以通過獲取id of the button
的id of the button
而不是'button1'來改進代碼,在localStorage
設置並在下次獲取它是更簡單的方法。 實際上,如果您也可以將對象持久存儲在localStorage
。
為每個按鈕分配相同的CSS類,並為所有按鈕分配相同的功能。 (請注意,您需要使用jQuery。)
$(".myClass").on("click", function(event){
var clickedButtonId = event.target.id;
// here you have id of the button that is clicked, and you can do whatever you want with that id
});
該功能僅定義一次,並且為您的所有按鈕提供服務。
你可以在jQuery中做一些事情
js:
$('.button').on('click', function(){
$(this).attr('data-counter', parseInt($(this).attr('data-counter') + 1) );
});
HTML:
<button class="button" data-counter="0"></button>
這樣做,您將每個計數器分別放在數據計數器屬性中。
創建一個對象以及每個按鈕的計數器,例如:
var buttonClicks = {};
在每次單擊按鈕的處理程序中,調用一個為您更新該對象的函數。 例如
function incrementButtonCounter(buttonId) {
if (typeof buttonClicks[buttonId] === 'undefined') {
buttonClicks[buttonId] = 1;
return;
}
buttonClicks[buttonId]++;
}
確保incrementButtonCounter
功能可以看到buttonClicks
對象即它們必須在同一個名字-最好不要全局。
我將為每個bata創建一個具有計數數據的對象。
var count = {
'btn1': 0,
'btn2': 0,
'btn3': 0
}
並在單擊按鈕時增加字段。
function handle(item) {
var clickedBtnId = item.target.getAttribute('id');
count[clickedBtnId]++;
update();
}
function update() {
document.getElementById('result').innerHTML = 'Btn 1 ' + count.btn1 + ' clicks <br/>' +
'Btn 2 ' + count.btn2 + ' clicks <br/> ' +
'Btn 3 ' + count.btn3 + ' clicks';
}
var btn1 = document.getElementById('btn1');
var btn2 = document.getElementById('btn2');
var btn3 = document.getElementById('btn3');
btn1.onclick = handle;
btn2.onclick = handle;
btn3.onclick = handle;
您可以這樣做:
var buttons = {}; function handleBtnClick(btnName) { buttons[btnName] = (buttons[btnName] || 0) + 1; }
<button onclick="handleBtnClick('muFirstButton')">my button 1</button> <button onclick="handleBtnClick('muSecondButton')">my button 2</button>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.