题
我使用YUI 2.7.0和Struts为我的项目,有两个提交按钮的形式。一个是保存和另一个用于删除。该表单提交到了DispatchAction。我已经成功添加的onclick听众,但问题是,表单提交的听众执行之前。我需要的表单提交之前设置分发参数。我该怎么做呢?下面是我到目前为止有:
<form name="adminUserForm" method="post" action="manage_user.do">
<input type="hidden" id="dispatch" name="dispatch" value="unspecified"/>
<!-- other form fields here -->
<input type="submit" value="Save User" id="saveUser">
<input type="submit" value="Delete User" id="deleteUser">
</form>
<script type="text/javascript">
function confirmDelete(msg)
{
if (confirm(msg))
{
return setDispatchMethod("delete");
}
else
return false;
}
function setDispatchMethod(methodName)
{
dispatchField = document.getElementById("dispatch");
dispatchField.value = methodName
return true;
}
var onClickSaveUser = function (e)
{
return setDispatchMethod('save');
};
var onClickDeleteUser = function (e)
{
return confirmDelete('Are you sure you want to delete the user?');
};
new YAHOO.widget.Button("deleteUser", {onclick: {fn: onClickDeleteUser }});
new YAHOO.widget.Button("saveUser", {onclick: {fn: onClickSaveUser }});
</script>
解决方案
问题是雅虎的按钮组件代码处理click事件,并在其中,他们编程方式提交表单。他们的事件处理程序之前,你叫,所以形式事件处理程序甚至被调用之前提交。
下面是一些想法(它们都工作):
方式1 强>
处理MouseDown事件而不是点击事件(点击鼠标按下之前火灾)。
var deleteUserButton = new YAHOO.widget.Button("deleteUser");
deleteUserButton.on("mousedown", onClickDeleteUser);
var deleteUserButton = new YAHOO.widget.Button("saveUser");
deleteUserButton.on("mousedown", onClickSaveUser);
//Using this, you can easily stop the form from submitting
//by using YAHOO's event utility (by adding this code, you
//will prevent the click event from firing as well).
YAHOO.util.Event.preventDefault(e);
方式2 强>
使用类型=链路代替类型=提交(默认)。他们只提交表单,如果类型=提交(我没有测试过这还不够,看看是否仍形式本身提交 - 您可能必须手动调用form.submit())
new YAHOO.widget.Button("deleteUser", { type: 'link', onclick: { fn: onClickDeleteUser} });
new YAHOO.widget.Button("saveUser", { type: 'link', onclick: { fn: onClickSaveUser} });
方式3 强>
在他们的代码看,我注意到他们创建一个隐藏字段与被点击提交表单(仅按钮)按钮的名称。输入标签必须有一个name属性,和你没有,那么你就需要增加一个。然后在服务器上,你只检查是否存在隐藏字段的值(你的价值属性)。
无论其是否使用,你应该用这个来阻止提交表单这些方法:
YAHOO.util.Event.preventDefault(e);
其他提示
这里是一个简单的解决方案
<form>
<input type="submit" name='dispatch' value="Save User" id="saveUser">
<input type="submit" name='dispatch' value="Delete User" id="deleteUser">
</form>
可以去除隐藏输入
和您的调度请求变量将被设置为“保存用户”如果第一按钮被点击
或“删除用户”是第二被点击
此问题是几年前的,但我仍然使用YUI 2.9.0有一个项目,我只是碰到了同样的问题,所以我会分享我的情况下,别人发现自己在同一个果酱的解决方案。
几件事情值得注意这个问题。首先,问题加布里埃尔介绍,这里的YUI 2.9.0按钮单击处理程序提交表单的点击处理程序之前被调用不在IE有问题,至少通过IE9。通过至少FF12火狐,出现问题。我怀疑这也将是在Chrome,Safari浏览器的一个问题,也是最如果不是所有其他的浏览器,以及我看到的似乎是在YUI按钮单击处理程序对IE的一个特例。
另外,我不喜欢任何解决方案加布里埃尔建议的。使用链接按钮失效我已经应用到我的提交按钮的所有自定义样式,用鼠标按下处理程序失去了一些点击的用户界面语义的,出于某种原因,YUI巴顿失去了原来的名字的田径运动,我给了提交按钮或者,至少,它没有显示在服务器侧所张贴的值。在加布里埃尔的链接按钮的精神,但是,我替换的输入按钮,默认不提交的提交按钮,然后添加一个隐藏的输入并提交表单自己:
...
<form id='form'>
<input type="button" value=">" id="start_survey">
...
function start_survey (p_oEvent, p_aArgs) {
var input = document.createElement ('input');
input.type = 'hidden';
input.name = this.get ('name');
input.value = '>'
var form = YAHOO.Dom.get ('form');
form.appendChild (input);
form.submit();
}
new YAHOO.widget.Button ("start_survey", {onclick: {fn: start_survey}});
...
最后,由于YUI被提交上点击的形式,另一种解决方案应该是刚好赶上表单提交事件,并检查事件的目标是你的按钮,你需要做什么,然后让提交走或停它,根据需要。