JayUK
JayUK

Reputation: 78

Javascript pulling content from commented html

Bit of a JS newbie, I have a tracking script that reads the meta data of the page and places the right scripts on that page using this:

var element = document.querySelector('meta[name="tracking-title"]');
var content = element && element.getAttribute("content");
console.log(content)

This obviously posts the correct tag to console so I can make sure it's working .. and it does in a test situation. However, on the actual website the meta data i'm targeting is produced on the page by a Java application and beyond my control, the problem is it is in a commented out area. This script cannot read within a commented out area. ie

<!-- your tracking meta is here
<meta name="tracking-title" content="this-is-the-first-page">
Tracking finished -->

Any ideas appreciated.

Upvotes: 3

Views: 45

Answers (3)

jcubic
jcubic

Reputation: 66540

You can use this code:

var html = document.querySelector('html');
var content;
function traverse(node) {
  if (node.nodeType == 8) { // comment
    var text = node.textContent.replace(/<!--|-->/g, '');
    var frag = document.createDocumentFragment();
    var div = document.createElement('div');
    frag.appendChild(div);
    div.innerHTML = text;
    var element = div.querySelector('meta[name="tracking-title"]');
    if (element) {
      content = element.getAttribute("content");
    }
  }
  var children = node.childNodes;
  if (children.length) {
    for (var i = 0; i < children.length; i++) {
      traverse(children[i]);
    }
  }
}
traverse(html);

Upvotes: 2

Meeh
Meeh

Reputation: 2646

You can try this. This will require you to use jQuery however.

$(function() {
    $("*").contents().filter(function(){
        return this.nodeType == 8;
    }).each(function(i, e){
        alert(e.nodeValue);
    });
});

Upvotes: 1

AtheistP3ace
AtheistP3ace

Reputation: 9691

One way is to use a NodeIterator and get comment nodes. Quick example below. You will still need to parse the returned value for the data you want but I am sure you can extend this here to do what you want.

Fiddle: http://jsfiddle.net/AtheistP3ace/gfu791c5/

var commentedOutHTml = [];
var iterator = document.createNodeIterator(document.body, NodeFilter.SHOW_COMMENT, NodeFilter.FILTER_ACCEPT, false);
var currentNode;
while (currentNode = iterator.nextNode()) {
    commentedOutHTml.push(currentNode.nodeValue);
}

alert(commentedOutHTml.toString());

Upvotes: 2

Related Questions