Jquery получает атрибут из нескольких ul для создания другого атрибута

#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') });