javascript - 为什么触发我的 click() 事件似乎有延迟?

标签 javascript jquery html ajax

我有一个网格,每行都设置了接受/拒绝单选按钮。

单击单选按钮时,将进行 ajax 调用来检查是否需要禁用任何行,并刷新网格。

我有一些代码,当单击一个单选按钮时,应立即禁用所有单选按钮,以便用户在刷新发生之前无法选择其他选项:

$('input').click(function(){
    $('input').prop('disabled', true);
});

但即使是这个简单的代码在生效之前页面上也会有大约 500 毫秒的延迟。其他时候它几乎立即发生。

我对页面上可能正在运行或导致速度减慢的整个 HTML/其他脚本没有太多控制权(如果这是罪魁祸首)。我可以做些什么来设置事件监听器以更快地禁用单选按钮,或防止单击它们?

最佳答案

编辑:

重读您的问题后:

When a radio button is clicked, an ajax call is made to check if any of the rows need to be disabled, and the grid is refreshed.

听起来这可能是罪魁祸首。 ajax 请求是否有可能是同步 请求 (async: false) 并在您的点击处理程序之前触发?在您绑定(bind)单选按钮之前,可能会有一个点击处理程序附加到这些单选按钮。第一个处理程序将首先执行,同步请求将阻止所有其他代码执行,直到它完成...AJAX 请求可能需要大约 500 毫秒。

这也可以解释这种奇怪的行为:

but even this simple code has a lag of ~500ms on the page before it takes affect. Other times it happens almost immediately.

如果出现这种情况,您需要在发出 AJAX 请求之前禁用该处理程序内部的单选按钮。

<小时/>

即使页面上有大量单选按钮,您的代码看起来也不需要大约 500 毫秒才能运行。可以更有效地编写相同代码的两种方法是:

  • 缓存单选按钮:当单击一个单选按钮时,您的代码会在 DOM 中搜索所有单选按钮。您可以通过提前搜索单选按钮来加快点击处理程序的执行速度。
  • 使用 1 个事件处理程序:在正文上使用 1 个委托(delegate)事件处理程序,而不是在每个输入上设置一个点击处理程序。可能有大量的单选按钮,并且在每个单选按钮上绑定(bind)单击处理程序可能需要比预期更长的时间...但是,必须需要很多输入才能完成此操作成为罪魁祸首。

$(document).ready(function() {
  // cache radiobuttons
  var all_radiobuttons = $('input[type="radio"]');

  // This one handler on the body will handle clicks events for all input[type="radio"].
  $(document.body).on('click', 'input[type="radio"]', function() {
      all_radiobuttons.prop('disabled', true);
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Test <input type="radio"></input></label>
<label>Test <input type="radio"></input></label>

关于javascript - 为什么触发我的 click() 事件似乎有延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26367168/

相关文章:

Jquery动画背景

javascript - 如何使这 3 个部分具有视差滚动?

html - 非程序员的网站更新工具

javascript - 使用 Jquery 获取和设置内容的位置

javascript - 自动对焦在不在任何表单元素下的输入标签中不起作用

javascript - 如何在 'shouting' 时删除部分命令?

javascript - 如何在循环中执行异步代码?

javascript - 使用 Javascript 在文本区域内写入

javascript - jQuery 显示/隐藏仅适用于第一个选择器

javascript - jquery 相当于 getcompulatedstyle()