Остановить onclick при стрельбе, когда onclientclick является ложным?
Можно ли использовать свойство onclientclick
кнопки для выполнения проверки клиентов. Если проверка возвращает true
, тогда запустите событие onclick
. Если проверка clientside возвращает false
, не запускайте событие onclick
.
Возможно ли это?
UPDATE:
Эти 2 работы:
Stops the form from submitting:
OnClientClick="return false;"
Allows the form to submit:
OnClientClick="return true;"
Следующие 2 не работают:
// in js script tag
function mycheck() {
return false;
}
// in asp:button tag
OnClientClick="return mycheck();"
// in js script tag
function mycheck() {
return true;
}
// in asp:button tag
OnClientClick="return mycheck();"
Он представляет форму оба раза.
Почему это?
Ответы
Ответ 1
Вы хотите добавить return
внутри OnClientClick после вызова функции. В противном случае кнопка будет отсылаться обратно, даже если функция возвращает false.
<asp:button ID="Button1" runat="server" OnClick="Button1_Click"
OnClientClick="return checkValidation()" Text="Submit" />
<script type="text/javascript">
function checkValidation() {
return confirm('Everything ok?');
}
</script>
Ответ 2
Конечно. Если вы используете return false
в своем OnClientClick
, это предотвратит любую навигацию. Таким образом, вы будете выглядеть так:
<asp:LinkButton runat="server" OnClientClick="if(!ValidatePage()) { return false;}" />
Ответ 3
Да, вы можете, В вызове функции onclientClick используйте preventDefault()
function onclientClickFun(e)
{
if(!IsValidationSuccess)
{
e.preventDefault();
}
}
ИЛИ
function onclientClickFun(e)
{
if(!IsValidationSuccess)
{
return false;
}
}
Ответ 4
Я тоже столкнулся с этой проблемой. Не хотелось бы, чтобы OnClientClick = return false на каждой ссылке. С простой страницей просто проще использовать якорь и избегать asp, заполняющего href для вас.
Однако это не всегда возможно. Таким образом, простой вывод заключается только в том, чтобы наследовать LinkButton и добавить переменную типа AutoPostBack. if false, то просто переопределите вывод с помощью html или добавьте OnClientClick. Мне не нравятся встроенные теги.
namespace My.WebControls {
[ToolboxData("<{0}:LinkButton runat=server ID=btn></{0}:LinkButton>"), ParseChildren(true), ToolboxItem(true)]
public class LinkButton : System.Web.UI.WebControls.LinkButton {
private bool _postback = true;
[Bindable(true), Category("Behavior"), DefaultValue(true), Description("Gets or Sets the postback click behavior")]
public bool AutoPostBack { get { return _postback; } set { _postback = value; } }
protected override void Render(System.Web.UI.HtmlTextWriter writer) {
if(!AutoPostBack){
this.OnClientClick = "return false";
}
base.Render(writer);
}
}
}
Многие атрибуты должны обрабатываться в ViewState, но в этом случае я думаю, что мы хороши;
Ответ 5
На странице сервера создайте кнопку:
var button1 = new Button();
button1.ServerClick += new EventHandler(button1_ServerClick);
button1.OnClientClick = SetJsForSaveBtn();
button1.Attributes.Add("UseSubmitBehavior", "false");
panel.Controls.Add(button1 );
//Содержит код сервера
private void saveBtn_ServerClick(object sender, EventArgs e)
{
//do something if ClientClick returns true
}
//Содержит код JS для страницы
LiteralControl js = new LiteralControl();
panel.Controls.Add(js);
js.Text [email protected]"<script type='text/javascript'>
$(document).ready(function(){
function CheckValidationOnClient(){
if(!ValidatePage()){
return false;
}
else{
return true;
}
};
});
</script> ";
private string SetJsForSaveBtn()
{
var jsfunc = @" return CheckValidationOnClient()";
return jsfunc ;
}