从Jquery函数中忽略返回值

时间:2014-09-10 17:19:53

标签: jquery events

我有一个附加到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没有效果!

3 个答案:

答案 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中。