【发布时间】:2020-03-12 19:28:36
【问题描述】:
我犯了一个错误。我将我的功能与.on('click', ...) 事件配对。我的系统安装了某些项目,每个项目都进行了分类。目前,我的类别是[post, image, widgets],每个类别都有自己的进程,它们在前端以列表的形式表示。下面是它的外观:
正如我所说,每一个都与点击事件配对。当用户点击Install时会出现一个漂亮的加载器,<li>本身有时尚的变化等等。
我也碰巧有一个按钮,应该允许用户安装所有项目:
这很好。除了......如果不模拟用户点击,绝对没有办法做到这一点。这很好,但是,我如何才能等待每个项目完成(或不完成),然后再继续下一个?
如何向外界发出安装过程已完成的信号?
感觉如果我使用new CustomEvent,这将开始变得难以理解。
这是我想要实现的一些代码:
const installComponent = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
return resolve();
}, 1500);
});
};
$('.item').on('click', (event) => {
installComponent().then(() => {
console.log('Done with item!');
});
});
$('#install-all').on('click', (event) => {
const items = $('.item');
items.each((index, element) => {
element.click();
});
});
ul,
ol {
list-style: none;
padding: 0;
margin: 0;
}
.items {
display: flex;
flex-direction: column;
width: 360px;
}
.item {
display: flex;
justify-content: space-between;
width: 100%;
padding: 12px 0;
border-bottom: 1px solid rgba(0, 0, 0, 0.1);
margin: 0;
}
.item h3 {
width: 80%;
}
.install-component {
width: 20%;
}
#install-all {
width: 360px;
height: 48px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="items">
<li class="item" data-component-name="widgets">
<h3>Widgets</h3>
<button class="install-component">Install </button>
</li>
<li class="item" data-component-name="post">
<h3>Posts</h3>
<button class="install-component">Install </button>
</li>
<li class="item" data-component-name="images">
<h3>Images</h3>
<button class="install-component">Install </button>
</li>
</ul>
<button id="install-all">Install All</button>
如您所见,所有点击都是同时启动的。没有办法等待触发的任何点击完成。
【问题讨论】:
-
不看代码很难知道,但你可以看看回调函数。
-
@Edit 我可以发布一些代码,但坦率地说,这是一个非常普遍的问题,我认为添加代码不会起到任何作用。我有一个
li,每个li我都有一个button,我点击它。我的目标是通过代码单击这些按钮中的每一个,但不要在完成之前单击。 -
@Edit 添加的代码。
-
"除了......如果不模拟用户点击,绝对没有办法做到这一点。" - 停在那里重新考虑。在您展示的示例代码中,您可以像从 install-one 事件处理程序中调用它一样轻松地从 install-all 事件处理程序调用
installComponent()。 -
@DanielSmith 我不认为事件处理程序可以
return任何东西。一个技巧是让他们将结果存储在您之后访问的变量中。但实际上,正确的方法是从多个事件处理程序中调用相同的底层控制器函数,而不是触发点击事件。
标签: javascript