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
以触发ValidationTextBox
的invalidMessage
属性。这也会触发工具提示出现在我想要发生的文本框旁边。
请原谅我对dojo
的了解很少,因为这是我第一次使用这个框架。
【讨论】:
以上是关于dijit.form.ValidationTextBox 调用验证器函数两次 onBlur的主要内容,如果未能解决你的问题,请参考以下文章