在javascript中是否有任何方法可以暂停一个函数在中间等待输入

Is there any method to pause a function in the middle waiting for input in javascript?

本文关键字:一个 函数 输入 等待 在中间 暂停 是否 javascript 任何 方法      更新时间:2023-09-26

我需要在中间暂停JavaScript函数的执行,然后在单击表格单元格后继续执行。例如:我必须将'A'放入其中一个表格单元格中。因此,我必须单击add() (add()是一个函数),然后等待用户单击表单元格以将单元格id传递给函数。我想绑定一个点击事件到每个单元格来触发add()函数。然后我还要做一个删除函数。这是一样的,我单击删除按钮,然后等待用户单击表格单元格,将单元格id传递给函数。

那么我如何暂停函数来等待输入,就像c++: cin>>x,程序等待,直到用户输入x的值。

编辑:最后我算出来了。每次单击add按钮时,我都会为每个td绑定一个addtd函数。点击单元格后,取消addtd函数的绑定。这样下次我点击删除按钮时,我就可以在每个单元格上绑定一个deltd函数

我不完全理解这个问题。你不能暂停执行(不阻塞整个浏览器)。您只能在完成工作时设置事件侦听器。

您可以设置click事件委托以避免将click事件侦听器绑定到每个单元。

var textToAdd = 'A';
table.addEventListener('click', function (e) {
  var td = e.target;
  while (td !== this && td.tagName !== 'TD') { td = td.parentNode; }
  if (td.tagName !== 'TD') return;
  td.innerHTML += textToAdd;
});

无法按照您描述的方式暂停函数。你有没有想过反过来做?也就是说,当用户单击单元格时,您可以以某种方式突出显示它,然后添加和删除按钮/函数将应用于当前突出显示的单元格。

或者,您可以添加或删除"预处理",然后设置某种标志来指示您正在等待输入,然后为单元格单击事件设置一个事件处理程序,该事件处理程序检查该标志以决定下一步进行什么处理。因此,假设您已经设置了添加和删除事件处理程序来调用add()delete(),并设置了表格单元格单击处理程序来调用cellClick(),您可以尝试这样做:

var clickCallback = null;
function add() {
   // do your preprocessing here
   clickCallback = function(clickedCell) {
      // do further processing here
   };
}
function delete() {
   // do your delete preprocessing here
   clickCallback = function(clickedCell) {
       // do further processing here
   };
}
function cellClick(e) {
    e = e || window.event;
    var clickedElement = e.srcElement || e.target;
    if (clickCallback != null) {
       clickCallback(clickedElement);
       clickCallback = null;
    }
}

在处理点击之后,回调被设置回null,这样多次点击不会做任何事情。显然,如果用户采取的其他操作应该取消其余的处理,那么只需将回调设置为空,然后也。

请注意,通过在add()delete()函数中直接定义回调,它们(回调函数)将访问add()delete()的局部变量,即使回调直到稍后才执行(闭包的魔力)。