试图在 IE 中模仿 JavaScript 动态属性

Stuck trying to mimic JavaScript dynamic properties in IE

我有一些 JavaScript 可以与 jQuery.validate 一起使用。这需要一个从服务器返回的 JSON 对象,并将其传递给 showErrors 函数。 response.errors 对象看起来像这样...

{[
  { item1: "Email", item2: "Invalid format" },
  { item1: "ExpiryDate", item2: "Must be in the future" }
]{

下面的 ES6 代码工作正常...

for(var i = 0; i < response.errors.length; i++) {
  $('form').validate()
    .showErrors({ [response.errors[i].item1]: response.errors[i].item2 });
}

但是,我刚刚发现 IE 不支持 ES6,所以这在那里不起作用。我尝试使用 es6-shim(和 es-5shim),但没有用。

我一直在尝试编写一些与 ES5 兼容的代码来做同样的事情,但每次尝试都失败了。我查看了诸如 this one and 之类的答案,但我什么也做不了。

我最近的尝试如下...

var error = {};
error[response.errors[i].item1] = response.errors[i].item2;
$('form').validate().showErrors(error);

然而,尽管将 error 和之前的代码转储到控制台显示它们是相同的,但当我尝试使用此代码时,我在控制台中收到错误...

Uncaught (in promise) TypeError: Cannot read property 'type' of undefined at $.validator.highlight (jquery.validate.js:344) at $.validator.defaultShowErrors (jquery.validate.js:912) at $.validator.showErrors (jquery.validate.js:546) at handleServerResponse (Donate:305)

有问题的行是我调用 showErrors

的行

有人能帮帮我吗?

Update 只是为了澄清,我在循环中这样做的原因是服务器端代码 returns 三种类型的错误,正常的相关到特定的输入元素,与整个数据相关的一般元素,以及特定于表单支付部分的元素。我只将第一种类型传递给 jQuery.validate,因为第二种类型显示在表单的独立部分,而第三种类型必须以不同方式处理,因为支付处理器在iframe,意味着我必须手动添加错误。

第二次更新 原来是页面单独部分的一些代码导致了我的 JavaScript。我的代码和两个答案中显示的代码都很好,这是一个单独的问题。

要构建对象,您可以循环遍历从 AJAX 请求收到的数组,然后使用括号表示法向对象添加属性,然后将其传递给 showErrors() ,像这样:

var errors = {};
response.errors.forEach(function(err) {
  errors[err.item1] = err.item2
});
$('form').validate().showErrors(errors);

类似于 , but I would use reduce 获取 response.errors 数组并将其转换为具有正确位置属性的数组。

请注意,showErrors method takes an object 和 key/value 对是要显示的输入名称和消息,因此您无需在循环中调用它。

var errors = [
  { item1: "Email", item2: "Invalid format" },
  { item1: "ExpiryDate", item2: "Must be in the future" }
];

var errorsToShow = /*response.*/errors.reduce((arr, cur) => { 
  arr[cur.item1] = cur.item2; 
  return arr; 
}, {});

console.log(errorsToShow);

// $('form').validate().showErrors(errorsToShow);


您看到的错误很可能发生 here, in jquery.validate.js (this link goes to the source that makes up that file):

    highlight: function( element, errorClass, validClass ) {
        if ( element.type === "radio" ) {
            this.findByName( element.name ).addClass( errorClass ).removeClass( validClass );
        } else {
            $( element ).addClass( errorClass ).removeClass( validClass );
        }
    },

正在 HTMLInputElement 上寻找 type 属性,但 element 未定义。

您至少可以通过两种方式解决此问题:

  1. 通过确保您在对象中传递的错误仅适用于 item1(对象 属性 的键)引用命名元素(或未标记的元素)的错误以某种方式,以便您可以过滤掉它们)。这将是首选和最干净的方式。
  2. 通过提供您自己的 highlight 函数(如果由于某种原因您无法更改 API)。显然 jQuery 验证允许传递覆盖它们的某些函数,因此您可以调用 validate() with options 并在这些选项中传递您自己的 highlight 函数。也许以以下开头:

    if (!element) return;
    

    我建议还实现 unhighlight 函数,因为它有类似的代码。这不是首选选项,因为您只是在 "real" 问题上包扎绷带,即您要求 showErrors 显示不存在的错误(对 jQuery 验证插件)。您也可以只重载 showErrors,但这会涉及更多。