Cách thực hiện mà không có JavaScript hoặc thư viện bên ngoài
Thông thường nên tránh JavaScript nội tuyến, nhưng hiếm khi có một ví dụ về cách làm điều đó.Đây là cách tôi gắn các sự kiện vào các nút.Tôi không hoàn toàn hài lòng với phương pháp được đề xuất được bao lâu được so sánh với thuộc tính onClick
đơn giản.
Here is my way of attaching events to buttons.
I'm not entirely happy with how much longer the recommended method is compared to a simple onClick
attribute.
Trình duyệt hiện đại
- Hoạt động trước khi tài liệu đã tải xong.
- Rất hiệu quả.
- Tách JS với HTML.
- JS đang ở trong
const OnEvent = [doc] => {
return {
on: [type, selector, callback] => {
doc.addEventListener[type, [event]=>{
if[!event.target.matches[selector]] return;
callback.call[event.target, event];
}, false];
}
}
};
OnEvent[document].on['click', '.btn', function [e] {
let div = document.createElement["div"];
div.innerHTML = "click " + e.target.id + "!";
document.body.appendChild[div];
}];
Button 1
Button 2
Do nothing
Chỉ dành cho năm 2014
Button
let OnEvent = [doc] => {
return {
on: [event, className, callback] => {
doc.addEventListener['click', [event]=>{
if[!event.target.classList.contains[className]] return;
callback.call[event.target, event];
}, false];
}
}
};
OnEvent[document].on['click', 'btn', function [e] {
window.console.log[this.id, e];
}];
Chỉ dành cho năm 2013
[function[doc]{
var hasClass = function[el,className] {
return el.classList.contains[className];
}
doc.addEventListener['click', function[e]{
if[hasClass[e.target, 'click-me']]{
e.preventDefault[];
doSomething.call[e.target, e];
}
}];
}][document];
function insertHTML[str]{
var s = document.getElementsByTagName['script'], lastScript = s[s.length-1];
lastScript.insertAdjacentHTML["beforebegin", str];
}
function doSomething[event]{
console.log[this.id]; // this will be the clicked element
}
insertHTML['Button 1'];
Button 2
Button 4
Cross-browser
[function[doc]{
var cb_addEventListener = function[obj, evt, fnc] {
// W3C model
if [obj.addEventListener] {
obj.addEventListener[evt, fnc, false];
return true;
}
// Microsoft model
else if [obj.attachEvent] {
return obj.attachEvent['on' + evt, fnc];
}
// Browser don't support W3C or MSFT model, go on with traditional
else {
evt = 'on'+evt;
if[typeof obj[evt] === 'function']{
// Object already has a function on traditional
// Let's wrap it with our own function inside another function
fnc = [function[f1,f2]{
return function[]{
f1.apply[this,arguments];
f2.apply[this,arguments];
}
}][obj[evt], fnc];
}
obj[evt] = fnc;
return true;
}
return false;
};
var hasClass = function[el,className] {
return [' ' + el.className + ' '].indexOf[' ' + className + ' '] > -1;
}
cb_addEventListener[doc, 'click', function[e]{
if[hasClass[e.target, 'click-me']]{
e.preventDefault ? e.preventDefault[] : e.returnValue = false;
doSomething.call[e.target, e];
}
}];
}][document];
function insertHTML[str]{
var s = document.getElementsByTagName['script'], lastScript = s[s.length-1];
lastScript.insertAdjacentHTML["beforebegin", str];
}
function doSomething[event]{
console.log[this.id]; // this will be the clicked element
}
insertHTML['Button 1'];
Button 2
Button 4
Trình duyệt chéo với jQuery
[function[$]{
$[document].on['click', '.click-me', function[e]{
doSomething.call[this, e];
}];
}][jQuery];
function insertHTML[str]{
var s = document.getElementsByTagName['script'], lastScript = s[s.length-1];
lastScript.insertAdjacentHTML["beforebegin", str];
}
function doSomething[event]{
console.log[this.id]; // this will be the clicked element
}
insertHTML['Button 1'];
Button 2
Button 4
Bạn có thể chạy nó trước khi tài liệu đã sẵn sàng, nhấp vào các nút sẽ hoạt động vì chúng tôi đính kèm sự kiện vào tài liệu.
Dưới đây là một JSFiddle vì một số lý do lạ, chức năng insertHTML
không hoạt động trong đó mặc dù nó hoạt động trong tất cả các trình duyệt của tôi.
For some strange reason the insertHTML
function does not work in it even though it works in all my browsers.
Bạn luôn có thể thay thế insertHTML
bằng
Button 1
Button 2
Do nothing
1 nếu bạn không phiền đó là nhược điểm của nó
document.write['Button 1'];
Sources:
- Các lựa chọn thay thế cho Document.Write là gì?
- Kiểm tra xem một phần tử chứa một lớp trong javascript?
- sự kiện.PreventDefault [] Chức năng không hoạt động trong IE
- //gist.github.com/eduardocereto/955642