Skip welcome & menu and move to editor
Welcome to JS Bin
Load cached copy from
 
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
</head>
<body>
  Test message :/
  <p>Other :/ text :)</p>
  <span>This too <a href="http://example.com">Example.com</a> :/</span>
</body>
</html>
 
var smiles = {
  ":)": "data:image/gif;base64,R0lGODlhEwATAPcAAP/+//7/////+////fvzYvryYvvzZ/fxg/zxWfvxW/zwXPrtW/vxXvfrXv3xYvrvYvntYvnvY/ruZPrwZPfsZPjsZfjtZvfsZvHmY/zxavftaPrvavjuafzxbfnua/jta/ftbP3yb/zzcPvwb/zzcfvxcfzxc/3zdf3zdv70efvwd/rwd/vwefftd/3yfPvxfP70f/zzfvnwffvzf/rxf/rxgPjvgPjvgfnwhPvzhvjvhv71jfz0kPrykvz0mv72nvblTPnnUPjoUPrpUvnnUfnpUvXlUfnpU/npVPnqVPfnU/3uVvvsWPfpVvnqWfrrXPLiW/nrX/vtYv7xavrta/Hlcvnuf/Pphvbsif3zk/zzlPzylfjuk/z0o/LqnvbhSPbhSfjiS/jlS/jjTPfhTfjlTubUU+/iiPPokfrvl/Dll/ftovLWPfHXPvHZP/PbQ/bcRuDJP/PaRvjgSffdSe3ddu7fge7fi+zkuO7NMvPTOt2/Nu7SO+3OO/PWQdnGbOneqeneqvDqyu3JMuvJMu7KNfHNON7GZdnEbejanObXnOW8JOa9KOvCLOnBK9+4Ku3FL9ayKuzEMcenK9e+XODOiePSkODOkOW3ItisI9yxL+a9NtGiHr+VH5h5JsSfNM2bGN6rMJt4JMOYL5h4JZl5Jph3Jpl4J5h5J5h3KJl4KZp5Ks+sUN7Gi96lLL+PKMmbMZt2Jpp3Jpt3KZl4K7qFFdyiKdufKsedRdm7feOpQN2QKMKENrpvJbFfIrNjJL1mLMBpLr9oLrFhK69bJFkpE1kpFYNeTqFEIlsoFbmlnlsmFFwpGFkoF/////7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAANAALAAAAAATABMAAAj/AKEJHCgokKJKlhThGciQYSIva7r8SHPFzqGGAwPd4bKlh5YsPKy0qFLnT0NAaHTcsIHDho0aKkaAwGCGEkM1NmSkIjWLBosVJT6cOjUrzsBKPl54KmYsACoTMmk1WwaA1CRoeM7siJEqmTIAsjp40ICK2bEApfZcsoQlxwxRzgI8W8XhgoVYA+Kq6sMK0QEYKVCUkoVqQwQJFTwFEAAAFZ9PlFy4OEEiRIYJD55EodDA1ClTbPp0okRFxBQDBRgskAKhiRMlc+Sw4SNpFCIoBBwkUMBkCBIiY8qAgcPG0KBHrBTFQbCEV5EjQYQACfNFjp5CgxpxagVtUhIjwzaJYSHzhQ4cP3ryQHLEqJbASnu+6EIW6o2b2X0ISXK0CFSugazs0YYmwQhziyuE2PLLIv3h0hArkRhiCCzAENOLL7tgAoqDGLXSSSaPMLIIJpmAUst/GA3UCiuv1PIKLtw1FBAAOw==",
  ":/": "data:image/gif;base64,R0lGODlhIwAiAKIAAP//AMzMAJmZAGZmAP8AAAAAEQAAAP///yH5BAEHAAcALAAAAAAjACIAAAPeeLrc/jCuAGiwMi9Q6/XXpT3cR5VoGIzbx73wq7JWbMeh5t18mUednrAiWJFcw95F8EDCCgWbIWorOjqnV8EwhXG5toCVEZJ+vecwk8z7GtBgnJjsfLnh79v4UNemOXdhcwp9dnloPQJrfFlJSUsThY43g4yTjmKLZZdCkISSnCWKdKE8npGNZnGJi4RFPQYEsgSHaq2fqYCzs7Uyow5idbFuXLRyA7cTrwBRf4Zvb0vJZEUUvTfRYgMawddt2iyKm6aZ2ywHikWvNSHp5ucK6eLq7tPw6ALIyPn3/SwJADs=",
};
var replacements = [];
onEachTextNode(document.body, function(node) {
  var newNode = replaceTokensWithImages(node, smiles);
  replacements.push([node, newNode]);
});
replacements.forEach(function(replacement) {
  var node, newNode;
  node = replacement[0];
  newNode = replacement[1];
  
  node.parentNode.replaceChild(newNode, node);
});
function onEachTextNode(base, cb) {
  var iterator =
      document.createNodeIterator(base, NodeFilter.SHOW_TEXT, nonEmptyText);
  
  var currentNode = iterator.nextNode();
  
  while(currentNode !== null) {
    cb(currentNode);
    currentNode = iterator.nextNode();
  }
  function nonEmptyText(node) {
    return node.textContent.search(/\S/) !== -1 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
  }
}
function replaceTokensWithImages(textNode, map) {
  var fragment = document.createDocumentFragment();
  fragment.appendChild(textNode.cloneNode(true));
  
  return Object.keys(map).reduce(function(node, token) {
    return replaceTokenWithImage(node, token, map[token]);
  }, fragment);
}
function replaceTokenWithImage(fragment, token, imageUrl) {
  var newFragment = document.createDocumentFragment();
  
  [].forEach.call(fragment.childNodes, function(node) {
    if(node.nodeType !== document.TEXT_NODE) {
      newFragment.appendChild(node.cloneNode(true));
      return;
    }
    var text = node.textContent;
    var sections = text.split(token);
 
    var current, hasNext;
    for(var i = 0; i < sections.length; i++) {
      current = sections[i];
      hasNext = (i + 1) in sections;
    
      newFragment.appendChild(new Text(current));
    
      if(hasNext) {
        newFragment.appendChild(createImage());
      }
    }
  });
  
  return newFragment;
  
  function createImage() {
    var image = new Image();
    image.src = imageUrl;
    image.alt = token;
    return image;
  }
}
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers