#jquery #find #attr #indexof #custom-data-attribute
#jquery #Найти #attr #indexof #пользовательский атрибут данных
Вопрос:
У меня есть список div в моем коде, которым присвоен пользовательский атрибут данных, который является «data-for».
Что мне нужно сделать, это найти div, у которого есть атрибут data-for, который соответствует части URL-адреса.
Например, список div может быть:
<div data-for="north-west"></div>
<div data-for="south-west"></div>
etc
Если URL-адрес текущей страницы http://www.mysite.com/shops/north-west.html , я хочу найти div с атрибутом данных северо-запада (div data-for=»северо-запад) и присвоить ему идентификатор или класс.
Кто-нибудь может мне помочь с этим? Это должно быть быстрым, так как список divs довольно длинный.
Заранее спасибо за помощь.
Ответ №1:
Если вас беспокоит производительность, отключите пользовательский атрибут data (который является самым медленным из возможных селекторов) и используйте вместо него ID.
//Parse out the name of the HTML page you're on.
var selector = window.location.split('/')[2].replace('.html', '');
//Use it as your selector.
$('#' selector).addClass('foo');
В противном случае используйте этот селектор:
$('div[data-for="' selector '"]').addClass('bar');
Ответ №2:
Вы можете использовать метод фильтрации jQuery
Демонстрация 1
loc = location.pathname;
$("div[data-for]").filter(function(index){
var obj = loc.match(this.getAttribute("data-for"));
if(obj)
return obj.length > 0;
else
return false;
}).css({color:"red"})
РЕДАКТИРОВАТЬ: или еще лучше
Демонстрация 2
$("div[data-for]").filter(function(index){
var reg = new RegExp($(this).data("for"))
return reg.test(location.pathname);
}).css({color:"red"});
Ответ №3:
$('div').each(function() { // probably should use a more narrow selector
var str = $(this).data('for'); // accesses 'data-for' attribute
if (window.location.href.indexOf(str))>=0) {
// match found; do something
}
});
Комментарии:
1. Интересное решение, если не сказать хрупкое. Остерегайтесь данных — для атрибутов «foo» и «fooBar», так как при циклическом просмотре divs с URL-адресом, содержащим «fooBar», он также будет отображаться / находить «foo».
2. Все очень хорошие ответы, но этот, кажется, лучший для меня. Я бы использовал идентификатор, но это означало бы аннулирование моего кода, поскольку у меня было бы много повторяющихся идентификаторов.
Ответ №4:
Плагин метаданных отлично подойдет для этого; например
<div class="foo {bar: 'north-west'} baz"></div>
<script type="text/javascript">
$(function() {
$('div').each(function() {
var meta = $(this).metadata();
console.log(meta);
// And then do something with meta...
});
});
</script>
Ответ №5:
Вы можете получить свой путь и заменить все, кроме имени файла, ни на что, так что у вас будет то, что вам нужно.
<script type="text/javascript">
$(document).ready(function() {
var data_for = window.location.pathname.replace(/^.*/([^/] ).html/, '$1');
$("div[data-for=" data_for "]").something();
});
</script>