【问题标题】:jQuery 'OR' not working when looping through required input elements循环遍历所需的输入元素时jQuery'OR'不起作用
【发布时间】:2013-05-09 18:58:15
【问题描述】:

我正在为各种输入编写一个小的必需 HTML5 属性回退。到目前为止进展顺利,但是在检查单选按钮是否为 ':checked' 并使用 'OR' || 时遇到问题循环中的运算符:

if (self.val() === '' || self.is(':not(:checked)')) {

由于某种原因,当我添加它时,它会稍微破坏脚本,并且会指示输入字段(类型=文本)是空的,而不是空的。有没有更好的方法来循环并指出输入类型“文本”和“无线电”之间的区别?

这是循环:

var reqClass = $('.required')
        reqClass.each(function(){

            var self = $(this)

            // if empty
            if (self.val() === '' || self.is(':not(:checked)')) {

                // if it doesn't have require-checked class
                if (!self.hasClass('require-checked')) {

                    self.addClass('require-checked')
                    self.parent().append('<span class="form-error">This field is required.</span>')

                }

                e.preventDefault()
                //$('.form-submit').attr('disabled', true)

            // if it's been checked, but there is a value now   
            } else if (self.hasClass('require-checked') && !(self.val() === '')) {

                self.siblings('.form-error').hide()

            }

        })

类显然存在于“后备”浏览器中,并且会即时更改。这是一个 JSFiddle,感谢您的帮助:

http://jsfiddle.net/cyncV/2/

【问题讨论】:

  • 我已经构建了一个非常坚固和小型的验证器,只需使用它,它将为您节省时间..dropthebit.com/150/validation-styling-semantics-of-forms
  • 它没有说 OR,那只是两行,甚至不是一个完整的火柴人?
  • 您可能想要编辑您的标题。暗示 OR 属于 jQuery 是很容易在这里引起蛇皮的事情之一。
  • 这是检查已检查元素的糟糕方法和缓慢方法!
  • 你会推荐什么@epascarello?

标签: javascript jquery input


【解决方案1】:

一个文本框确实是:not(:checked)(即使里面有文本),所以文本框不是空的时候就显示为空。

可能是这样的

if (self.val() === '' || self.is(':checkbox:not(:checked)') || self.is(':radio:not(:checked)')

【讨论】:

  • 有道理,但似乎对雅各布我不起作用。如果您能提供任何建议,我将不胜感激。
  • 我更新了您的 JSFiddle 以使用上面的语法,它似乎对我有用。您发现了什么问题?
  • 那是因为 :checkbox 实际上是 :radio 这很可能是它不起作用的原因。
  • 哦,我明白了问题——你有一个单选按钮,你正在使用它就像一个复选框。 (提示:不要。)好的,已更新以涵盖该内容。
【解决方案2】:
var self = this;

var empty = self.type=='checkbox' ? !self.checked : self.value=='';

if (empty) {
    // do stuff
}

FIDDLE

【讨论】:

  • 感谢 adeneo,我已经在 jsfiddle 上进行了测试,但它并不完全存在,您对导致其他输入也显示错误消息的原因有什么进一步的建议吗?
  • 啊,我看到你使用了 'this' 而不是 '$(this)' - 与我已经拥有的相冲突。谢谢!
  • @Halcyon21 - 如果没有 jQuery,检查元素属性会更容易。
【解决方案3】:

有一个解决办法:

var checked = (self.is(':checkbox') || self.is(':radio')) ?  self.is(':not(:checked)') : false;
if (self.val() === '' || checked) {}

只需添加一个小条件,如果输入是复选框或单选框,则查看是否已选中,否则返回 false。然后将结果传递给 if 条件。

【讨论】:

    猜你喜欢
    • 2016-02-04
    • 2020-02-24
    • 2017-04-29
    • 2016-01-26
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2012-11-23
    • 2016-05-29
    相关资源
    最近更新 更多