在 Javascript 中使用委托(使用 XMLHttpRequest AJAX 请求的示例)

Posted

技术标签:

【中文标题】在 Javascript 中使用委托(使用 XMLHttpRequest AJAX 请求的示例)【英文标题】:Using delegates in Javascript (example using XMLHttpRequest AJAX request) 【发布时间】:2021-11-09 14:24:48 【问题描述】:

我有一个从 GET 返回一些数据的 AJAX 页面。都好。我试图从 javascript 调用它以响应用户更改名为ProductCode 的选择元素的值。如果我的某些术语有点偏离,我来自 C# 世界。

Javascript:

function ProductCodeChange()
               
    try
    
        elProductCode = document.getElementById("ProductCode");
        ProductCode = elProductCode.value;
        
        var AJAX_MAGICTOKEN = "773d8626-6b78-4055-bf8b-4fbbaa725550";
        url = "AJAX_GetData.php?";
        url += "MagicToken=" + AJAX_MAGICTOKEN + "&";
        url += "Query=GetProduct&";
        url += "ProductCode=" + ProductCode;
        
        httpxml = new XMLHttpRequest();
        httpxml.onreadystatechange = PopulateProductCode(httpxml);
        alert(">httpxml.open");
        httpxml.open("GET", url, true);
        httpxml.send(null);
    
    catch (e)
    
        alert(e.message);
    



function PopulateProductCode(httpxml)

    try
    
        alert(">ProductCodePopulate");
        if (httpxml.readyState == 4 && httpxml.status == 200) 
        
            data = httpxml.responseText;
            alert(data);
        
        else
        
            alert("readyState: " + httpxml.readyState.toString());
            alert("status: " + httpxml.status.toString());
        
    
    catch (e)
    
        alert(e.message);
    

html

<select id="ProductCode" name="ProductCode" onchange="ProductCodeChange();">
<option value="AP1A" >Annual Licence</option>
<option value="AP1M" >Monthly Licence</option>
</select>

我已将XMLHttpRequest 对象配置为在触发onreadystatechange 事件时调用PopulateProductCode。我对返回的数据有很多工作要做,并且希望在XMLHttpRequest 返回数据时调用一个单独的函数。

如果是我的 C# 世界,httpxml.onreadystatechange = PopulateProductCode(httpxml); 行会设置带有委托的 httpxml 对象,以便在其就绪​​状态发生更改后调用。但是,在执行上面的代码时,事件的顺序是:

alert(">ProductCodePopulate");
alert(">httpxml.open");

所以我的委托在发送 GET 请求之前被调用。

我完全误解了这个对象的工作原理吗?我怎样才能实现我想做的事情(即将功能保留在一个单独的函数中)?

如果您可以在回答中坚持使用原生 Javascript,那就太好了。我还不熟悉JQuery。谢谢。


编辑: 另一种选择是:

httpxml.onreadystatechange =
function()

    if (this.readyState == 4 && this.status == 200) 
    
       data = httpxml.responseText;
       alert(data);
       
    

这个确实工作正常,直到数据返回才被执行。从下面的@James 回答中,第一个版本会立即执行,但上面的版本不会。我不明白两者之间有什么区别,除了第二个没有函数名。当然它们是同一件事,但是一个版本是无名的?为什么处理方式不同?

【问题讨论】:

【参考方案1】:

在 Javascript 中,httpxml.onreadystatechange = PopulateProductCode(httpxml) 这一行首先使用 httpxml 参数调用 PopulateProductCode,并将其返回值指定为事件处理程序,以便在就绪状态更改时使用。

最简单的方法是将您对 PopulateProductCode 的调用封装在一个匿名函数中。

httpxml.onreadystatechange = () => PopulateProductCode(httpxml);

【讨论】:

谢谢@James。我真的不明白为什么会这样。我添加了一个能够确实正常工作的修改,但我不明白我的原始代码和修改后的版本在处理方式上的区别。能不能解释一下。谢谢。【参考方案2】:

我建议将方法更改为更新的实现。获取 API。它返回一个承诺。提高了代码的可读性,是当今更好的方法。

推荐阅读:

Fetch API vs XMLHttpRequest

https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API

【讨论】:

以上是关于在 Javascript 中使用委托(使用 XMLHttpRequest AJAX 请求的示例)的主要内容,如果未能解决你的问题,请参考以下文章

创建委托 LdapAuthenticationProvider 而不使用 xml 配置,而不是通过 java 代码

Javascript中的事件委托机制

javascript举例介绍事件委托的典型使用场景

浅谈JavaScript的事件(事件委托)

如何使用 Javascript SDK 为 Azure 存储生成用户委托 SAS

JavaScript中事件委托(事件代理)详解