从Jquery函数中忽略返回值
我有一个附加到asp.net web表单前端的jQuery(表单的输入控件用标准asp.net AJAX面板包装),它有三个下拉列表,其中附加了一个jQuery:从Jquery函数中忽略返回值,jquery,events,Jquery,Events,我有一个附加到asp.net web表单前端的jQuery(表单的输入控件用标准asp.net AJAX面板包装),它有三个下拉列表,其中附加了一个jQuery: $(document).ready(function () { jQuery("select").change(function () { alert("Hi"); return false; }); }); 下拉列表中有一个ASP.NET附加的服务器端更改事件,正如您希望进行回发一样
$(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>
kPag
Pag(N/m²)
设计压力
磅/平方英寸
姆伯格
驳船
kgf/cm²
atg
atmg
托瑞(毫米汞柱)
嗯₂O
inHg
唯一的问题是,返回false并不像我所期望的那样抑制服务器端事件!如果我实现了一个返回false的普通javascript函数,那么我缺少什么呢
我也尝试过event.PreventDefault,但没有效果 似乎
\uuu doPostBack
方法被包装在绑定到onchange处理程序的setTimeout
中
<select ... onchange="javascript:setTimeout('__doPostBack(\'ctl00$leftContent$cmbPressureUnitsPo\',\'\')', 0)">
您的事件处理程序(通过jQuery绑定到
select
元素)将被单独调用(我的猜测是,考虑到setTimeout的工作方式,但您永远不知道计时器的怪癖)这是因为HTML中的onchange
在jQuery绑定事件运行之前首先运行。您无法阻止它运行,因为它已经运行了。您需要做的是在通过jQuery添加HTML绑定事件之前删除该事件
$(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>
我使用的实际解决方案是创建一个包含ASP.NET生成的回发的jQuery过程。通过从ASP.NET标记中删除Autopost=True,您可以精确地控制正在发生的事情,并且仍然调用ASP.NET回调,但将其写入jQuery中。这里不相信!警报确实如我预期的那样显示,返回,然后页面重新发布!堆栈上还有其他示例是我所追求的行为,例如,我知道我可以通过删除事件并将其添加回堆栈来解决这个问题,这就是我在其他地方所做的,但我只是不明白为什么行为看起来如此不同@mmacneill123:在您的示例中,更改值时,要触发的第一个事件是HTML中设置的
onchange
。这将在设置超时中调用\uuuuu doPostBack
函数。
该超时意味着浏览器将运行jQuery绑定事件,然后稍后返回\uu doPostBack
。因此,您的事件将运行,警报将打开(暂停所有其他JavaScript执行),直到关闭。您不能“阻止”更改onchange
,因为它已经完成了。警报关闭时,浏览器返回并从超时开始运行\uuu doPostBack
。在onchange
中有一些不好的做法。1) 不要在onchange
中添加javascript:
(它不会像你想象的那样做),2)不要向setTimeout
传递字符串(它调用eval
)。P.P.S。我从来没有使用过APP.NET,所以我不知道\uuu doPostBack
是如何工作或设置的,但我知道JavaScript:-)谢谢Jack,你说得很对,似乎setTimeout保证DOM实际上比任何其他方法加载得更好-本周通过包装代码解决了几个问题是零间隔计时器@是的,你说得对,的确如此!(虽然,我在Mobile Safari中看到了一些怪癖,即使setTimeout也不能保证DOM更改的存在……奇怪的事情!)你能解决你的问题吗?是的,Jack,只是在jQuery中写的!从标记中复制并粘贴生成的ASP.NET代码,将Autopost设置为False,以便ASP.NET不再发出该代码,然后手动附加事件。我想我把普通javascript处理程序和jQuery弄糊涂了!!
$(document).ready(function(){
jQuery('select').change(function(e){
alert("Hi");
clearTimeout(window.selectTimeout); // clears the timeout
});
});