Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   как сократить названия классов с общим началом в массиве (https://javascript.ru/forum/misc/69381-kak-sokratit-nazvaniya-klassov-s-obshhim-nachalom-v-massive.html)

Alessio18911 18.06.2017 22:26

как сократить названия классов с общим началом в массиве
 
Привет! К JS только-только подступился, но кое-что уже знаю. Проблема такая. Есть кусочек кода:
<div class="page bg1">
      <div class="radio-controls">
        <label class="label" for="radio1"></label>
        <label class="label" for="radio2"></label>
        <label class="label" for="radio3"></label>
      </div>
</div>


и к нему CSS:
.page {
  position: relative;
  width: 400px;
  height: 250px;
  outline: 1px solid orange;
}

.bg1 {
  background-image: url("Gora-400x250.jpg");
}

.bg2 {
  background-image: url("IMG_0863m.jpg");
}

.bg3 {
  background-image: url("Torosskie-goryi-400x250.jpg");
}

.radio-controls {
  position: absolute;
  bottom: 0;
  left: 50%;
  margin-left: -55px;
  width: 110px;
  height: 50px;
  text-align: center;
  line-height: 65px;
  outline: 1px solid red;
}

label {
  display: inline-block;
  width: 20px;
  height: 20px;
  background-color: dodgerblue;
  background-clip: padding-box;
  border: 5px solid transparent;
  border-radius: 50%;
  box-shadow: 0 0 2px 1px dodgerblue;
}


Нужно сделать так, чтобы при клике по любому label у div.page удалялся бы любой класс, имя которого начинается с bg-, если вдруг он обнаружился. Всё, что удалось мне придумать, это длинные условия, вроде:
if(page[0].classList.contains("bg1") || page[0].classList.contains("bg2"))
и т.д... А можно ли как-то укоротить текст условия? Ну, например, как в CSS есть селекторы по атрибуту [class^='bg-'], есть ли что-то подобное в синтаксисе JS?

рони 18.06.2017 22:44

Alessio18911,
если в у div.page всего 2 класса "[class*='bg']"

рони 18.06.2017 22:45

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

ruslan_mart 18.06.2017 22:48

var page = document.querySelector('.page');

page.onclick = function(e) {
    if(e.target.tagName === 'label') {
        for(var i = 0; i < this.classList.length; i++) {
            if(this.classList[i].indexOf('bg') === 0) {
                this.classList.remove(this.classList[i]);
                break;
            }
        }
    }
};


или

var page = document.querySelector('.page');

page.onclick = function(e) {
    if(e.target.tagName === 'label') {
        this.className = this.className.replace(/bg\d+/, '');
    }
};

Alessio18911 18.06.2017 22:52

Цитата:

Сообщение от рони (Сообщение 455824)
Alessio18911,
если в у div.page всего 2 класса "[class*='bg']"

У меня их три: bg1, bg2, bg3. Т.е. не получится? Наверное, надо пояснить, для чего я это делаю. Смысл в следующем: я хочу сделать слайдер. И div.page, в зависимости от того, какой label кликнут, должны присваиваться соответственно bg1, bg2, bg3. Но для того, чтобы переключение работало и в обратном порядке, нужно, чтобы прежде чем присвоить нужный класс, очистить div.page от другого bg.

рони 18.06.2017 22:53

Цитата:

Сообщение от Alessio18911
Т.е. не получится?

получится уточните только где менять -- все или в том где клик?

Alessio18911 18.06.2017 22:56

Цитата:

Сообщение от Ruslan_xDD (Сообщение 455828)
var page = document.querySelector('.page');

page.onclick = function(e) {
    if(e.target.tagName === 'label') {
        for(var i = 0; i < this.classList.length; i++) {
            if(this.classList[i].indexOf('bg') === 0) {
                this.classList.remove(this.classList[i]);
                break;
            }
        }
    }
};


или

var page = document.querySelector('.page');

page.onclick = function(e) {
    if(e.target.tagName === 'label') {
        this.className = this.className.replace(/bg\d+/, '');
    }
};

Спасибо! Второй вариант понятнее. Только Вы могли бы пояснить мне (/bg\d+/, '')? :)

рони 18.06.2017 22:57

:write: зачем проверка нужна ??? className = "page"

Alessio18911 18.06.2017 22:57

Цитата:

Сообщение от рони (Сообщение 455831)
получится уточните только где менять -- все или в том где клик?

Наверное, надо пояснить, для чего я это делаю. Смысл в следующем: я хочу сделать слайдер. И div.page, в зависимости от того, какой label кликнут, должны присваиваться соответственно bg1, bg2, bg3. Но для того, чтобы переключение работало и в обратном порядке, нужно, чтобы прежде чем присвоить нужный класс, очистить div.page от другого bg.

рони 18.06.2017 23:04

Цитата:

Сообщение от Alessio18911
очистить div.page от другого bg.

можно не очищать className = "page bg1"


Часовой пояс GMT +3, время: 16:38.