#javascript #jquery
#javascript #jquery
Вопрос:
У меня есть следующий HTML:
<ul actualpage=0>
<li/>
<li/>
....
</ul>
<ul actualpage=0>
<li/>
<li/>
....
</ul>
Я пытаюсь получить значение actualpage для каждого ul и создать новый атрибут. Это просто, но не в одном предложении jquery… Это возможно? До сих пор у меня есть следующая строка (между ## символами отсутствует часть, которая мне нужна.
/*
select all uls with attribute actualpage and create a new attribute on each with the current actualpage value
*/
$('ul[actualpage]').attr('newactualpage',##Current value of actualpage attr of UL##);
Ответ №1:
Ну, может быть, это не так приятно, как вам хотелось бы, но
$('ul[actualpage]').each(function(_, ul) { $(ul).attr('newactualpage', $(ul).attr('actualpage')); });
Ответ №2:
Можно подумать, что
$('ul[actualpage]').attr('newactualpage',$(this).attr('actualpage'))
это ответ.
Однако, this
вычисляется перед вызовом attr
, поэтому он будет равен тому, что this
равно в контексте вызова.
Вы могли бы использовать:
$('ul[actualpage]').attr('newactualpage',function(){
return $(this).attr('actualpage');
});
или это:
$('ul[actualpage]').each(function()
{
$(this).attr('newactualpage',$(this).attr('actualpage'));
};
В обоих, this
ссылается на элемент, которому соответствует ваш селектор.
Комментарии:
1. Ну, также имейте в виду, что «this», на которое вы ссылаетесь в списке аргументов функции «attr», не будет иметь никакого отношения к выбранному списку
<ul>
элементов. Это было бы то, на что ссылается «this» в контексте самого выражения jQuery.2. Перечитывая это, я должен пометить это как просто неправильное. Независимо от того, меняется ли «actualpage» от тега к тегу, первое решение просто не будет работать.
3. Первое ограничение .attr() применяется только для получения атрибута, а не для его установки, верно?
4. @Pointy; ценю, что вы нашли время проверить правильность моего решения, но я не согласен с вашей оценкой. Если вы используете
$
функцию с контекстом селектора,this
ссылается на простой элемент DOM, который был выбран вашим селектором. Это указано в документации здесь: api.jquery.com/jQuery/#jQuery1 Тем не менее, если я что-то упустил из виду или ваша интерпретация отличается, пожалуйста, дайте мне знать; я бы предпочел узнать что-то новое, чем быть догматичным в своей правоте.5. Извините @Dancrumb, но вы не правы. Это достаточно просто попробовать и посмотреть. Просто подумайте о том, как выражение jQuery должно оцениваться интерпретатором: когда вы вводите «this» в аргумент функции, это должно быть оценено перед вызовом функции. То есть вся цепочка «function().function().function()…» подготавливается в контексте вызова, перед любыми назначениями «this» в фактически вызываемых функциях.
Ответ №3:
Вы можете использовать функцию в качестве второго аргумента для .attr(), устраняя необходимость в .each():
$('ul[actualpage]').attr('newactualpage', function() { return $(this).attr('actualpage') });