Элементы переходят друг через друга?

#javascript

#javascript

Вопрос:

У меня есть содержащий div, который сам по себе действует как кнопка…

Однако при нажатии я настраиваю его на расширение и отображение дополнительной информации, в то же время открывая кнопку закрытия в правом верхнем углу…

Теперь, когда я нажимаю кнопку закрытия, выполняется функция закрытия, но также и onclick div для открытия, так что конечный результат, ну… Ничего не происходит…

Лол…

Пример с fiddle тоже не работает, и я нахожусь на грани срыва…

http://jsfiddle.net/VeyeY/5/

Ответ №1:

Вы могли бы либо вернуть false из onclick, чтобы закрыть div. Это гарантирует, что событие click не будет распространяться.

Другим решением было бы вызвать preventDefault() и stopPropagation() для самого события. Это также гарантирует, что событие не продолжится.

Редактировать:

Во всех происходящих событиях (onclick, onchange, onmouseover и т.д.) Всегда существует возможная переменная события, которую вы можете либо игнорировать, если хотите, либо извлекать информацию из. В вашем примере, я думаю, самым простым способом работы с переменной event было бы сделать что-то вроде этого:

 <div id="inner" onclick="toggle(false); event.preventDefault(); event.stopPropagation();">
  

Теперь на это немного некрасиво смотреть, и вы действительно не хотите иметь дело с этим в html-разметке, поэтому другим вариантом было бы передать переменную event в вашу функцию следующим образом:

 <div id="inner" onclick="toggle(event, false)">
  

и затем в javascript:

 function toggle(event, x){
    // Do your thing

    event.preventDefault();
    event.stopPropagation();
}
  

Есть много вещей, которые вы могли бы сделать с переменной event. Например, вместо передачи true или false вашей функции, вы могли бы проверить, какой узел инициировал событие следующим образом:

 if(event.originalTarget.id == "inner"){
    // Inner was clicked
}else if(event.originalTarget.id == "outer"){
    // Outer was clicked
}
  

Комментарии:

1. Хммм… Это звучит интересно… Я новичок в JS, так что эти два являются новыми… Не могли бы вы объяснить (или указать мне на объяснение), что вы здесь предлагаете?

2. Это было описательно… Спасибо, приятель … 🙂

Ответ №2:

ОБНОВЛЕНО, Вы можете:

  1. Поставьте margin-top on #inner , чтобы пользователь не нажимал на оба одновременно (или какое-то смещение от верхнего края #outer ). (Обновление: отклонено, CSS-решение)

  2. Или запустите другую функцию для каждого div , например innerToggle() и outerToggle() . Таким образом, вы даже можете вызвать один из другого. (Обновление: , что привело к решению 2a.)

    2a. Другой способ сделать это — просто запустить событие только для #outer ? Если #inner щелкнуть, событие всплывет и #outer вызовет переключение, как показано здесь.

  3. Или отключите событие щелчка для одного или другого по мере необходимости. (Обновление: Смотрите решение @DanneMarne.)

  4. Или установите пользовательское свойство для каждого объекта, например, $('outer').toggled = false которое будет записывать текущее состояние каждого объекта. (Обновление: неважно, не очень полезно).

Обновление: Итак, после небольшого тестирования я бы выбрал 2a.

Комментарии:

1. Во-первых, потрясающий подход к ответу на вопрос с вариантами моего возможного курса действий… Что касается моей проблемы, то первый вариант неосуществим (css держит меня за горло, и у меня больше нет намерений ее откармливать), я пробовал разные функции, и все равно в итоге получилось то же самое… Отключить щелчок, удалив атрибут ‘onclick’? И я все еще новичок в JS, поэтому jQuery намного превосходит меня … :-p

2. Я исследовал идеи в контексте вашего примера, некоторые хорошие, некоторые плохие. Похоже, вам не нужно запускать onclick for #inner , поскольку кнопка закрытия все равно находится в #outer . Также я подтверждаю, что Javascript странно ведет себя в JSFiddle, вероятно, простая настройка, которую я слишком ленив, чтобы исправить. 🙂

3. Но, видите ли, допустим, что есть окно, когда вы нажимаете на это поле, оно расширяется и показывает больше информации, а также маленькую кнопку закрытия в правом верхнем углу… Теперь нажатие этой кнопки закрытия (я выбираю использовать Div по какой-либо причине, назовите это вызовом) также вызовет действие onclick родительского div, следовательно, не закрывая окно … :- ( Если я полагаюсь исключительно на родительский переключатель, то щелчок в любом месте приведет к закрытию окна…

Ответ №3:

Вы можете отключить функцию щелчка DIVs после раскрытия. И вы можете повторно включить эту функцию щелчка при нажатии кнопки закрытия.

Комментарии:

1. Видите ли, что я сделал, так это то, что при нажатии на внешний div я выполняю процесс переключения и УДАЛЯЮ свойство onclick для внешнего div… Итак, из внутреннего div запускается только одно событие, да? (outer.removeAttribute(‘onclick’)), Мне, очевидно, придется добавить атрибут снова после того, как я щелкну по внутреннему div, но что происходит, так это то, что как только щелкает внутренний div, внешний получает свой щелчок обратно, и это тоже срабатывает, и я оказываюсь в том же месте, с которого начал… Расстраивает … :-p