【问题标题】:Is it possible to postpone execution of some javascript function until browser event is fully processed?是否可以推迟某些 javascript 函数的执行,直到浏览器事件完全处理?
【发布时间】:2009-12-10 02:45:32
【问题描述】:

例如,我需要在处理 onblur/onfocus 事件时执行一些函数(一个元素失去焦点,另一个元素获得焦点)。

更具体地说,我有以下内容。

<div id="foo" tabIndex="1" onblur="document.getElementById('bar').style.display = 'none';">foo</div>
<div id="bar" tabIndex="2" onclick="alert('bar');">bar</div>
<div>stuff</div>

假设元素 'foo' 被聚焦。当'foo'失去焦点时,我应该隐藏元素'bar'。但如果我点击“栏”,我应该会看到警报。它不起作用,因为在处理 onblur 事件之后,元素“bar”是不可见的,并且不会发生 onclick 和 onfocus。

【问题讨论】:

  • 您想对特定元素执行此操作吗?还是类似于“任何时候输入失去焦点而链接获得焦点”?
  • 另外,一些 HTML 可能有助于更准确地回答您的问题。
  • 一个建议,您通常应该避免在标签中嵌入事件处理程序。而是在脚本中将它们全部初始化。

标签: javascript dom


【解决方案1】:

只需在您的代码中管理它。

<script type="text/javascript">
var blurTimeout;
function Blur(el)
{
    blurTimeout = setTimeout(function() 
    {
        SomeFunction();
    }, 500);
}
function Focus(el)
{
    if (blurTimeout)
        cancelTimeout(blurTimeout);
}
</script>
<input id="input1" type="text" onblur="Blur(this);" />
<input id="input2" type="text" onfocus="Focus(this);" />

编辑:

已更新。现在您只需要将 Focus 处理程序附加到一个元素。

Blur 处理程序设置一个 1/2 秒的超时,该超时将调用 SomeFunction()。焦点处理程序取消超时以阻止函数调用。您可以调整延迟以使其显得更直接,但根据您的要求,它必须是异步的。

这是一个相当笨拙的解决方案。如果我发现自己在生产代码中编写此代码,我会重新考虑设计或(如果可能)重新审视需求。

【讨论】:

  • 实际上我不想按页面订阅所有元素到 onfocus 事件。我只需要在元素“foo”失去焦点的所有情况下执行我的函数,除了元素“bar”获得焦点的情况。
  • 但这就是这个例子所做的
  • 在这个例子中,只有在input2获得焦点时才会执行函数,我的情况不同,如果除了input2之外的任何元素都获得焦点,则应该执行函数。
  • 已更新。但这是一个丑陋的解决方案。您可能需要重新考虑您真正想要完成的工作。即使将焦点应用于输入2,是否可以重写SomeFunction() 工作?
  • 我在 dojo (dijit.form.ComboBox) 中找到的以下 sn-p if(doSearch){ // 开始搜索之前需要稍等片刻,以便事件 // 冒泡通过 DOM 和我们有可见的值 setTimeout(dojo.hitch(this, "_startSearchFromInput"),1);所以,我想'setTimeout(someFunction, 1)' 的方式还不错。 javascript中我们只有一个线程,所以会推迟执行,直到事件处理完成并释放线程。
猜你喜欢
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
相关资源
最近更新 更多