通过部分属性值获取元素
Get Elements By Partial Attribute Value
几个小时以来我一直在摆弄它,我完全被它的行为难住了。在 JSFiddle 上,当我想要整个元素时,它似乎只返回 href 属性的值,但我仍然可以像使用元素一样使用 getAttribute(attribute) 。在用户脚本中,它似乎在调用函数后完全破坏了一切(因此转向 JSFiddle 并且没有结果显示在这里)。
为什么会这样?我怎样才能完成既定目标?
HTML:
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
JavaScript函数:
function getElementsByPartialValue(searchtext, searchattr, searchtag)
{
var searchreturn = [];
var searchreturni = 0;
var tagmatches = document.getElementsByTagName(searchtag);
for (var tagmatchesi = 0; tagmatchesi < document.getElementsByTagName(searchtag).length; tagmatchesi++)
{
if (tagmatches[tagmatchesi].getAttribute(searchattr).indexOf(searchtext) > -1)
{
searchreturn[searchreturni] = tagmatches[tagmatchesi];
searchreturni++;
}
}
return searchreturn;
}
检查结果:
alert(getElementsByPartialValue('edit', 'name', 'a')[0]);
结果(https://jsfiddle.net/81s4g42a/3/):
http://example.com/edit1
访问其他属性(https://jsfiddle.net/81s4g42a/4/):
alert(getElementsByPartialValue('edit', 'name', 'a')[0].getAttribute('name'));
结果:
edit-a
使用.querySelectorAll()
,属性等于或开头后跟"-"
选择器
var tagMatches = document.querySelectorAll("a[name|='edit']");
console.log(tagMatches);
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
像这样使用Attribute-Contains Selector:
var tagmatches = document.querySelectorAll(searchtag + "[" + searchattr + " *= '" + searchtext + "']");
function getElementsByPartialValue(searchtext, searchattr, searchtag)
{
return document.querySelectorAll(searchtag + "[" + searchattr + " *= '" + searchtext + "']");
}
var elems = getElementsByPartialValue("edit", "name", "a");
for(var i = 0; i < elems.length; i++) {
elems[i].style.background = "red";
}
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
我不想这么说,但它 returning "name",而不是 "href",如果你想要 url,你应该 return "href",而不是 "name"... 检查您的脚本,您会发现您已将第一个标签的名称设置为 "edit-a",因此当提醒 [0] 的名称时你得到 "edit-a"。如果你访问 [1],你会得到 "edit-b",如果你使用 1 而不是 'name',你会得到“http://example.com/boo”,它会跳过第二个 "moo" 作为名称,因为您只搜索名称中带有 "edit" 的名称,而不是 href/url.
alert(getElementsByPartialValue('edit', 'name', 'a')[0].getAttribute('href'));
我测试了您的代码示例,发现您的代码执行得非常好。问题出在 "alert()" 函数,尝试使用控制台日志,您会发现您的代码确实有效。
几个小时以来我一直在摆弄它,我完全被它的行为难住了。在 JSFiddle 上,当我想要整个元素时,它似乎只返回 href 属性的值,但我仍然可以像使用元素一样使用 getAttribute(attribute) 。在用户脚本中,它似乎在调用函数后完全破坏了一切(因此转向 JSFiddle 并且没有结果显示在这里)。
为什么会这样?我怎样才能完成既定目标?
HTML:
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
JavaScript函数:
function getElementsByPartialValue(searchtext, searchattr, searchtag)
{
var searchreturn = [];
var searchreturni = 0;
var tagmatches = document.getElementsByTagName(searchtag);
for (var tagmatchesi = 0; tagmatchesi < document.getElementsByTagName(searchtag).length; tagmatchesi++)
{
if (tagmatches[tagmatchesi].getAttribute(searchattr).indexOf(searchtext) > -1)
{
searchreturn[searchreturni] = tagmatches[tagmatchesi];
searchreturni++;
}
}
return searchreturn;
}
检查结果:
alert(getElementsByPartialValue('edit', 'name', 'a')[0]);
结果(https://jsfiddle.net/81s4g42a/3/):
http://example.com/edit1
访问其他属性(https://jsfiddle.net/81s4g42a/4/):
alert(getElementsByPartialValue('edit', 'name', 'a')[0].getAttribute('name'));
结果:
edit-a
使用.querySelectorAll()
,属性等于或开头后跟"-"
选择器
var tagMatches = document.querySelectorAll("a[name|='edit']");
console.log(tagMatches);
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
像这样使用Attribute-Contains Selector:
var tagmatches = document.querySelectorAll(searchtag + "[" + searchattr + " *= '" + searchtext + "']");
function getElementsByPartialValue(searchtext, searchattr, searchtag)
{
return document.querySelectorAll(searchtag + "[" + searchattr + " *= '" + searchtext + "']");
}
var elems = getElementsByPartialValue("edit", "name", "a");
for(var i = 0; i < elems.length; i++) {
elems[i].style.background = "red";
}
<a name="edit-a" href="http://example.com/edit1">foo</a>
<a name="moo" href="http://example.com/edit2">roo</a>
<a name="edit-b" href="http://example.com/boo">bar</a>
我不想这么说,但它 returning "name",而不是 "href",如果你想要 url,你应该 return "href",而不是 "name"... 检查您的脚本,您会发现您已将第一个标签的名称设置为 "edit-a",因此当提醒 [0] 的名称时你得到 "edit-a"。如果你访问 [1],你会得到 "edit-b",如果你使用 1 而不是 'name',你会得到“http://example.com/boo”,它会跳过第二个 "moo" 作为名称,因为您只搜索名称中带有 "edit" 的名称,而不是 href/url.
alert(getElementsByPartialValue('edit', 'name', 'a')[0].getAttribute('href'));
我测试了您的代码示例,发现您的代码执行得非常好。问题出在 "alert()" 函数,尝试使用控制台日志,您会发现您的代码确实有效。