2013-03-15 4 views
1

У меня есть код, чтобы показать/скрыть два div на основе щелчка стрелки. Однако второй div требует двух щелчков, прежде чем он скрывается, и стрелка не изменится, как ожидалось. Верхний div работает отлично. Любые предложения о том, что я делаю неправильно, пожалуйста?Javascript show/hide div требует двух кликов

EDIT - Благодаря двум плакатам, которые указали на мою ошибку имен в стрелках. Однако после загрузки страницы второй div по-прежнему требует двух щелчков, прежде чем он переключится.

HTML

<div id="start_conditions_arrow" class="arrow_down" onclick="toggleDiv('start_conditions')"></div> 
<h2>Starting Conditions</h2> 

<div id="start_conditions"> 
    <%= render :partial => 'start_conditions', :object => @page.start_conditions %> 
</div> 

<div id="probability_arrow" class="arrow_right" onclick="toggleDiv('probability_inputs')"></div> 
<h2>Probability Inputs</h2> 

<div id="probability_inputs"> 
    <%= render :partial => 'probability_inputs', :object => @page.probability_inputs %> 
</div> 

Javascript

var toggleDiv = function(id){ 
var tag = document.getElementById(id).style; 
    if(tag.display == 'none'){ 
     document.getElementById(id).style.display='block'; 
     document.getElementById(id + '_arrow').className='arrow_down'; 
    } else {    
     document.getElementById(id).style.display='none'; 
     document.getElementById(id + '_arrow').className='arrow_right'; 
    } 
}; 

CSS

.arrow_down, .arrow_right { 
    width: 0; 
    height: 0; 
    margin: 12px 12px 0 0; 
    float: left; 
    cursor: pointer; 
} 

.arrow_down { 
    border-left: 10px solid transparent; 
    border-right: 10px solid transparent; 
    border-top: 18px solid #d5d5d5; 
} 

.arrow_right { 
    border-top: 10px solid transparent; 
    border-bottom: 10px solid transparent; 
    border-left: 18px solid #d5d5d5; 
} 

#probability_inputs { 
    display: none; 
} 

#start_conditions { 
    display: none; 
} 

Вот такой Codepen включая выше : https://codepen.io/anon/pen/yXozYJ

+0

может у создать ссылку – PSR

+0

Что тонированное HTML выглядеть? –

+0

Прошу прощения, я не могу предоставить ссылку на этот фрагмент внутреннего Rails-приложения без отображения собственных внутренних данных. Надеюсь, я предоставил достаточно кода, чтобы определить, почему он не работает, как я ожидаю. Пожалуйста, дайте мне знать, если вам нужно больше увидеть. – Serenthia

ответ

1

Я знаю, что я немного опоздал с ответом на этот, но У меня есть решение. Есть два вопроса, которые должны быть решены, и они следующим образом:

  • Идентификатор последнего div неверно, как указано в ответе СКП.
  • Проверка атрибута стиля элемента в методе toggleDiv не учитывает отсутствие атрибута стиля при загрузке страницы.

Что касается первой проблемы, идентификатор должен быть указан probability_inputs_arrow, что устраняет проблему, если стрелка не обновляется при ее переключении. Тем не менее, второй вопрос требует немного больше объяснения ...

При загрузке страницы CSS предоставляется к элементам с идентификаторами probability_inputs и start_conditions, что дает им как значение отображения ни одного. При нажатии на любую из этих стрелок вы извлекаете атрибуты стиля целевого элемента и проверяете свойство отображения , которое при загрузке страницы пуст. Вот почему для достижения желаемого поведения требуется два щелчка, потому что первый щелчок фактически просто устанавливает это значение в инструкции else.

Вот ссылка на обновленную Codepen, который содержит исправления: https://codepen.io/anon/pen/oweELy

3

Вторая стрелка элемент должен иметь probability_inputs_arrow как идентификатор и не probability_arrow, так как вы строите свой идентификатор в функции, как id + '_arrow' и проходите 'probability_inputs'.

+0

Спасибо - это объясняет, почему стрелка не переключалась между указательным и правым. К сожалению, при загрузке страницы мне по-прежнему требуется 2 клика для переключения второго div. – Serenthia

+0

Я бы изменил 'if (tag.display == 'none') {' to 'if (tag.display! = 'Block') {'. –

+0

Спасибо за предложение, но это затем переключает «ошибку двух щелчков» в верхний div. – Serenthia

1

на самом деле вы получаете ошибки здесь

enter image description here

Второй элемент должен иметь иметь probability_inputs_arrow как идентификатор, а не probability_arrow,

+0

Спасибо - это объясняет, почему стрелка не переключалась между указательным и правым. К сожалению, при загрузке страницы мне по-прежнему требуется 2 клика для переключения второго div. – Serenthia

+0

@LizMacfie Перезагрузите страницу и перед тем, как щелкнуть элемент, осмотрите ее в консоли. Я не удивлюсь, если ваш стиль «display» не будет установлен на начальном этапе, а ваш блок 'else' будет запущен. Это объясняет проблему с кликом. –

+0

Оба divs имеют стиль отображения, первоначально заданный в CSS, как показано выше. Удаление этих исходных настроек приводит к обеим переключателям div, требующим двух кликов. – Serenthia

Смежные вопросы