Reputation: 4264
I have a list several lists on my page see example below
<div id="test1" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
<div id="test2" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
I want the data-view attribute to have the name of the parent id.
Eg: in the first list data-view should be called data-viewtest1 and in the second list they should be data-viewtest2
I have the below js:
$("li").each(function () {
var id = $('.testlist').attr('id') || '';
console.log(id);
$(this).attr({
newData: $(this).attr('data-view'),
//data-view: $(this).attr('data-view'),
})
.removeAttr('data-view');
});
I can replace the attribute data-view and call it newData but if I try and rename it data-view
I get the syntax error
SyntaxError: missing : after property id
Is there a way to rename a data attribute? I want it to be :
data-view + id: $(this).attr('data-view'),
Also in the console.log I get 20 test1 where I should be getting 10 test1 and 10 test2, is there another way to approach this?
See full example:
$("li").each(function() {
var id = $('.testlist').attr('id') || '';
console.log(id);
$(this).attr({
newData: $(this).attr('data-view'),
//data-view: $(this).attr('data-view'),
})
.removeAttr('data-view');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="test1" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
<div id="test2" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
Upvotes: 4
Views: 1411
Reputation: 1914
you can do it by doing this way.
$(this).attr('data-view',NEW_Value);
Upvotes: 0
Reputation: 1979
ON this case change this:
var id = $('.testlist').attr('id') || '';
for this
var id = $(this).parent().parent().attr('id') || '';
This is the reason you're getting 20 test1 instead 10 test1 10 test2
Check the code snippet:
$("li").each(function() {
var id = $(this).parent().parent().attr('id') || '';
console.log(id);
$(this).attr({
newData: $(this).attr('data-view'),
//data-view: $(this).attr('data-view'),
})
.removeAttr('data-view');
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="test1" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
<div id="test2" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
Maybe will be a better way to obtain the parent div id, but this works with your code.
Upvotes: 0
Reputation: 82251
use .data()
instead:
$(this).data('view'),
Update:
$("li").each(function () {
var id = $(this).closest('.testlist').attr('id') || '';
console.log(id);
$(this).data('view' + id, $(this).data('view')).removeData('data');
console.log($(this).data('view' + id))
});
Working demo:
$("li").each(function() {
var id = $(this).closest('.testlist').attr('id') || '';
console.log(id);
$(this).data('view' + id, $(this).data('view')).removeData('data');
console.log($(this).data('view' + id))
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="test1" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
<div id="test2" class="testlist">
<ul>
<li title="test" data-view="0">Any</li>
<li title="test" data-view="101">list item 101</li>
<li title="test" data-view="102">list item 102</li>
<li title="test" data-view="103">list item 103</li>
<li title="test" data-view="104">list item 104</li>
<li title="test" data-view="105">list item 105</li>
<li title="test" data-view="106">list item 106</li>
<li title="test" data-view="107">list item 107</li>
<li title="test" data-view="108">list item 108</li>
<li title="test" data-view="109">list item 109</li>
</ul>
</div>
Upvotes: 1
Reputation: 11552
I'm not sure what you're trying to accomplish, but I'm going to address your concerns:
Syntax Error
Wrap data-view
in quotes.
20 test1 vs 10 test1 and 10 test2
When you do $('.testlist').attr('id')
, it will only use the first result of the selector, test1
. Try something like this instead:
var id = $(this).parents('.testlist').attr('id') || '';
Trying to dynamically set the attribute name
Try the object[property] = value
syntax. Like this:
$("li").each(function () {
var id = $(this).parents('.testlist').attr('id') || '',
newAttributes = {};
newAttributes['data-view-' + id] = $(this).attr('data-view');
$(this).attr(newAttributes).removeAttr('data-view');
});
Upvotes: 2
Reputation: 385
why you want to do this? if it is to give unique name, then better you search them from parent id,
$("#test1").find("div[data-view='101']")
or
$("#test1 div[data-view='101']")
Upvotes: 0
Reputation: 288710
Try this:
$('.testlist').each(function() {
var id = this.id;
$(this).find('li').each(function(){
$(this)
.attr('data-view' + id, $(this).attr('data-view'))
.removeAttr('data-view');
});
});
Upvotes: 0
Reputation: 18109
$(document).ready(function () {
$('.testlist').each(function(){
var d = $(this);
var id = d.attr('id');
d.find('li').each(function(){
var li = $(this);
var val = li.attr('data-view');
li.attr('data-view'+id,val).removeAttr('data-view');
});
});
});
Upvotes: 0
Reputation: 76369
Either:
$(this).attr('data-view' + id, $(this).attr('data-view'));
Or:
var attrs = {};
attrs['data-view' + id] = $(this).attr('data-view');
$(this).attr(attrs);
Upvotes: 0