【问题标题】:How I can highlight as required field with "chosen" Plugin?如何使用“选择”插件突出显示必填字段?
【发布时间】:2014-09-08 05:18:11
【问题描述】:

以下下拉代码,我想按要求填写此字段,但没有检查验证。

<select id="mood" rel="chosen" required="required" name="moodName">
<option value="">Select Option</option>
<option value="69">AGITATED</option>
<option value="115">ALOOF</option>
<option value="46">AMUSED</option>
</select>

验证码

$('#Form').validate();

提交表单时如何验证所选字段的必填字段?比如“此字段为必填项”

【问题讨论】:

标签: jquery jquery-chosen


【解决方案1】:

我最终使用了https://github.com/harvesthq/chosen/issues/2075#issuecomment-193805605中提到的解决方法

也就是说,找到chosen.jquery.js中的那一行

this.form_field_jq.hide().after(this.container);

替换为

this.form_field_jq.css('position', 'absolute').css('opacity', 0).after(this.container);

“使select 元素不可见”而不是告诉浏览器隐藏它是一种技巧。因此,Chrome 将能够在需要显示“请选择列表中的项目”消息时找到该元素。

【讨论】:

  • 这种方法有问题。您必须检查“选择”宽度是否与“选择”宽度相同,否则可能会在没有意识到的情况下选择选择
  • 我会把它改成:this.form_field_jq.css('position', 'absolute').css('opacity', 0).css('width', 0).after(this.container);
  • 我已经改变了这个:this.form_field_jq.css('position', 'absolute').css('opacity', 0).css('width', 0).after(this.container) 这个:this.form_field_jq.css('position', 'absolute').css('opacity', 0).css('height', 0).after(this.container) 这对我来说适用于 BS4
【解决方案2】:

如果您对所有 select 元素使用 Chosen,则可以使用此 CSS 更改使其可见(对 DOM),但没有不透明度、没有高度、绝对位置。

这些 CSS 选择器以无效的选择元素为目标,其中一个以 multiple 为目标,添加了一个 15px margin-top 以使其在多选元素上居中。

select:invalid {
    height: 0px !important;
    opacity: 0 !important;
    position: absolute !important;
    display: flex !important;
}

select:invalid[multiple] {
    margin-top: 15px !important;
}

演示:http://jsfiddle.net/tripflex/2zdeu9oc/

【讨论】:

  • 考虑到它是最优雅的解决方案,这应该会得到更多的支持,您可以将它与 choosen.js 的 CDN 调用一起使用...
  • 手机屏幕上呢
  • Chosen.JS 不支持移动端
【解决方案3】:

作为“选择”插件创建一些 HTML 标记并隐藏原始 html &lt;select&gt;

将所选元素突出显示/标记为错误(通过添加 CSS 类 .error) 我们需要覆盖/修改默认的“highlight”和“unhiglight”函数:

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

            // chosen specific
            if( $(element).hasClass('chzn-done') ){
                //$( element ).parent().find('.chzn-container').addClass( errorClass ).removeClass( validClass );
                $('#' + element.id + '_chzn').addClass( errorClass ).removeClass( validClass );
            }
        }
    },
    unhighlight: function( element, errorClass, validClass ) {
        if ( element.type === "radio" ) {
            this.findByName( element.name ).removeClass( errorClass ).addClass( validClass );
        } else {
            $( element ).removeClass( errorClass ).addClass( validClass );

            // chosen specific
            if( $(element).hasClass('chzn-done') ){
                $('#' + element.id + '_chzn').removeClass( errorClass ).addClass( validClass );
            }
        }
    }
});

还有一些 CSS 示例:

.chzn-container.error a{
    border: 1px solid #ff0000;
}

【讨论】:

    【解决方案4】:

    我知道这是一个老问题,但是我碰到了这个问题,所以我解决它的方式:

    $("form").find('input, textarea, select').each(function() {
    if($(this).prop('required')) {
        if(!$.trim(this.value).length) { do something ..}
                    // this here checks if input is only spaces (prevents the html required fields to accept spaces as input)
    } 
    if(this.id == "selectBox"){
        if(this.value == ""){
                e.preventDefault();
                $('#selectBox_chosen').addClass('redBorder');
        } else {
               $('#selectBox_chosen').removeClass('redBorder');
        }
    }});
    

    css 就是

    .redBorder{ border: 1px solid red;)}
    

    它的作用是 - 它遍历所有输入元素(在我的表单中)并检查它们是否为空,然后检查带有 Chosen 样式的特定搜索框 - 如果给定元素是我需要的元素将 css 设置为由选择的新元素生成的。

    适用于 IE 11 以及大多数版本的 Firefox 和 Chrome。

    【讨论】:

      【解决方案5】:

      这取决于你想要什么样的亮点。在这里,您有一个我如何进行验证的示例,包括选择的所需组合。可能比您想要的更多信息,但我认为没有所有信息很难理解它是如何工作的。

      首先,我使用一个类来验证我在必要时添加或删除元素。我有这样选择的特定 CSS:select.validate:invalid+.chosen-container

      所以完整的代码是:

      /* CSS */
      .validate:invalid, .validate:invalid+label, 
          select.validate:invalid+.chosen-container {
          box-shadow: 0px 3px 0px -1px red;
          background-color: #fdf0f0;
      }
      

      用这个方法:

      function validateFields(formId) {
          var dataIsValid = false;
          var id = formId != '' && formId != undefined ? '#' + formId : ''
          if(jQuery(id + ' :invalid').length > 0) {
              jQuery(id + ' :valid').removeClass('validate');
              jQuery(id + ' :invalid').addClass('validate');
              openModal('invalidData');
          } else {
              jQuery(':valid').removeClass('validate');
              dataIsValid = true;
          }
          return dataIsValid;
      }
      

      这用于验证任何形式:

      if(validateFields('formId')) {
          //TODO
      }
      

      这很适合我选择

      【讨论】:

        【解决方案6】:

        我刚刚遇到了同样的问题。 @AlejandroVD 的回答为我指明了正确的方向(Github),我最终在其中找到了这两个回复:

        我将第一个链接中的 JS 与第二个链接中的 CSS 结合起来,效果很好。

        具体来说,这是我为 Chosen v1.8.7 所做的:

        1. 打开 selected.js 并在第 199 行找到:

        this.form_field_jq.hide().after(this.container),

        1. 用这个替换它:

        this.form_field_jq.addClass('chosen-master').after(this.container),

        1. 将这些 CSS 属性添加到该类:
        .chosen-master {
          display: inline-block !important;
          width: 1px;
          height: 1px;
          margin: 0;
          padding: 0;
          border: 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2015-12-10
          • 1970-01-01
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-18
          • 1970-01-01
          相关资源
          最近更新 更多