Safari 9使querySelectorAll失败:选择器无效

时间:2016-03-04 03:22:31

标签: javascript jquery safari

考虑这个JSFiddle:https://jsfiddle.net/4ngsTrIb1DI5te5H/veqLhnmp/

它有六个具有required属性的字段。使用jQuery我为change事件设置了一个事件处理程序,该事件处理程序向控制台写出剩余多少个必需的无效字段。它可以在除Safari之外的其他浏览器中完美运行(或者我已经开始称之为新的IE6)。 Safari有一半的时间返回错误的数字。

我如何解决这个问题?我的最终目标是简单地让jQuery告诉我容器元素中是否存在无效的必填字段。

2 个答案:

答案 0 :(得分:1)

Safari并不完全支持表单验证(参考:http://caniuse.com/#search=%3Ainvalid

这不是一个完美的解决方案,但它可能有所帮助:

  // All the elements which are required and lack a value attribute
  var empties = $("[required] [value]").not();

  // Count the number of selects
  var selects = $("select").length;

  // Count the number of selected options
  var selected = $("option[selected]").length;

  if (selected < selects) // One of the selects hasn't been selected

如果存在多重选择,这种方法将非常可靠,只检查数据是否存在非常严格的验证。

答案 1 :(得分:0)

好的,感谢@ user2182349,我有一个想法,所以我将我的jQuery选择器扩展修改为:

$.extend($.expr[":"], {
    invalid: function (
        element) {
        return (element.validity && !element.validity.valid) || false;
    }
});

起初它不能与select元素一起使用,因为Safari与所有其他尝试一样落后于值设置。但!当我在最后添加|| false时,它也突然开始为选择元素工作(及时)。至于我担心我一直在寻找的功能(并且花了最后六个小时左右才能完成工作)终于可用了,所以我称它为好。