更改匹配以允许javascript中的空输入

更改匹配以允许javascript中的空输入,javascript,Javascript,我有一些在Safari中导致问题的继承代码 问题来自代码中执行以下操作的几行代码: if ( ... && $("#element1").val().match(/regex/) && ...) javascript本身是通过编程生成的 问题是,有时$(“#element1”).val()返回null,我不能轻易地在它前面加上typeof check,因为它需要将null视为空字符串 最简单(也是可管理的)解决方案是创建一个nullmatch函数并调用它,或者重

我有一些在Safari中导致问题的继承代码

问题来自代码中执行以下操作的几行代码:

if ( ... && $("#element1").val().match(/regex/) && ...)
javascript本身是通过编程生成的

问题是,有时$(“#element1”).val()返回null,我不能轻易地在它前面加上typeof check,因为它需要将null视为空字符串

最简单(也是可管理的)解决方案是创建一个nullmatch函数并调用它,或者重写.match函数本身。然后,新函数将首先检查null,并(如果为null)传递空字符串以匹配,而不是null

我不知道该怎么做,或者哪一个最好。

function nullString(str) {
    if (str === null) {
        return "";
    else {
        return str;
    }
所以你的if语句可能会变成

if ( ... && nullString($("#element1").val()).match(/regex/) && ...)
jQuery docs for声明,当元素为select且未选择任何选项时,它返回null

因此,使用valHooks可能会有所帮助

var originalSelectHook;
if ($.valHooks.select) {
  originalSelectHook = $.valHooks.select.get;
}

$.valHooks.select = {
  get: function(elem) {
    var index = elem.selectedIndex;
    if (index == -1 || elem.options[index].disabled) {
       return "";
    }
    else {
      return originalSelectHook(elem)
    }
};

代码假定select有一个现有的钩子,您可以使用|操作符:

if ( ... && ($("#element1").val() || "").match(/regex/) && ...)
基本上,
foo | |“
将返回
foo
如果它是真的,或者如果
foo
是假的,则返回空字符串(
false
undefined
null
,空字符串,
+0
-0
NaN

最好是替换或添加(例如
$(“element1”).val().nullmatch(/regex/)
$(“element1”).val().nullToEmpty().match(/regex/)

这实际上是不可能的,因为
.nullmatch
.nullToEmpty
需要是一个可能的
null
值上的方法

如果您真的想以这种方式编写,或者后端更容易生成,那么您可以编写一个迷你插件:

$.fn.valNullToEmpty = function() { return this.val() || ''; }

$("element1").valNullToEmpty().match(/regex/)

这个解决方案是可行的,但由于javascript的生成方式,将$(“element1”).val()作为一个完整的语句包围起来并不是一件小事。最好是替换或添加它(例如,
$(“element1”).val().nullmatch(/regex/)
$(“element1”).val().nullToEmpty().match(/regex/)
)太好了!我没有想到替换val()!!感谢这是一个好的解决方案,但根据另一个解决方案,围绕$(“#element1”)和.val()对我来说并不简单,因为它们是在原始代码中单独创建的,所以我希望替换match或添加到链中。