【问题标题】:Check what control initiated AJAX Request检查哪些控件发起了 AJAX 请求
【发布时间】:2010-10-10 10:41:37
【问题描述】:

asp.net 2.0 / jQuery / AJAX

<script type="text/javascript">
//updated to show proper method signature

var prm = Sys.WebForms.PageRequestManager.getInstance();

prm.add_endRequest(hideMessage);

function hideMessage(sender, args)
{
    var ctl = args.get_postBackElement();
    //check if ctl is the disired control
    //hide user notification message
}
</script>

我在页面上有几个控件可能会启动 AJAX 请求,但我只希望我的 js 在我单击一个特定按钮时触发。我如何检查发起请求的控件是什么,以便我可以相应地触发 JS。

编辑:我解决了这个问题,但我仍然想知道我是否可以这样做。

澄清:我不能从 onclick 事件中调用 JS,因为页面在 UpdatePanel 内,我只希望 JS 在 AJAX 请求结束并且它被触发时执行页面上的特定按钮。在服务器端,我将 myLabel.Text 设置为一些文本,然后 js 检查 $(myLabel.CliendID) 的 innerHTML 是否不为空并触发 js。检查 innerHTML 是我的解决方法,因为我不知道如何检查 AJAX 请求的“发件人”。希望现在这更有意义。

edit2:我读过一些documentation,结果你可以检查“发件人”控件。

谢谢。

【问题讨论】:

    标签: asp.net javascript jquery ajax pagerequestmanager


    【解决方案1】:

    这就是我在我的代码中所做的,以确定是哪个控件初始化了请求。所有 javascript 代码。

    function pageLoad() {
        if (!Sys.WebForms.PageRequestManager.getInstance().get_isInAsyncPostBack()) {
            Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandler);
            Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(initializeRequest);
        }
    }
    function endRequestHandler(sender, args) {
        if (sender._postBackSettings.sourceElement.id == '<%= gvResults.ClientID %>')        {
            //do something because of this...
        }
    }
    function initializeRequest(sender, args) {
        if (CheckForSessionTimeout()) {
            args.set_cancel(true);
        }
        else {
            if (sender._postBackSettings.sourceElement.id == '<%= gvResults.ClientID %>') {
                 //do something because of this
            }
        }
    }
    

    编辑
    这是在客户端检查超时的方法。

    var sessionTimeoutDateTime = new Date();
        var sessionTimeoutInterval = <%= this.SesstionTimeoutMinutes %>;
    
        function CheckForSessionTimeout() {
            var currentDateTime = new Date()
            var iMiliSeconds = (currentDateTime - sessionTimeoutDateTime);
            if (iMiliSeconds >= sessionTimeoutInterval) {
                ShowSessionTimeout();
                return true;
            }
            return false;
        }
    

    【讨论】:

    • 能否在代码 sn-p 中包含 CheckForSessionTimeout() 方法?
    • 是的......我可以这样做。 this.SessionTimeoutMinutes 是网页中的一个属性。
    【解决方案2】:

    我建议您不要让每个控件都执行相同的 javascript 函数。或者,如果他们这样做了,则传递一个参数来指示执行它的人。

    然后,您可以在控件执行的js函数中包含您的ajax。

    而且,如果我没有正确理解这个问题,也许您可​​以更详细地解释它或发布一些代码。

    【讨论】:

    • 看到澄清,希望这个问题现在更有意义。
    【解决方案3】:

    我读过一些documentation,结果你可以检查“发件人”控件。问题中的 JS 已更新以显示正确的方法签名。

    This article 给出了更好的解释。

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 1970-01-01
      • 2011-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      相关资源
      最近更新 更多