В приведенном ниже коде, когда я нажимаю кнопку, она отключается,
Поэтому я хочу, когда я нажимаю другую кнопку. отключенная кнопка становится активной
Например, кнопка 1 была нажата и отключена,
когда нажимается другая кнопка, например кнопка 3, кнопка 1 активируется
это похоже на то, что 1 нажимается и отключается, затем, когда 2 нажимается и отключается, тогда 1 включается Вот так
$(function () {
$("#button1").click(function () {
$("#button1").prop("disabled", true);
$("p").text("You have clicked on Button 1");
$(this).text("Selected");
});
$("#button2").click(function () {
$("#button2").prop("disabled", true);
$("p").text("You have clicked on Button 2");
$(this).text("Selected");
});
$("#button3").click(function () {
$("#button3").prop("disabled", true);
$("p").text("You have clicked on Button 3");
$(this).text("Selected");
});
$("#button4").click(function () {
$("#button4").prop("disabled", true);
$("p").text("You have clicked on Button 4");
$(this).text("Selected");
});
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "p-5">
<button id = "button1">Button 1</button>
<button id = "button2">Button 2</button>
<button id = "button3">Button 3</button>
<button id = "button4">Button 4</button>
<p id = "status" class = "py-3"></p>
</div>


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Существует множество подходов, один из них может быть следующим: Добавление класса ко всем кнопкам для их группировки, сохранения их значений (id и исходного текста) и привязки к ним событий нажатия следующим образом:
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "p-5">
<button class = "button" id = "button1">Button 1</button>
<button class = "button" id = "button2">Button 2</button>
<button class = "button" id = "button3">Button 3</button>
<button class = "button" id = "button4">Button 4</button>
<p id = "status" class = "py-3"></p>
</div>
<script type = "text/javascript">
$(function () {
let buttons = $('.button'), buttonValues = [];
buttons.each(function() {
let button = $(this);
buttonValues.push({
id: button.attr("id"),
text: button.text()
});
});
buttons.click(function() {
let id = $(this).attr("id");
let storedText = buttonValues.find(item => item.id === id).text;
buttons.each(function() {
let button = $(this);
button.prop('disabled', false);
let originalText = buttonValues.find(item => item.id === button.attr("id")).text;
button.text(originalText);
});
$(this).prop('disabled', true);
$(this).text('Selected');
$("p").text(`You have clicked on ${storedText}`);
});
});
</script>вам нужно определить, какая кнопка отключена, чтобы добиться того, чтобы вы могли либо перебрать все кнопки, либо сохранить отключенную кнопку в глобальной переменной.
когда вы нажимаете кнопку, начните с включения отключенной кнопки, выполните свою логику, а затем отключите нажатую кнопку
let disabled;
$("#button1").click(function () {
$("#button1").prop("disabled", true);
$("p").text("You have clicked on Button 1");
$(this).text("Selected");
// enable the disabled one
if (disabled) $(disabled).prop("disabled", false);
// or find the disabled button then enable it
document.querySelector("[disabled=true]")?.setAttribute("disabled", false);
// now save our button as disabled
disabled = "#button1";
});
Вы повторяете свой код, что не является хорошим дизайном (см. СУХОЙ)
Вместо этого я бы порекомендовал вам воспользоваться занятиями...
$(function () {
$(".mybutton").click(function () {
// Enable all buttons
let $all = $(".mybutton").prop("disabled", false);
// Reset text on each button
$all.each((i, x) => $(x).text(`Button ${$(x).data("buttonid")}`));
// Disable THIS button, and say it's selected
let $btn = $(this).prop("disabled", true).text("Selected");
// Set the hint
$("p").text(`You have clicked on Button ${$btn.data("buttonid")}`);
});
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "p-5">
<button id = "button1" class = "mybutton" data-buttonid = "1">Button 1</button>
<button id = "button2" class = "mybutton" data-buttonid = "2">Button 2</button>
<button id = "button3" class = "mybutton" data-buttonid = "3">Button 3</button>
<button id = "button4" class = "mybutton" data-buttonid = "4">Button 4</button>
<p id = "status" class = "py-3"></p>
</div>Как видно из других ответов, есть много способов сделать то, что вы хотите. Один из методов, который требует ограниченных изменений в вашей логике/коде, заключается в том, чтобы каждый из ваших обработчиков событий вызывал функцию, которая активирует все кнопки. Вот и все! Добавьте одну короткую функцию EnableAll() и вызывайте ее в начале каждого обработчика. См. фрагмент рабочего кода ниже:
function enableAll( ) {
$("#button1").prop("disabled", false);
$("#button2").prop("disabled", false);
$("#button3").prop("disabled", false);
$("#button4").prop("disabled", false);
}
$(function () {
$("#button1").click(function () {
enableAll();
$("#button1").prop("disabled", true);
$("p").text("You have clicked on Button 1");
$(this).text("Selected");
});
$("#button2").click(function () {
enableAll();
$("#button2").prop("disabled", true);
$("p").text("You have clicked on Button 2");
$(this).text("Selected");
});
$("#button3").click(function () {
enableAll();
$("#button3").prop("disabled", true);
$("p").text("You have clicked on Button 3");
$(this).text("Selected");
});
$("#button4").click(function () {
enableAll();
$("#button4").prop("disabled", true);
$("p").text("You have clicked on Button 4");
$(this).text("Selected");
});
});<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class = "p-5">
<button id = "button1">Button 1</button>
<button id = "button2">Button 2</button>
<button id = "button3">Button 3</button>
<button id = "button4">Button 4</button>
<p id = "status" class = "py-3"></p>
</div>Вот сокращенный способ сделать это. Я использовал ванильный JS и jQuery. Я уверен, что вы сможете еще больше сжать это. Если вы используете vanilla js, вам не нужно добавлять библиотеку jquery.
Ванильный JS
(function(){
let buttonList = document.querySelectorAll('[id*=button]'),
status = document.getElementById('status');
buttonList.forEach(button => button.addEventListener('click', handleButton));
function handleButton() {
resetState();
this.setAttribute('disabled', '');
status.textContent = 'You have clicked ' + this.textContent;
}
function resetState() {
buttonList.forEach(button => button.removeAttribute('disabled'))
}
})()
jQuery
$(function(){
$('[id*=button]').on('click', handleButton);
function handleButton() {
$(this).parent().children().removeAttr('disabled');
$(this).prop('disabled', true);
$('#status').text('You have clicked ' + $(this).text())
}
})
Другой способ...
... более короткий код на чистом JS?
const pStatus = document.querySelector('p#status')
;
document
.querySelectorAll('button[data-txt]')
.forEach( (btn,_,buttons_All) =>
{
btn.onclick =_=>
{
buttons_All.forEach( b => b.disabled = (b === btn) );
pStatus.textContent = `You have clicked ${btn.dataset.txt}`;
}
})button[data-txt]::before {
content: attr(data-txt);
}
button[data-txt]:disabled::before {
content: 'Selected';
}<div class = "p-5">
<button id = "button1" data-txt = "Button 1"></button>
<button id = "button2" data-txt = "Button 2"></button>
<button id = "button3" data-txt = "Button 3"></button>
<button id = "button4" data-txt = "Button 4"></button>
<p id = "status" class = "py-3"></p>
</div>
Разве не для этого были созданы радиокнопки?