解决vue+el使用this.$confirm,不能阻断代码往下执行

在Vue+ElementUI框架中,通过await优化this.$confirm弹窗,确保弹窗响应后再执行后续代码,避免同步问题。文章详细介绍了如何使用Promise和await实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

在vue+element ui的前端框架中使用el的confirm弹窗,遇到一个问题,就是连续多个弹窗提示一些信息,要是点击确定继续向下执行,点击取消就退出整个方法。这时发现当代码执行到this.$confirm弹窗时,弹出弹窗后,继续执行了弹窗之后的代码,没有等到弹窗点击确定或是取消之后再执行。

具体解决

其实解决办法也很简单,因为this.$confirm也是一个promise方法,所以可以使用es6中的await等到返回结果。
await 表达式会暂停当前 async function 的执行,等待 Promise 处理完成。

......

if(await this.$confirm('是否保存修改?', '确认信息', {
   distinguishCancelAndClose: true,
   confirmButtonText: '保存',
   cancelButtonText: '取消'
 }).catch(() => {}) !== 'confirm') {
	return
}
// 点击取消退出方法,点击保存则继续往下执行
// 若没有await,在弹出弹窗的同时就会接着往下执行
this.doSaveInfo()
......

后记

看官方文档学习一定要看仔细,看明白。认真学习promise和await。

<think>好的,我需要解决用户的问题:用JavaScript实现三个单选按钮组(AGC, Color, OSD)被选中时,对应的<p>标签文字变红,并且兼容IE浏览器。首先,我得理清楚需求。用户有三个分组,每个分组内有单选框,选中某个选项时,对应的描述段落要变成红色。同时,代码需要在IE浏览器中运行,这意味着不能使用现代浏览器支持的某些新特性,比如addEventListener或者箭头函数。 首先,我需要确定如何获取这些单选按钮和对应的<p>元素。可能每个单选按钮组有共同的name属性,比如name="AGC",name="Color",name="OSD"。当用户点击某个单选框时,需要找到对应的<p>标签并改变颜色。 接下来,事件处理。由于IE8及更早版本支持addEventListener,需要使用attachEvent方法。或者,可以使用更兼容的方式来绑定事件,比如在HTML中使用onclick属性,但这样太优雅。更好的方法是写一个兼容的事件绑定函数,判断浏览器是否支持addEventListener,否则使用attachEvent。 然后,处理事件触发时的逻辑。当单选框被点击时,检查它是否被选中(checked属性为true),如果是,则找到对应的<p>标签。如何关联单选框和对应的<p>呢?可能需要给每个单选框设置一个自定义属性,比如data-target,指向对应的<p>的id。或者,根据单选框的name属性或父容器来定位对应的<p>。例如,每个分组的<p>可能有特定的id,比如agcDesc、colorDesc、osdDesc。 假设HTML结构大致如下: <div class="group"> <input type="radio" name="AGC" value="option1"> <input type="radio" name="AGC" value="option2"> <p id="agcDesc">AGC描述</p> </div> <div class="group"> <input type="radio" name="Color" value="option1"> <input type="radio" name="Color" value="option2"> <p id="colorDesc">Color描述</p> </div> <div class="group"> <input type="radio" name="OSD" value="option1"> <input type="radio" name="OSD" value="option2"> <p id="osdDesc">OSD描述</p> </div> 那么,当任何一个单选框被选中时,需要根据其name属性找到对应的p标签。例如,name为AGC的单选框对应id为agcDesc的p标签。 接下来,编写JavaScript代码。首先获取所有单选框元素,然后为每个单选框绑定点击事件。在事件处理函数中,检查当前单选框是否被选中,如果是,则找到对应的p标签并设置颜色为红色。 为了兼容IE,需要注意以下几点: 1. 使用getElementsByTagName或getElementsByName来获取元素,而是querySelector,因为IE8可能支持后者。 2. 事件绑定使用attachEvent,但需要做兼容处理。 3. 避免使用箭头函数,因为IE支持。 4. 使用setAttribute或直接修改style.color属性,而是classList,因为IE可能支持classList。 此外,可能需要处理IE的事件对象,比如使用window.event。 可能的步骤: 1. 获取所有input元素,筛选出type为radio的。 2. 遍历这些单选框,为每个绑定点击事件。 3. 在事件处理函数中,判断checked是否为true,如果是,获取其name属性,然后找到对应的p元素。 4. 设置p元素的style.color为红色。 但如何根据name找到对应的p元素?比如,name为AGC的对应id为agcDesc的p。可以建立一个映射关系,比如将name转换为小写,然后加上Desc作为id。或者,在HTML中为每个p元素设置与单选框组name对应的id。 例如,name为AGC的单选框组对应的p标签id是agcDesc,name为Color的对应colorDesc,以此类推。这样,在JS中可以通过name属性值转换为小写(或特定格式)加上Desc来获取对应的p元素。 然后,在事件处理函数中,当单选框被点击时,获取其name,构造对应的p元素的id,然后修改颜色。 关于事件绑定,可以写一个兼容的函数: function addEvent(element, eventName, handler) { if (element.addEventListener) { element.addEventListener(eventName, handler); } else if (element.attachEvent) { element.attachEvent('on' + eventName, handler); } else { element['on' + eventName] = handler; } } 然后,遍历所有单选框,为每个绑定点击事件: var radios = document.getElementsByTagName('input'); for (var i = 0; i < radios.length; i++) { var radio = radios[i]; if (radio.type === 'radio') { addEvent(radio, 'click', function() { if (this.checked) { var name = this.name; var pId = name.toLowerCase() + 'Desc'; var pElement = document.getElementById(pId); if (pElement) { pElement.style.color = 'red'; } } }); } } 这样,当用户点击单选框时,对应的p标签会变红。但需要考虑一个问题:当用户切换同一组内的同单选框时,是否要清除之前的状态?过根据需求,只要选中任一选项,对应的p标签就变红,所以需要处理,因为同一组内只能有一个被选中,点击另一个会自动取消前一个的选中状态,但p标签的颜色可能已经被设置为红色。过,如果用户取消选中所有选项,可能需要颜色恢复,但单选框组通常允许取消所有选项,除非有特殊的逻辑。根据用户提供的引用[^1],用户提到单选框组应该确保必须选中一个,因此可能需要处理取消的情况。 另外,兼容性问题:IE8及更早版本可能支持getElementsByTagName('input')返回的集合正确识别type属性,可能需要遍历所有input元素,检查type是否为radio。过,在IE8中,input元素的type属性在未明确设置时会默认返回'text',但如果HTML中正确设置了type="radio",应该可以正确获取。 此外,关于this的指向,在attachEvent中,this可能指向window,因此需要修正。例如,在事件处理函数中使用var radio = this可能适用,需要改用event.target或event.srcElement(IE中使用window.event.srcElement)。 因此,需要修改事件处理函数,以兼容IE的事件对象: function handleClick(event) { var target = event.target || window.event.srcElement; if (target.checked) { var name = target.name; var pId = name.toLowerCase() + 'Desc'; var pElement = document.getElementById(pId); if (pElement) { pElement.style.color = 'red'; } } } 然后,在绑定事件时,传递这个函数。但这样可能需要处理事件参数的传递。或者,在addEvent函数内部处理: function addEvent(element, eventName, handler) { if (element.addEventListener) { element.addEventListener(eventName, handler); } else if (element.attachEvent) { element.attachEvent('on' + eventName, function() { handler.call(element, window.event); }); } else { element['on' + eventName] = handler; } } 然后,在handler中,使用event参数: function handleClick(event) { var target = event.target || event.srcElement; if (target.checked) { var name = target.name; var pId = name.toLowerCase() + 'Desc'; var pElement = document.getElementById(pId); if (pElement) { pElement.style.color = 'red'; } } } 这样,在IE中,event参数是window.event,而target通过event.srcElement获取。 综上,完整的代码可能如下: // 兼容的事件绑定函数 function addEvent(element, eventName, handler) { if (element.addEventListener) { element.addEventListener(eventName, handler); } else if (element.attachEvent) { element.attachEvent('on' + eventName, function() { handler.call(element, window.event); }); } else { element['on' + eventName] = handler; } } // 获取所有单选框 var inputs = document.getElementsByTagName('input'); for (var i = 0; i < inputs.length; i++) { var input = inputs[i]; if (input.type === 'radio') { addEvent(input, 'click', function(event) { var target = event.target || event.srcElement; if (target.checked) { var pId = target.name.toLowerCase() + 'Desc'; var pElement = document.getElementById(pId); if (pElement) { pElement.style.color = 'red'; } } }); } } 这样应该可以兼容IE,并且实现所需功能。需要注意的是,p元素的id必须与单选按钮组的name属性对应,例如name="AGC"对应id="agcDesc"。 另外,用户可能需要确保初始状态下,已选中的单选框对应的p标签也是红色。如果需要,可以在页面加载后遍历所有选中的单选框,并设置对应的颜色。 此外,如果用户希望其他选项被选中时,之前的颜色恢复,但根据需求,可能需要,因为同一时间只能有一个选项被选中,但每个分组的p标签可能需要在选中任何选项时保持红色。例如,AGC组的任一选项被选中,对应的p标签始终红色,即使切换选项也是如此。因此,上述代码满足需求。 最后,测试在IE中的兼容性,确保事件绑定正确,并且能正确获取元素和修改样式。</think>以下是实现三个单选按钮组选中时对应描述文字变红且兼容IE浏览器的JavaScript代码方案: ### 实现步骤 1. **HTML结构示例**: ```html <!-- AGC组 --> <input type="radio" name="AGC" value="1">选项1 <input type="radio" name="AGC" value="2">选项2 <p id="agcDesc">AGC描述文字</p> <!-- Color组 --> <input type="radio" name="Color" value="1">选项1 <input type="radio" name="Color" value="2">选项2 <p id="colorDesc">Color描述文字</p> <!-- OSD组 --> <input type="radio" name="OSD" value="1">选项1 <input type="radio" name="OSD" value="2">选项2 <p id="osdDesc">OSD描述文字</p> ``` 2. **JavaScript代码**: ```javascript // 兼容性事件绑定函数 function addEvent(element, eventName, handler) { if (element.addEventListener) { element.addEventListener(eventName, handler); } else if (element.attachEvent) { element.attachEvent('on' + eventName, function() { handler.call(element, window.event); }); } } // 初始化绑定 function initRadioEvents() { var radios = document.getElementsByTagName('input'); for (var i = 0; i < radios.length; i++) { if (radios[i].type === 'radio') { addEvent(radios[i], 'click', function(e) { var event = e || window.event; var target = event.target || event.srcElement; if (target.checked) { var pId = target.name.toLowerCase() + 'Desc'; var descElement = document.getElementById(pId); if (descElement) { descElement.style.color = 'red'; } } }); } } } // 页面加载后执行 if (document.readyState === 'complete') { initRadioEvents(); } else { addEvent(window, 'load', initRadioEvents); } ``` ### 关键点说明 1. **事件绑定兼容**: - 使用`addEventListener`和`attachEvent`的兼容写法 - 通过`handler.call(element, window.event)`解决IE中`this`指向问题[^2] 2. **元素关联逻辑**: - 通过`name`属性值转换为小写拼接'Desc'来定位对应`<p>`标签 - 示例:`name="AGC"`对应`id="agcDesc"` 3. **IE兼容性处理**: - 避免使用箭头函数和`classList` - 使用`document.getElementsByTagName`代替`querySelector` - 通过`window.event.srcElement`获取事件目标[^4] 4. **样式修改**: - 直接操作`style.color`属性 - 确保单选框选中状态改变时立即生效 ### 注意事项 1. 需要保证`<p>`标签的ID命名规则与单选组的name属性严格对应 2. 建议在页面加载完成后执行初始化代码(通过`load`事件判断) 3. 如需恢复默认颜色,需要添加额外的状态判断逻辑
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值