Hando
@Hando
Верстак

Почему лагает простой скрипт на JavaScript?

Добрый день всем.
У меня стояла следующая задача: реализовать изменение текста в нескольких блоках при клике по диву или по чекбоксу его дублирующему. При повторном клике - текст менялся обратно, на исходный.

Я совсем не силен в js, честно говоря я его не знаю абсолютно, как и другие языки программирования. Я начинающий верстальщик. Поэтому мое решение было таковым.
Вот див и чекбокс при клике на которые меняется текст в определенных блоках:
<!-- Div -->
<div class="switch-subtitle" id="status-info" onclick="(el = document.getElementById('myonoffswitch')).checked = !el.checked">Не включено</div>

<!-- Chekbox -->
<div class="onoffswitch">
<input type="checkbox" name="onoffswitch" class="onoffswitch-checkbox" id="myonoffswitch">
                            <label class="onoffswitch-label" for="myonoffswitch">
                                <div class="onoffswitch-inner"></div>
                                <div class="onoffswitch-switch"></div>
                            </label>
 </div>


А вот и сам скрипт. Он уродлив, я знаю, но я очень слаб в js:

<script language="JavaScript" type="text/javascript"> 
$("#myonoffswitch").change(function(){ 
if($(this).attr("checked")){ 
    $(this).text('Включено');
    $("#text1").html('1');
    $("#text2").html('2');
    $("#text3").html('3');
    $("#price1").html('999 <span>руб./мес.</span>');
    $("#price2").html('1999 <span>руб./мес.</span>');
    $("#price3").html('2499 <span>руб./мес.</span>');
    $("#status-info").html('Включено');
}else{ 
    $(this).text('Не включено');
    $("#text1").html('Лайт');
    $("#text2").html('Оптима');
    $("#text3").html('Бизнес');
    $("#price1").html('380 <span>руб./мес.</span>');
    $("#price2").html('749 <span>руб./мес.</span>');
    $("#price3").html('1599 <span>руб./мес.</span>');
    $("#status-info").html('Не включено');
}}); 
</script>
<script>
    $("#status-info").toggle(
      function () {
        $(this).text('Включено');
        $("#text1").html('1');
        $("#text2").html('2');
        $("#text3").html('3');
        $("#price1").html('999 <span>руб./мес.</span>');
        $("#price2").html('1999 <span>руб./мес.</span>');
        $("#price3").html('2499 <span>руб./мес.</span>');
        $("#status-info").html('Включено');
       
      },
      function () {
        $(this).text('Не включено');
        $("#text1").html('Лайт');
        $("#text2").html('Оптима');
        $("#text3").html('Бизнес');
        $("#price1").html('380 <span>руб./мес.</span>');
        $("#price2").html('749 <span>руб./мес.</span>');
        $("#price3").html('1599 <span>руб./мес.</span>');
        $("#status-info").html('Не включено');
      }
    );
  </script>


Он работает, но иногда при нажатии на див - для возврата исходного текста - чекбокс и див меняют свои значения, а вот информация в текстовых блоках не меняется. Объясните в чем моя ошибка и если не трудно подскажите, как можно написать скрипт более грамотно. Спасибо.
  • Вопрос задан
  • 3007 просмотров
Пригласить эксперта
Ответы на вопрос 3
Думаю как верстальщику в данном случае сделать в CSS 2 класса для обеих позиций. Один класс будет с display:none, другой собственно показывается. При переключении кнопки, JS всего лишь будет менять класс у блока, таким образом будет меняться содержимое.
Это проще и меньше геммороя, тем более судя по всему блоки вкл/выкл похожи.

По коду, лучше чтоб не повторяться вынести оба блока в отдельные функции и запускать только функции. Но думаю лучше всего все-таки реализовать это с помощью CSS. Как подсказывает комментатор iiil можно еще и дата атрибуты повесить, а с помощью псевдоэлементов подставлять необходимые данные.
Ответ написан
Комментировать
iiil
@iiil
Инженер и вэб-дизайнер, рисую.
Судя по задаче можно сильно сократить Ваш код, используя дата-атрибуты.
Ответ написан
Комментировать
DeLaVega
@DeLaVega
Верстаю, фронтэндю =)
Я написал чутка кода, должно работать, просто чутка подправьте под свой хтмл, если будут вопросы, пишите.

codepen.io/anon/pen/pIanw
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы