当我按类而不是按元素名称选择jQuery时,jQuery似乎隐藏了
td
元素。 例如,为什么这样做:
$(".bold").hide(); // selecting by class works
$("tcol1").hide(); // select by element name does not work
请注意下面的HTML,第二列的所有行都具有相同的名称。如何使用
name
属性创建此集合?<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
#1 楼
您可以使用jQuery属性选择器:$('td[name ="tcol1"]') // matches exactly 'tcol1'
$('td[name^="tcol"]' ) // matches those that begin with 'tcol'
$('td[name$="tcol"]' ) // matches those that end with 'tcol'
$('td[name*="tcol"]' ) // matches those that contain 'tcol'
评论
出于好奇,一个人如何将其写为NOT tcol1,就像他们想隐藏tcol1以外的其他列一样呢?
– HPWD
2012年2月3日在17:52
@Varun-您可以省略td ...例如$('[name ^ = tcol]')将匹配所有具有'name'属性且其值以'tcol'开头的元素
–乔恩·埃里克森(Jon Erickson)
2012年7月9日下午6:36
我不得不像$('td [name = tcol1]')一样使用它-td和[]之间没有空格,它返回了NULL。
– akki
2014-12-17 11:14
@DougMolineux实际上,他正在匹配名称的前缀。
– maroreoraft
15年10月17日在16:51
@HPWD您可以使用:not选择器,例如$(“ td:not([name ='tcol1'])”)。您可以在这个小提琴中看到它
– JohannesB
16年5月11日在11:51
#2 楼
可以使用[attribute_name=value]
方式选择任何属性。在此处查看示例:
var value = $("[name='nameofobject']");
评论
但您应该使用上面的代码,以免错过qoutations!祝你好运,欢迎来到Stackoverflow社区:)
– Afzaal Ahmad Zeeshan
2013年9月22日19:11
至少对我来说这是行不通的-但是下面的语句起作用var value = $(“ [name = nameofobject]”);
–普拉纳夫
2014-09-22 6:28
令人惊讶的是,这是在最初接受的答案发布4年后获得17次投票的
–黄种人
2015年3月25日在20:41
现在21票赞成...也许是因为答案比'td [name = tcol1]'少混乱,尤其是因为不需要td并因此导致像我这样的人走错了路
–克里斯·斯普拉格(Chris Sprague)
2015年6月9日下午6:03
我的输入名称有一个[],如下所示:。因此,由于正确使用了引号,因此此答案比接受的答案更完美。
– Sunish Menon
16年7月30日在7:48
#3 楼
如果您有类似的内容:<input type="checkbox" name="mycheckbox" value="11" checked="">
<input type="checkbox" name="mycheckbox" value="12">
您可以阅读以下内容:
jQuery("input[name='mycheckbox']").each(function() {
console.log( this.value + ":" + this.checked );
});
代码段:
jQuery("input[name='mycheckbox']").each(function() {
console.log( this.value + ":" + this.checked );
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="checkbox" name="mycheckbox" value="11" checked="">
<input type="checkbox" name="mycheckbox" value="12">
#4 楼
您可以按老式方式命名元素数组,并将该数组传递给jQuery。 function toggleByName() {
var arrChkBox = document.getElementsByName("chName");
$(arrChkBox).toggle();
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<head>
<title>sandBox</title>
</head>
<body>
<input type="radio" name="chName"/><br />
<input type="radio" name="chName"/><br />
<input type="radio" name="chName"/><br />
<input type="radio" name="chName"/><br />
<input type="button" onclick="toggleByName();" value="toggle"/>
</body>
</html>
注意:只有当您有理由使用“名称”属性时,才应使用复选框或单选框输入。
也可以只添加选择元素的另一个类。(这就是我要做的)
function toggleByClass(bolShow) {
if (bolShow) {
$(".rowToToggle").show();
} else {
$(".rowToToggle").hide();
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<html>
<head>
<title>sandBox</title>
</head>
<body>
<table>
<tr>
<td>data1</td>
<td class="bold rowToToggle">data2</td>
</tr>
<tr>
<td>data1</td>
<td class="bold rowToToggle">data2</td>
</tr>
<tr>
<td>data1</td>
<td class="bold rowToToggle">data2</td>
</tr>
</table>
<input type="button" onclick="toggleByClass(true);" value="show"/>
<input type="button" onclick="toggleByClass(false);" value="hide"/>
</body>
</html>
#5 楼
您可以使用jQuery中的name元素从输入字段中获取名称值,方法是: var firstname = jQuery("#form1 input[name=firstname]").val(); //Returns ABCD
var lastname = jQuery("#form1 input[name=lastname]").val(); //Returns XYZ
console.log(firstname);
console.log(lastname);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form name="form1" id="form1">
<input type="text" name="firstname" value="ABCD"/>
<input type="text" name="lastname" value="XYZ"/>
</form>
评论
+1给出的唯一示例选择一个包括类型的名称字段并将结果限制在id部分内。
– SharppC
2015年10月6日15:58
我同意。您的页面中可以有多种形式,限制为正确的形式是一个好主意。
– Kar.ma
16年5月19日在16:34
#6 楼
框架通常使用以下形式的括号名称:<input name=user[first_name] />
它们可以通过以下方式访问:
// in JS:
this.querySelectorAll('[name="user[first_name]"]')
// in jQuery:
$('[name="user[first_name]"]')
// or by mask with escaped quotes:
this.querySelectorAll("[name*=\"[first_name]\"]")
#7 楼
我已经完成了这样的工作,并且可以正常工作:$('[name="tcol1"]')
https://api.jquery.com/attribute-equals-selector/
#8 楼
您忘记了第二组引号,这会使接受的答案不正确:$('td[name="tcol1"]')
评论
例如,如果字段名称是'td [name =“ nested [fieldName]”]'
–relytmcd
18年6月13日在23:57
这是真的。当遇到基于属性的选择器元素而没有正确引用时,较新版本的jQuery(3.2.1版)更有可能失败。
–HoldOffHunger
18年6月27日在18:03
#9 楼
这是一个简单的解决方案:$('td[name=tcol1]')
#10 楼
您可以通过使用JQuery的ID属性在JQuery中获得该元素,如下所示:评论
仅匹配单个元素
– T.T.T.
09年7月10日在1:10
对于那个很抱歉。照本·森所说的去做。
–CalebHC
09年7月10日在1:14
是的,关于ID的说法是正确的。至于按名称选择,我认为这里有一篇提到Selectors / attributeEquals的帖子很有帮助。
– T.T.T.
09年7月10日在1:21
也许问题已经过编辑,但是他现在正在要求名称参考,但是可以,单个元素可以使用id选择器
– nckbrz
2014年11月2日在15:29
实际询问姓名
– Prathamesh更多
5月1日12:45
#11 楼
您可以将任何属性用作[attribute_name=value]
的选择器。$('td[name=tcol1]').hide();
#12 楼
就个人而言,我过去所做的就是给他们一个通用的类ID,并使用它来选择它们。这可能不是理想的选择,因为它们指定了可能不存在的类,但这使选择变得容易得多。只需确保您的类名是唯一的即可。即对于上面的示例,我将按类别使用您的选择。最好还是将类名称从粗体更改为“ tcol1”,这样您就不会在jQuery结果中包含任何意外包含。如果粗体确实引用了CSS类,则始终可以在类属性中同时指定两者-即'class =“ tcol1 bold”'。
总而言之,如果无法按名称选择,要么使用复杂的jQuery选择器并接受任何相关的性能命中,要么使用类选择器。
您总是可以通过包含表名来限制jQuery范围,即
$('#tableID> .bold ')
这将限制jQuery搜索“世界”。
它仍然可以归类为复杂的选择器,但是它很快将任何搜索限制在表中'#tableID'的ID,因此将处理保持在最低水平。
如果要在#table1中查找多个元素,则可以单独查找该元素,然后再查找将其传递给jQuery,因为这限制了范围,但每次都节省了一些查找它的处理过程。
var tbl = $('#tableID');
var boldElements = $('.bold',tbl);
var rows = $('tr',tbl);
if (rows.length) {
var row1 = rows[0];
var firstRowCells = $('td',row1);
}
评论
有点罗word的答案,但这从根本上是正确的整体方法。
–HoldOffHunger
18年6月27日在18:01
可能有点罗word,但比起一条解释不多的单行,最好在建议后面多一点解释和推理! ;)当某人是某事物的新手并试图理解为什么a)它起作用以及b)它如何起作用时,它很有用
– Steve Childs
18年6月28日在15:38
#13 楼
性能今天(2020.06.16)我在Chrome 83.0,Safari 13.1.1和Firefox 77.0的MacOs High Sierra上针对所选解决方案执行测试。
结论
按名称获取元素
getElementByName
(C)是适用于大型阵列和小型阵列的所有浏览器的最快解决方案-但是,我可能是某种延迟加载解决方案,或者它使用带有名称-元素对的某些内部浏览器哈希缓存混合js-jquery解决方案(B)比
querySelectorAll
(D)解决方案快纯jquery解决方案(A)最慢
按名称获取行并将其隐藏(我们不包括预先计算的行)相比之下,本机解决方案(I)-理论上最快)-用作参考)
令人惊讶的是,混合js-jquery解决方案(F)在所有浏览器上最快。
令人惊讶的是,预先计算的解决方案(我)比大表的jQuery(E,F)解决方案要慢(!!!)-我检查了.hide()jQuery方法在隐藏元素上设置了样式
"default:none"
-但看起来他们发现这样做的更快方法是n element.style.display='none'
大表上的jQuery(E)解决方案非常快
小表上的jQuery(E)和querySelectorAll(H)解决方案最慢
getElementByName(G)和querySelectorAll(H)解决方案对于大表来说相当慢
详细信息
我对名称为(A,B,C,D)的读取元素执行了两次测试,并将其隐藏元素(E,F,G,H,I)
小表-3行-可以在此处运行测试
大表-1000行-可以在此处运行测试
下面的代码段显示了使用的代码
//https://stackoverflow.com/questions/1107220/how-can-i-select-an-element-by-name-with-jquery#
// https://jsbench.me/o6kbhyyvib/1
// https://jsbench.me/2fkbi9rirv/1
function A() {
return $('[name=tcol1]');
}
function B() {
return $(document.getElementsByName("tcol1"))
}
function C() {
return document.getElementsByName("tcol1")
}
function D() {
return document.querySelectorAll('[name=tcol1]')
}
function E() {
$('[name=tcol1]').hide();
}
function F() {
$(document.getElementsByName("tcol1")).hide();
}
function G() {
document.getElementsByName("tcol1").forEach(e=>e.style.display='none');
}
function H() {
document.querySelectorAll('[name=tcol1]').forEach(e=>e.style.display='none');
}
function I() {
let elArr = [...document.getElementsByName("tcol1")];
let length = elArr.length
for(let i=0; i<length; i++) elArr[i].style.display='none';
}
// -----------
// TEST
// -----------
function reset() { $('td[name=tcol1]').show(); }
[A,B,C,D].forEach(f=> console.log(`${f.name} rows: ${f().length}`)) ;
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<div>This snippet only presents used codes</div>
<table>
<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
<tr>
<td>data1</td>
<td name="tcol1" class="bold"> data2</td>
</tr>
</table>
<button onclick="E()">E: hide</button>
<button onclick="F()">F: hide</button>
<button onclick="G()">G: hide</button>
<button onclick="H()">H: hide</button>
<button onclick="I()">I: hide</button><br>
<button onclick="reset()">reset</button>
Chrome上的示例结果
#14 楼
您可以使用以下功能:get.elementbyId();
评论
OP希望通过名称而不是ID来获取。什么是get.elementbyId()?您是说document.getElementById()吗?
–巴布桑
19年6月19日在7:39
不,他要求按名称选择元素。
–巴布桑
19年6月19日在7:47
评论
问题与内容不符。 ID和名称是不同的属性,并且选择的方式不同具有相同ID的元素违反W3C标准;即重复的ID为No.