<html>
<head>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<article>
<p>See the console for information about what is going on.</p>
<div id="container"></div>
<div>
<button onclick="addNode();">Add node</button>
<button onclick="setAttr();">Add attribute</button>
<button onclick="setContent();">Change content</button>
<button onclick="removeNod();">Remove node</button>
</div>
</article>
</body>
</html>
/*
* Adapted from http://www.michielvaneerd.nl/lab/mutationobserver/
*/
var container = document.getElementById("container");
var addNode = function() {
if (container.hasChildNodes()) {
alert("Node already added...");
return;
}
var div = document.createElement("div");
div.innerHTML = "<h1 title='The header'><span>Added node</span></h1>";
container.appendChild(div);
};
var removeNod = function() {
if (!container.hasChildNodes()) {
alert("There is no node...");
return;
}
container.removeChild(container.firstChild);
};
var setAttr = function() {
if (!container.hasChildNodes()) {
alert("There is no node...");
return;
}
container.firstChild.querySelector("h1").setAttribute("title", "I am changed!");
};
var setContent = function() {
if (!container.hasChildNodes()) {
alert("There is no node...");
return;
}
container.firstChild.querySelector("span").firstChild.data = "Someone changed me...";
};
if ("MutationObserver" in window) {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
var target = mutation.target;
switch (mutation.type) {
case "attributes":
console.log("The attribute " + mutation.attributeName
+ " of the node " + target.nodeName
+ " changed from '" + mutation.oldValue + "'"
+ " to '" + target.getAttribute(mutation.attributeName) + "'");
break;
case "childList":
Array.prototype.forEach.call(mutation.addedNodes, function(node) {
console.log("Node " + node.nodeName + " added to " + target.nodeName);
});
Array.prototype.forEach.call(mutation.removedNodes, function(node) {
console.log("Node " + node.nodeName + " removed from " + target.nodeName);
});
break;
case "characterData":
console.log("Content of " + target.nodeName + " changed from '" + mutation.oldValue + "' to '" + target.data + "'");
break;
}
});
});
observer.observe(container, {
childList : true,
attributes : true,
characterData : true,
subtree : true,
attributeOldValue : true,
characterDataOldValue : true
});
} else {
container.addEventListener("DOMAttrModified", function(e) {
console.log("The attribute " + e.attrName + " of the node "
+ e.target.nodeName + " (#" + e.target.id + ") changed from '" + e.prevValue
+ "' to '" + e.newValue + "'");
}, false);
container.addEventListener("DOMSubtreeModified", function(e) {
console.log(e.type);
}, false);
container.addEventListener("DOMNodeInserted", function(e) {
console.log("Node " + e.target.nodeName + " (#" + e.target.id + ") added to " + e.relatedNode.nodeName + " (#" + e.relatedNode.id + ").");
}, false);
container.addEventListener("DOMNodeRemoved", function(e) {
console.log("Node " + e.target.nodeName + " (#" + e.target.id + ") removed from " + e.relatedNode.nodeName + "(#" + e.relatedNode.id + ").");
}, false);
container.addEventListener("DOMCharacterDataModified", function(e) {
console.log("Content of " + e.target.nodeName + " (#" + e.target.id + ") changed from '" + e.prevValue + "' to '" + e.newValue + "'");
}, false);
}
Output
You can jump to the latest bin by adding /latest
to your URL
Keyboard Shortcuts
Shortcut | Action |
---|---|
ctrl + [num] | Toggle nth panel |
ctrl + 0 | Close focused panel |
ctrl + enter | Re-render output. If console visible: run JS in console |
Ctrl + l | Clear the console |
ctrl + / | Toggle comment on selected lines |
ctrl + ] | Indents selected lines |
ctrl + [ | Unindents selected lines |
tab | Code complete & Emmet expand |
ctrl + shift + L | Beautify code in active panel |
ctrl + s | Save & lock current Bin from further changes |
ctrl + shift + s | Open the share options |
ctrl + y | Archive Bin |
Complete list of JS Bin shortcuts |
JS Bin URLs
URL | Action |
---|---|
/ | Show the full rendered output. This content will update in real time as it's updated from the /edit url. |
/edit | Edit the current bin |
/watch | Follow a Code Casting session |
/embed | Create an embeddable version of the bin |
/latest | Load the very latest bin (/latest goes in place of the revision) |
/[username]/last | View the last edited bin for this user |
/[username]/last/edit | Edit the last edited bin for this user |
/[username]/last/watch | Follow the Code Casting session for the latest bin for this user |
/quiet | Remove analytics and edit button from rendered output |
.js | Load only the JavaScript for a bin |
.css | Load only the CSS for a bin |
Except for username prefixed urls, the url may start with http://jsbin.com/abc and the url fragments can be added to the url to view it differently. |