85 lines
2.5 KiB
JavaScript
85 lines
2.5 KiB
JavaScript
"use strict";
|
|
|
|
(function() {
|
|
var PolyfillEvent = eventConstructor();
|
|
|
|
function eventConstructor() {
|
|
if (typeof window.CustomEvent === "function") return window.CustomEvent;
|
|
// IE<=9 Support
|
|
function CustomEvent(event, params) {
|
|
params = params || {bubbles: false, cancelable: false, detail: undefined};
|
|
var evt = document.createEvent('CustomEvent');
|
|
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
|
|
return evt;
|
|
}
|
|
CustomEvent.prototype = window.Event.prototype;
|
|
return CustomEvent;
|
|
}
|
|
|
|
function buildHiddenInput(name, value) {
|
|
var input = document.createElement("input");
|
|
input.type = "hidden";
|
|
input.name = name;
|
|
input.value = value;
|
|
return input;
|
|
}
|
|
|
|
function handleClick(element, targetModifierKey) {
|
|
var to = element.getAttribute("data-to"),
|
|
method = buildHiddenInput("_method", element.getAttribute("data-method")),
|
|
csrf = buildHiddenInput("_csrf_token", element.getAttribute("data-csrf")),
|
|
form = document.createElement("form"),
|
|
submit = document.createElement("input"),
|
|
target = element.getAttribute("target");
|
|
|
|
form.method = (element.getAttribute("data-method") === "get") ? "get" : "post";
|
|
form.action = to;
|
|
form.style.display = "none";
|
|
|
|
if (target) form.target = target;
|
|
else if (targetModifierKey) form.target = "_blank";
|
|
|
|
form.appendChild(csrf);
|
|
form.appendChild(method);
|
|
document.body.appendChild(form);
|
|
|
|
// Insert a button and click it instead of using `form.submit`
|
|
// because the `submit` function does not emit a `submit` event.
|
|
submit.type = "submit";
|
|
form.appendChild(submit);
|
|
submit.click();
|
|
}
|
|
|
|
window.addEventListener("click", function(e) {
|
|
var element = e.target;
|
|
if (e.defaultPrevented) return;
|
|
|
|
while (element && element.getAttribute) {
|
|
var phoenixLinkEvent = new PolyfillEvent('phoenix.link.click', {
|
|
"bubbles": true, "cancelable": true
|
|
});
|
|
|
|
if (!element.dispatchEvent(phoenixLinkEvent)) {
|
|
e.preventDefault();
|
|
e.stopImmediatePropagation();
|
|
return false;
|
|
}
|
|
|
|
if (element.getAttribute("data-method")) {
|
|
handleClick(element, e.metaKey || e.shiftKey);
|
|
e.preventDefault();
|
|
return false;
|
|
} else {
|
|
element = element.parentNode;
|
|
}
|
|
}
|
|
}, false);
|
|
|
|
window.addEventListener('phoenix.link.click', function (e) {
|
|
var message = e.target.getAttribute("data-confirm");
|
|
if(message && !window.confirm(message)) {
|
|
e.preventDefault();
|
|
}
|
|
}, false);
|
|
})();
|