Ajax dijit.form.ValidationTextBox在blur上调用验证程序函数两次

Ajax dijit.form.ValidationTextBox在blur上调用验证程序函数两次,ajax,dojo,Ajax,Dojo,我有一个AJAX调用,使用Dojo和PHP检查用户名的可用性。一切都很顺利,但背后发生了巨大的变化。每次我输入一个单词或在onBlur事件中,dojo都会进行两次甚至三次AJAX调用。我读了这篇文章,他们说它是固定的,因为v1.3,我使用的是v1.7。我尝试将AJAX函数放在setTimeout中,并延迟了3秒,但仍然发生了同样的事情。如何防止这种情况,并且只执行一个AJAX调用 var _username = new dijit.form.ValidationTextBox({ name :

我有一个AJAX调用,使用Dojo和PHP检查用户名的可用性。一切都很顺利,但背后发生了巨大的变化。每次我输入一个单词或在onBlur事件中,dojo都会进行两次甚至三次AJAX调用。我读了这篇文章,他们说它是固定的,因为v1.3,我使用的是v1.7。我尝试将AJAX函数放在setTimeout中,并延迟了3秒,但仍然发生了同样的事情。如何防止这种情况,并且只执行一个AJAX调用

var _username = new dijit.form.ValidationTextBox({
name : "{{ username.name }}",
type : "text",
required : true,
invalidMessage : message.invalid.username
}, "{{ username.id }}");

dijit.byId("{{ username.id }}").validator = fnUsernameAvailable;

function fnUsernameAvailable(a) {
if (a === "" )
    return false;

dojo.xhrPost({
    url : "{{ site_url() }}/ajax/check_username_availability",
    handleAs: "json",
    content : {
        username : a,
        csrf_libtracking : fnCsrf()
    },
    load : function(data) {
        _isAvailable = data.result;
    }
});

return _isAvailable;
}

您可以使用以下小技巧:

在ValidationTextBox中,添加一个属性:

var _username = new dijit.form.ValidationTextBox({
_beingChecked: false,
name : "{{ username.name }}",
type : "text",
required : true,
invalidMessage : message.invalid.username
}, "{{ username.id }}");

function fnUsernameAvailable(a) {
if (a === "" || this._beingChecked)
    return false;

this._beingChecked = true;

dojo.xhrPost({
    url : "{{ site_url() }}/ajax/check_username_availability",
    handleAs: "json",
    content : {
        username : a,
        csrf_libtracking : fnCsrf()
    },
    load : dojo.hitch(this, function(data) {
//        _isAvailable = data.result; <-- is this really useful ?
        this._beingChecked = false;
        dojo.publish("some/topic/to/tell/widgets/it/is/done", [data.result]);
    })
});
}

然后在您的代码或小部件中的某个地方,您可以dojo.subscribe该主题,以便在发布内容时运行函数?

谢谢您的回复。我最初的计划是通过AJAX联系服务器,检查用户名是否可用,如果结果为false,则返回var\u isAvailable以触发ValidationTextBox的invalidMessage属性。这也会触发工具提示出现在我希望出现的文本框旁边


请原谅我对dojo知之甚少,因为这是我第一次使用此框架。

这可能与您的问题无关,但我认为由于xhrPost是异步的,您将无法获得任何可用信息。您可以添加sync:true以使其同步,但您最好使用dojo.when或dojo。然后…感谢您的帮助。我还不熟悉dojo.hitch、dojo.subscribe和dojo.publish。最好先阅读,然后再评论。谢谢!没问题,学习需要时间,别忘了接受答案: