我有一个附加到asp.net web表单前端的jQuery(表单的输入控件用标准的asp.net AJAX面板包装),它有一个三个下拉列表,其中有一个附带jQuery:
$(document).ready(function () {
jQuery("select").change(function () {
alert("Hi");
return false;
});
});
下拉列表中有一个服务器端更改事件由ASP.NET附加,就像您希望进行回发一样:
<select name="ctl00$leftContent$cmbPressureUnitsPo" tabindex="6" class="unit" id="cmbPressureUnitsPo" onchange="javascript:setTimeout('__doPostBack(\'ctl00$leftContent$cmbPressureUnitsPo\',\'\')', 0)">
<option value="1">kPag</option>
<option value="1000">Pag (N/m²)</option>
<option selected="selected" value="0.001">MPag</option>
<option value="0.14504">PSIg</option>
<option value="10">mBarg</option>
<option value="0.01">Barg</option>
<option value="0.010197">kgf/cm²</option>
<option value="0.010197">atg</option>
<option value="0.0098692">atmg</option>
<option value="7.5001">torrg (mmHg)</option>
<option value="101.97">mmH₂O</option>
<option value="0.29528">inHg</option>
</select>
唯一的问题是return false不会像我期望的那样压制服务器端事件!如果我实现了一个正常的javascript函数,它会返回false,它会丢失什么?
我也尝试过event.PreventDefault没有效果!
答案 0 :(得分:0)
__doPostBack
方法似乎包含在绑定到onchange处理程序的setTimeout
中。
<select ... onchange="javascript:setTimeout('__doPostBack(\'ctl00$leftContent$cmbPressureUnitsPo\',\'\')', 0)">
你的事件处理程序(通过jQuery绑定到select
元素)将被分开调用(我的猜测,之前,考虑到setTimeout如何工作 - 但你永远不知道......计时器的怪癖)< / p>
答案 1 :(得分:0)
这是因为在运行jQuery绑定事件之前,HTML中的onchange
先运行 。你不能阻止它运行,因为它已经有了。您需要做的是删除 HTML绑定事件,然后通过jQuery添加一个。
$(document).ready(function(){
var $select = jQuery('select'), // Cache jQuery selector
HTML_event = $select.prop('onchange'); // Backup original event
$select.removeProp('onchange'); // Remove original event
$select.change(function(e){
alert("Hi");
//HTML_event.call(this, e.originalEvent); // If you want to call the original event
});
});
另一种解决方案可能是保存timeoutID,然后在其上调用clearTimeout
。
<select onchange="window.selectTimeout = setTimeout(function(){}, 0)">
</select>
$(document).ready(function(){
jQuery('select').change(function(e){
alert("Hi");
clearTimeout(window.selectTimeout); // clears the timeout
});
});
答案 2 :(得分:0)
我使用的实际解决方案是创建一个包含ASP.NET生成的回发的单个jQuery过程。通过从ASP.NET标记中删除Autopost = True,您可以精确控制正在发生的事情并仍然调用ASP.NET回调,而是将其写入jQuery中。