手风琴面板不应在 if 条件下打开 - coffeescript
accordion panel should not open on if condition - coffeescript
我的 .html.slim
文件中有一个手风琴,它有两个面板。
Panel 1
有一个带有一些条款和条件文本的复选框。
Panel 2
有什么
#accordion.panel-group aria-multiselectable="true" role="tablist"
.panel.panel-default
#headingStepOne.panel-heading role="tab"
.panel-title
a.collapsed aria-controls="collapseStepOne" aria-expanded="true" data-parent="#accordion" data-toggle="collapse" href="#collapseStepOne" role="button"
| Panel 1
#collapseStepOne.panel-collapse.collapse.in aria-labelledby="headingStepOne" role="tabpanel"
.panel-body
.row
input[
id='my-checkbox'
name='my-checkbox'
type='checkbox'
value='my-text'
required='true'
]
text.mar-left-12 Accept Terms & Conditions
.panel.panel-default
#headingStepTwo.panel-heading role="tab"
.panel-title
a.collapsed aria-controls="collapseStepTwo" aria-expanded="true" data-parent="#accordion" data-toggle="collapse" href="#collapseStepTwo" role="button"
| Panel 2
#collapseStepTwo.panel-collapse.collapse aria-labelledby="headingStepTwo" role="tabpanel"
.panel-body
.row
label something
要求:
- 在用户未选中面板 1 中的复选框之前,不应打开面板 2。
CoffeeScript
$(document).on 'click', '.panel-heading', (e) ->
panel = $(this).find('a').attr('href')
if panel == '#collapseStepTwo' && !$('#my-checkbox').is(':checked')
e.preventDefault()
e.stopPropagation()
return
$('.panel-collapse.in').collapse('hide')
$(panel).collapse('show');
问题:
当面板 1 中的复选框未选中时单击 Panel 2
,它进入 if condition
和 return 但仍然打开 Panel 2
,同时保持面板 1 保留打开。
这意味着 Panel 2
没有从 $(panel).collapse('show');
打开,因为如果控件不是 return 来自 if 条件 $('.panel-collapse.in').collapse('hide')
应该关闭面板 1.
发生这种情况是因为 Bootstrap 将其事件侦听器绑定到手风琴。
您可以通过停止事件传播来阻止这些侦听器触发。
在你的例子中,你试图停止传播 click
事件,但是 bootstrap 有它自己的事件,这些事件在手风琴打开或关闭时触发。
你可以这样做
$(document).on "show.bs.collapse", "#collapseStepTwo, (e) ->
if !$('#my-checkbox').is(':checked')
e.stopPropagation()
您可以在此处了解有关 Bootstrap 手风琴的更多信息:
https://getbootstrap.com/docs/3.4/javascript/#collapse-events
我的 .html.slim
文件中有一个手风琴,它有两个面板。
Panel 1
有一个带有一些条款和条件文本的复选框。Panel 2
有什么#accordion.panel-group aria-multiselectable="true" role="tablist" .panel.panel-default #headingStepOne.panel-heading role="tab" .panel-title a.collapsed aria-controls="collapseStepOne" aria-expanded="true" data-parent="#accordion" data-toggle="collapse" href="#collapseStepOne" role="button" | Panel 1 #collapseStepOne.panel-collapse.collapse.in aria-labelledby="headingStepOne" role="tabpanel" .panel-body .row input[ id='my-checkbox' name='my-checkbox' type='checkbox' value='my-text' required='true' ] text.mar-left-12 Accept Terms & Conditions .panel.panel-default #headingStepTwo.panel-heading role="tab" .panel-title a.collapsed aria-controls="collapseStepTwo" aria-expanded="true" data-parent="#accordion" data-toggle="collapse" href="#collapseStepTwo" role="button" | Panel 2 #collapseStepTwo.panel-collapse.collapse aria-labelledby="headingStepTwo" role="tabpanel" .panel-body .row label something
要求:
- 在用户未选中面板 1 中的复选框之前,不应打开面板 2。
CoffeeScript
$(document).on 'click', '.panel-heading', (e) ->
panel = $(this).find('a').attr('href')
if panel == '#collapseStepTwo' && !$('#my-checkbox').is(':checked')
e.preventDefault()
e.stopPropagation()
return
$('.panel-collapse.in').collapse('hide')
$(panel).collapse('show');
问题:
当面板 1 中的复选框未选中时单击 Panel 2
,它进入 if condition
和 return 但仍然打开 Panel 2
,同时保持面板 1 保留打开。
这意味着 Panel 2
没有从 $(panel).collapse('show');
打开,因为如果控件不是 return 来自 if 条件 $('.panel-collapse.in').collapse('hide')
应该关闭面板 1.
发生这种情况是因为 Bootstrap 将其事件侦听器绑定到手风琴。
您可以通过停止事件传播来阻止这些侦听器触发。
在你的例子中,你试图停止传播 click
事件,但是 bootstrap 有它自己的事件,这些事件在手风琴打开或关闭时触发。
你可以这样做
$(document).on "show.bs.collapse", "#collapseStepTwo, (e) ->
if !$('#my-checkbox').is(':checked')
e.stopPropagation()
您可以在此处了解有关 Bootstrap 手风琴的更多信息:
https://getbootstrap.com/docs/3.4/javascript/#collapse-events