#javascript
#javascript
Вопрос:
У меня есть содержащий div, который сам по себе действует как кнопка…
Однако при нажатии я настраиваю его на расширение и отображение дополнительной информации, в то же время открывая кнопку закрытия в правом верхнем углу…
Теперь, когда я нажимаю кнопку закрытия, выполняется функция закрытия, но также и onclick div для открытия, так что конечный результат, ну… Ничего не происходит…
Лол…
Пример с fiddle тоже не работает, и я нахожусь на грани срыва…
Ответ №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:
ОБНОВЛЕНО, Вы можете:
-
Поставьте
margin-top
on#inner
, чтобы пользователь не нажимал на оба одновременно (или какое-то смещение от верхнего края#outer
). (Обновление: отклонено, CSS-решение) -
Или запустите другую функцию для каждого
div
, напримерinnerToggle()
иouterToggle()
. Таким образом, вы даже можете вызвать один из другого. (Обновление: , что привело к решению 2a.)2a. Другой способ сделать это — просто запустить событие только для
#outer
? Если#inner
щелкнуть, событие всплывет и#outer
вызовет переключение, как показано здесь. -
Или отключите событие щелчка для одного или другого по мере необходимости. (Обновление: Смотрите решение @DanneMarne.)
-
Или установите пользовательское свойство для каждого объекта, например,
$('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