Кнопка Start/Stop на JQuery

203
07 июля 2018, 04:40

По заданию нужно сделать чтобы при нажатии на кнопку "Start" она изменяла свою подпись на "Stop" и наоборот.
Пытался сделать так:

$(document).ready(function() { 
  $('#start').click(function() { 
    $(this).attr('id', 'stop'); 
    $(this).val('Stop'); 
  }); 
  $('#stop').click(function() { 
    $(this).attr('id', 'stop'); 
    $(this).val('Stop'); 
  }); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<input type="button" id="start" value="Start" />

Не работает.

Как можно реализовать?

Answer 1

var btn = document.querySelector('#start'); 
 
btn.addEventListener('click', function() { 
  btn.value = (btn.value == 'Start' ? 'Stop' : 'Start'); 
})
<input type="button" id="start" value="Start" />

Answer 2

Если вы хотите менять только сообщение, то зачем же меняете еще и ID кнопки?

Наиболее простой и, вероятно, понятный для вас код будет таким

$("#start").click(function(){       
   var v = $(this).val(); 
    
   switch(v){ 
      case 'start': v = 'stop';  break; 
      case 'stop':  v = 'start'; break; 
   } 
    
   $(this).val(v);       
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<input type="button" id="start" value="start"/>

Хотя, это возможны и более короткие варианты записи, приводящие к тому же эффекту.

$("#btn1").click(function(){ 
   var msgs = ['stop', 'start']; 
   var v = $(this).val(); 
   $(this).val( msgs[ +(v == 'stop') ] ); 
}); 
 
$("#btn2").click(function(){ 
   var cfg = { stop: 'start', start: 'stop' }; 
   var v = $(this).val(); 
   $(this).val( cfg[v]); 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<input type="button" id="btn1" value="start"/> 
<input type="button" id="btn2" value="start"/>

и прочие вариации, например, используя data-атрибуты

Answer 3

Вариант с созданием класса Toggle

function Toggle(values) { 
  //сырой массив 
  this.raw = values; 
  //текущий индекс 
  this.head = 0; 
  //итератор 
  this.iter = function() { 
     this.head = (this.head < this.raw.length - 1) ? this.head + 1 : 0; 
  } 
  //получить текущее значение массива 
  this.getCurrent = function () { 
     return this.raw[this.head]; 
  } 
} 
 
 
window.onload = function () { 
   
  //объявление 
  var tog = new Toggle(["start","stop"]); 
  //добавление элемента, это можно было сделать при инициалиации но здесь оно нужно для наглядности 
  tog.raw.push("pause"); 
   
   
  var bind = document.getElementById("bind"); 
  bind.value = tog.getCurrent(); 
  bind.addEventListener("click", function() { 
    //итерируемся 
    tog.iter(); 
    bind.value = tog.getCurrent(); 
  }); 
}
<input type="submit" value="" id="bind">

READ ALSO
Как получить массив точек на Yandex map?

Как получить массив точек на Yandex map?

Нужно объединить множество точек в кластерыДля этого необходимо их сначала получить и поместить в массив

157
EventListener ошибка в консоли при запуске кода

EventListener ошибка в консоли при запуске кода

Имеется попап, который на момент запуска кода еще не существует в DOM и добавляется он туда только при определенных действиях пользователя...

172