Sweetalert2在IE9中出现'SCRIPT5007: oninput设置失败'问题求助
看起来你遇到的问题核心是IE9不支持oninput事件,而Sweetalert的输入框逻辑依赖这个事件,同时可能在DOM元素未就绪时就尝试绑定事件,导致抛出object is null or undefined的错误,进而阻断了弹窗的渲染流程。下面给你几个可行的解决方案:
1. 切换到兼容IE9的Sweetalert版本
SweetAlert 2.x及以上版本已经放弃了对IE9的支持,如果你用的是新版本,建议降级到SweetAlert 1.x的最后几个兼容版本(比如v1.1.3),这个版本对IE9的支持更完善,内部已经处理了事件兼容问题。
2. 手动修复事件兼容逻辑
如果不想换版本,可以修改Sweetalert的源码(或者在调用前做补丁),把oninput事件替换为IE9支持的onpropertychange,同时保留现代浏览器的支持:
// 找到Sweetalert中绑定输入框事件的代码,替换成如下逻辑 var inputField = document.querySelector('.swal-input'); if (inputField) { // 优先使用oninput,兼容现代浏览器 if ('oninput' in inputField) { inputField.oninput = function() { // 原有输入框处理逻辑,比如实时验证、更新状态等 }; } else { // IE9及以下用onpropertychange inputField.onpropertychange = function() { // 只在value属性变化时执行逻辑 if (window.event && window.event.propertyName === 'value') { // 原有输入框处理逻辑 } }; } }
3. 确保DOM元素就绪后再绑定事件
报错提示object is null,大概率是Sweetalert在创建弹窗元素并插入DOM之前,就尝试给输入框绑定oninput事件了。你可以修改Sweetalert的初始化流程,把事件绑定代码放在弹窗元素被appendChild到body之后,确保元素确实存在。
4. 针对IE9做降级处理
如果上述方案都太麻烦,可以直接检测IE9,改用原生prompt替代Sweetalert弹窗,保证功能可用:
// 检测IE9 function isIE9() { return navigator.userAgent.indexOf('MSIE 9.0') > -1; } // 登录成功后的逻辑 if (isIE9()) { var userName = prompt('请输入您的姓名:'); if (userName) { // 处理姓名提交逻辑,比如Ajax发送 } } else { // 正常调用Sweetalert swal({ title: '请输入姓名', input: 'text', showCancelButton: true, confirmButtonText: '提交', preConfirm: function(value) { return new Promise(function(resolve, reject) { value ? resolve(value) : reject('请输入有效的姓名'); }); } }).then(function(result) { // 处理姓名提交逻辑 }); }
为什么会出现这个问题?
IE9不支持HTML5新增的oninput事件,而Sweetalert的输入框功能依赖这个事件来监听输入变化。当Sweetalert尝试给还未创建(或创建失败)的输入框元素绑定oninput时,就会抛出SCRIPT5007错误,导致后续的弹窗渲染代码被中断——这就是为什么Ajax能正常执行,但弹窗没弹出来的原因。
内容的提问来源于stack exchange,提问作者tatty27

