Reputation: 13
Ok I have this HTML code:
<ul>
<li data-gt="{'alert_id':11111,'type':'hello'}"></li>
<li data-gt="{'alert_id':11111,'type':'bye'}"></li>
<li data-gt="{'alert_id':11111,'type':'hello'}"></li>
<li data-gt="{'alert_id':11111,'type':'bye'}"></li>
</ul>
I want to delete all li tags containing "type":"hello". And I want to be counted all deleted tags, in a var. PS: I can't change HTML code.
We looked everywhere, but fail, if possible in JavaScript. (not jQuery). Thanks for your time.
Upvotes: 0
Views: 455
Reputation: 23277
The HTML code should look like this:
<ul id="list">
<li data-gt='{"alert_id":11111,"type":"hello"}'></li>
<li data-gt='{"alert_id":11111,"type":"bye"}'></li>
<li data-gt='{"alert_id":11111,"type":"hello"}'></li>
<li data-gt='{"alert_id":11111,"type":"bye"}'></li>
</ul>
And here is javascript:
var items = document.getElementById('list').children;
var remCount = 0;
for (var i = 0; i < items.length; i++) {
var json = items[i].getAttribute('data-gt');
try {
var data = eval('(' + json + ')');
if (data.type === 'hello') {
items[i].parentNode.removeChild(items[i]);
remCount++;
}
} catch(e) {
}
}
console.log('Removed ' + remCount + ' elements');
This should work in all browsers
Edit
It's better to use JSON.parse(json)
instead of eval('(' + json + ')')
, but it doesn't work in IE7
Upvotes: 0
Reputation: 913
You need to correct the HTML tags, and then filter your Nodes and parse the JSON:
var elems = document.querySelectorAll('[data-gt]');
var deletedNodes = 0;
for (var i = 0; i < elems.length; i++) {
var self = elems[i];
var attr = self.getAttribute('data-gt');
var parseAttr = JSON.parse(attr);
if (parseAttr.type === 'hello') {
self.parentNode.removeChild(self);
deletedNodes++;
}
}
// log deleted nodes
console.log(deletedNodes); // 2
http://jsfiddle.net/toddmotto/tT8HW/
This code parses your data-attribute and then checks the object value. This is going to be far more accurate and extendable.
Upvotes: 3