dijit.form.ValidationTextBox 调用验证器函数两次 onBlur

Posted

技术标签:

【中文标题】dijit.form.ValidationTextBox 调用验证器函数两次 onBlur【英文标题】:dijit.form.ValidationTextBox calls validator function twice onBlur 【发布时间】:2011-12-28 13:55:06 【问题描述】:

我有一个 AJAX 调用来检查使用 Dojo 和 php 的用户名的可用性。一切都很好,但背后发生了一些巨大的事情。每次我键入一个单词或在 onBlur 事件期间,dojo 都会进行两次 AJAX 调用,有时会调用三次。我读了这个link,他们说它是从 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;

【问题讨论】:

这可能与您的问题无关,但我认为您不会在 _isAvailable 中得到任何东西,因为您的 xhrPost 是异步的。您可以添加 sync:true 以使其同步,但您最好使用 dojo.when 或 dojo.then... 【参考方案1】:

您可以使用以下小技巧:

在你的 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 到该主题,以便在发布某些内容时运行一个函数?

【讨论】:

谢谢。我还不熟悉dojo.hitch, dojo.subscribe and dojo.publish。最好先阅读,然后再发表评论。非常感谢! 没问题,学习需要时间,别忘了采纳答案:)【参考方案2】:

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

请原谅我对dojo 的了解很少,因为这是我第一次使用这个框架。

【讨论】:

以上是关于dijit.form.ValidationTextBox 调用验证器函数两次 onBlur的主要内容,如果未能解决你的问题,请参考以下文章