从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附加的服务器端更改事件,正如您希望进行回发一样

我有一个附加到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>

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
    });
});