Скрыть и показать Переключить, что функции в ПК и мобильных браузерах - PullRequest
0 голосов
/ 20 мая 2019

У меня есть тумблер, который отображает / скрывает следующий элемент, используя onclick:

function toggleSwitch(z){
        var x,a;
        x=/(di-0)/i;
        if(x.test(z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue)){a=1}else{a=0}
        switch (a){
            case 1:
                z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue='di-2';
                break;
            case 0:
                z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue='di-0';
                break;
            }
    }

Как мне написать JavaScript, который, возможно, будет совместим с большинством ПК и мобильных браузеров?

Демо

    function toggleSwitch(z){
        var x,a;
        x=/(di-0)/i;
        if(x.test(z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue)){a=1}else{a=0}
        switch (a){
            case 1:
                z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue='di-2';
                break;
            case 0:
                z.d.nextElementSibling.attributes.getNamedItem('class').nodeValue='di-0';
                break;
            }
    }
.di-0{display:none!important}.di-1{display:inline-block}.di-2{display:block}.di-3{display:grid}
    <div class="ro">
        <a href="#" class="s18 ro tx-1 b119 r100 t-21 p-2 br-5 mv-3" onclick="toggleSwitch({d:this});return false;" title="A latest quote">? Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT</a>
        <div class="di-0">Display Some Content</div>
    </div>

1 Ответ

1 голос
/ 22 мая 2019

Если я правильно понимаю, вы можете использовать для этой цели теги details и summary (оба новые в HTML5).

Широко поддерживается на обоихмобильные и настольные браузеры, кроме псевдобраузеров Internet Explorer , Edge и Edge Mobile .

Что ж, JavaScript придет на помощь, еслимы хотим убедиться, что наша функция переключения работает как на реальных, так и на псевдобраузерах.(Извините, jQuery, не в этот раз. Вы можете спасти мир в другой раз.)

Решение с JavaScript без jQuery

Примечания:

  1. Использование элемента привязки (a) не очень хорошая идея, поскольку оно имеет другое семантическое и функциональное значение.Например, вы можете использовать элемент button, который лучше подходит как в семантическом, так и в функциональном смысле.Тем не менее, из-за того, что есть дополнительная работа для придания кнопке привлекательного вида, я просто заменил a на элемент div.Вы также можете использовать CSS-свойство cursor: pointer для этого div, чтобы добиться того же визуального эффекта, который имеет a.

  2. Следует избегать неоднозначных именованных переменных.Для лучшей читаемости и упрощения обслуживания в будущем всегда присваивайте своим переменным осмысленное имя.

  3. Я переименовал функцию toggleSwitch в toggleNext, поскольку она больше говорит о назначениикнопка.Кроме того, вы можете просто работать с Java Script Events , если вы хотите получить доступ к исходному элементу DOM через event.target

  4. Функция toggleNext имеет дополнительную опциюпараметр называется display.Который по умолчанию block, и используется для установки видимого состояния отображения следующего родственного элемента.Это должно дать вам больше игровой комнаты, так как вы можете просто передать отображаемое значение для произвольного элемента родного брата, как toggleNext(event, 'grid')

  5. В функции toggleNext(event, display) мы сначала получаем siblingElemиз нашего ссылочного элемента (event.target), а затем проверьте, имеет ли его свойство display значение 'none', если так, то нам нужно переключить состояние, просто назначив этому элементу новое отображаемое значение.

  6. В исходном состоянии siblingElem.style.display имеет значение null, поэтому мы проверяем !siblingElem.style.display, это необходимо в первый раз.

  7. Радидля ясности, я удалил классы (s18 ro tx-1 b119 r100 t-21 p-2 br-5 mv-3) из элемента div, который вы указали в своем OP.

<div class="ro">
  <div class="toggle-button" onclick="toggleNext(event)" title="A latest quote">
    ?  Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT
  </div>
  <div>Display Some Content</div>
</div>
/* Display pointer on hover */
.toggle-button {
  cursor: pointer;
}

/* Hide the next sibling element - does not matter what type it is */
.toggle-button + * {
  display: none;
}
function toggleNext(event, display) {
  var siblingElem = event.target.nextElementSibling;

  if (!siblingElem) return;

  display = display || 'block';

  if (!siblingElem.style.display || siblingElem.style.display === 'none') {
    siblingElem.style.display = display;
  } else {
    siblingElem.style.display = 'none';
  }
}

Stackblitz: https://stackblitz.com/edit/emma-toggle-2-1?file=index.html

Теперь у вас есть еще больше игровой комнаты, вы можете логически привязать одну кнопку-переключатель к другой, например:

<div class="ro">
  <div class="toggle-button" onclick="toggleNext(event)" title="A latest quote">
    ?  Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT
  </div>
  <div>
    Display Some Content

    <div class="toggle-button" onclick="toggleNext(event)" title="A latest quote">
      ?    Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT
    </div>
    <div>
      Display Some Another Content
    </div>
  </div>
</div>

Stackblitz: https://stackblitz.com/edit/emma-toggle-2-2?file=index.html


Решение без JavaScript (<details>)

<details>
  <summary>? Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT</summary>
  Display 
  Some 
  Content
  ?
</details>
<br>
<details>
  <summary>Another entry: Monday, 13 May 2019 ⏱ 19:07 EDT</summary>
  <h1>Display some other content</h1>
</details>

Stackblitz: https://stackblitz.com/edit/emma-toggle-1-1?file=index.html

Кроме того, вы также можете вложить details в другой тег details:

<details>
  <summary>? Average Daily Equilibrium Forecast: Monday, 13 May 2019 ⏱ 19:07 EDT</summary>
  <details>
    <summary>
      Display  Some  Content
    </summary>
    <h1>Display some other content</h1>
  </details>
</details>

Stackblitz: https://stackblitz.com/edit/emma-toggle-1-2?file=index.html

И, наконец, выПри желании можно скрыть показанную стрелку, которая отображается по умолчанию для тега <details>:

  /* this is for Chrome */
  details summary::-webkit-details-marker {
    display:none;
  }
  /* this is for Firefox */
  details summary {
    list-style-type: none;
  }
...