【问题标题】:jQuery Selector Not Functioning as ExpectedjQuery 选择器未按预期运行
【发布时间】:2015-01-24 15:05:04
【问题描述】:

我遇到了一些 jQuery 代码的问题。我无法让选择器正常工作。选择器应该用div except 包装我页面上的所有inputs checkboxesradios。这是我用来尝试完成此操作的 jQuery 选择器:

//Wrap input tags in col-sm-9
$("#custom-form-builder input[type!=radio], input[type!=checkbox]").not('#custom-form-builder .datepickercontroller').wrap('<div class="col-sm-9">');

这是我的 HTML 代码:

<div class="form-group required checkboxerrr">
    <label class="col-sm-3 control-label">Multiselect</label>
    <div class="col-sm-9 control-class">
        <div class="checkbox check-info">
          <input type="checkbox" checked="checked" value="1" id="checkbox5">
          <label for="checkbox5" class="no-asterisk">Action</label>
        </div>
        <div class="checkbox check-info">
          <input type="checkbox" checked="checked" value="1" id="checkbox6">
          <label for="checkbox6" class="no-asterisk">Mark as read</label>
        </div>
    </div>
</div>

在这个 jQuery 选择器执行之后,radios 没有被包裹在这个:&lt;div class="col-sm-9"&gt; 中。但是,我的checkboxes 是。这是执行 jQuery 选择器后的最终 HTML:

<div class="form-group required checkboxerrr">
<label class="col-sm-3 control-label">Multiselect</label>
<div class="control-class col-sm-9">
    <div class="checkbox check-info">
      <div class="col-sm-9"><input type="checkbox" checked="checked" value="1" id="checkbox5"></div>
      <label for="checkbox5" class="no-asterisk col-sm-3 control-label">Action</label>
    </div>
    <div class="checkbox check-info">
      <div class="col-sm-9"><input type="checkbox" checked="checked" value="1" id="checkbox6"></div>
      <label for="checkbox6" class="no-asterisk col-sm-3 control-label">Mark as read</label>
    </div>
</div>

感谢任何帮助!

【问题讨论】:

  • != 属性选择器不存在。试试这个:#custom-form-builder input:not([type=radio]):not([type=checkbox])
  • @CBroe 确实如此,必须自己查一下api.jquery.com/attribute-not-equal-selector
  • @charlietfl:啊,谢谢,我不知道 jQuery 将它作为原生 CSS 选择器的扩展。
  • 你的代码似乎在这里工作正常jsfiddle.net/0n7ndo6k你的html没有id=custom-form-builder虽然

标签: javascript jquery html css jquery-selectors


【解决方案1】:

您的选择器对输入类型无效。您必须使用not 选择器。

$("#custom-form-builder input:not[type=radio], input:not[type=checkbox]").not('#custom-form-builder .datepickercontroller').wrap('<div class="col-sm-9">');

【讨论】:

  • 值得注意的是,有时使用.not() 可能更可取,尤其是在需要遍历 DOM 时;)但这也是一个非常优雅的解决方案!
  • 感谢您的回复。但是,这有点工作,但我在控制台中收到以下错误,导致页面完全停止工作。这是错误:[Error] TypeError: undefined is not an object (evaluating 'e.replace') (anonymous function) (jquery-1.8.3.min.js, line 2) PSEUDO (jquery-1.8.3.min.js, line 2) ht (jquery-1.8.3.min.js, line 2) compile (jquery-1.8.3.min.js, line 2) vt (jquery-1.8.3.min.js, line 2) vt (jquery-1.8.3.min.js, line 2) nt (jquery-1.8.3.min.js, line 2)
【解决方案2】:

根据您的原始代码,我猜您希望输入元素满足以下条件:

  • #custom-form-builder 的后代
  • 既不是复选框也不是单选元素
  • 没有类datepickercontrol

但是,您的选择器 "#custom-form-builder input[type!=radio], input[type!=checkbox]" 有点问题(就逻辑而言),因为它:

  1. 忽略#custom-form-builder 中的非无线电输入,但是
  2. 忽略整个 HTML 文档中的非复选框输入

有几种方法可以做到这一点。

使用.not(),一个jQuery方法

使用.not() 的优点是您始终可以通过链接其他方法访问父元素和/或执行 jQuery 中缓存元素的 DOM 遍历。

$("#custom-form-builder :input")
.not('input[type="checkbox"], input[type="text"], .datepickercontrol')
.wrap('<div class="col-sm-9" />');

奖励:使用.filter(),一种 jQuery 方法

.filter() 函数允许您有条件地删除最初由选择器获取的项目。然后,您可以将此函数之后的链接方法应用于过滤后的元素子集。这种方法对于简单的应用程序来说可能听起来很冗长,但对于复杂的条件过滤非常有用。

$("#custom-form-builder :input")
.filter(function() {
    return ($(this).attr('type') != 'checkbox' && $(this).attr('type') != 'radio' && !$(this).hasClass('.datepickercontrol'));
})
.wrap('<div class="col-sm-9" />');

【讨论】:

    【解决方案3】:

    你的代码语法错误试试这个:

    $("#custom-form-builder").not('input[type=radio]').not('input[type=checkbox]')not('#custom-form-builder .datepickercontroller').wrap('<div class="col-sm-9">');
    

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多