<html>
<head>
<script src="https://code.jquery.com/jquery-1.4.2.js"></script>
<meta charset="utf-8">
<title>JS Bin</title>
</head>
<body>
<pre id="log"></pre>
<form id="myform" method="post" action="/" onsubmit="return false;">
<input type="text" name="testfield" value="testvalue">
<button type="submit" id="submit">submit form</button>
</form>
<br/><br/>
<button id="activate_extension">Activate Extension</button>
</body>
</html>
var init = function() {
var log = function(str) {
$("#log").append(str);
$("#log").append("\n");
};
var init_extension = function() {
// when activated, my extension tries to use addEventListener to intercept the form submission
var form_submitted = function(event) {
log("Submitted the form! (addEventListener handler)");
};
log("setting extension handlers!");
var forms = document.querySelectorAll("form");
for (i=0; i<forms.length; i++) {
forms[i].addEventListener("submit", form_submitted, false);
}
// hijack jQuery event handlers if present
if ($ !== undefined && $.event !== undefined && $.event.trigger !== undefined) {
var orig_handler = $.event.trigger;
var new_handler = function(event, data, elem) {
var type = event.type || event;
var eventObj = new Event(type);
elem.dispatchEvent(eventObj);
log("Event type: " + String(type));
return orig_handler.apply(event, arguments);
};
$.event.trigger = new_handler;
}
};
log("Init");
// the page's submission handler calls stopPropagation & preventDefault before returning false
var ajaxSubmit = function(event) {
log(event);
event.stopPropagation();
event.preventDefault();
log("Submitted the form! (jQuery delegate handler)");
return false;
};
// the page's JavaScript sets a handler with delegate next:
$("body").delegate('form', "submit", $.proxy(ajaxSubmit, this));
// and then overrides the behavior of the submit button to trigger "submit" on the form via jQuery
$("body").delegate("#submit", "click", function(a){
$(this.form).trigger("submit", {
target: a.target
});
return false;
});
document.querySelector("#activate_extension").addEventListener("click", init_extension);
}();
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. |