我在一个页面上有一个检票口应用程序,对于同一模型,我们有多种形式,分为不同的选项卡。我需要做的是每当单击选项卡时检查js变量tabDirty
设置为true还是false。如果是true
,如果可以,我将启动confirm
提示符,然后重置该表单并移至单击的选项卡。如果取消,请保留该标签并保持当前更改。
我有这个js警告没有幻想
function warnOnChange(){
if(tabDirty){
decision = confirm('Leave?');
if(decision){
resetTab(); //sets tabDirty back to false
} else {
return false;
}
}
}
我有一个超级简单的检票口行为
public class WarnChangePromptOnClickBehavior extends Behavior {
@Override
public void bind(Component component) {
component.add(JQBehaviors.mouseClick(EditMerchant.WARN_ON_CHANGE));
}
}
并将该行为添加到AjaxFallBackLink
AjaxTabbedPanel<CustomAjaxTab> tabbedPanel = new AjaxTabbedPanel<CustomAjaxTab>("tabbedPanel", tabList, new Model<>(0)) {
private static final long serialVersionUID = 1L;
@Override
protected WebMarkupContainer newLink(final String linkId, final int index) {
AjaxFallbackLink<Void> link = new AjaxFallbackLink<Void>(linkId) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(final AjaxRequestTarget target) {
TabbedPanel<CustomAjaxTab> selectedTab = setSelectedTab(index);
CustomAjaxTab tab = tabList.get(index);
if (target != null) {
tab.getPanel(linkId);
target.add(selectedTab);
}
onAjaxUpdate(target);
}
};
link.add(new WarnChangePromptOnClickBehavior());
return link;
}
};
当前的行为是,如果没有更改,则选项卡不会切换提示。如果有更改,则提示我。如果可以,则重置
tabDirty
并转到下一页清除更改。问题是,如果单击“取消”,我仍然会导航到下一个选项卡并丢失更改。我知道我需要更改onClick
中的某些内容,但这只是不向我注册。 最佳答案
拦截JS事件循环并不容易,尤其是在使用Ajax请求时。
这是一种可行的方法:
在warnOnChange()
中,如果dirty
,则调用event.preventDefault()
和event.stopImmediatePropagation()
。这将告诉浏览器不要遵循链接/进行Ajax调用。然后像现在一样显示确认对话框。
如果用户按下Cancel
,则无事可做
如果使用确认,则将dirty
设置为false
并执行jQuery(event.target).triggerHandler(event.type)
,即在链接上执行相同的事件(click
)。这次它不会变脏,它将继续进行Ajax调用。
关于java - 将行为添加到Wicket选项卡,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52880552/