data-click на чистом js
Всем привет!
Такой вопрос: Вещаю на элемент атрибут data-click="myFunction" Как средствами js распарсить все это дело и навещать обработчик? Не ударить ли это на производительнось? Если допустим у меня интерфейс без перезагрузки и эти элементы динамически то создаются то удаляются (например модальные окна) не начнет ли компьютер дико орать и грется (утечка памяти и все такое) после продолжительной работы с интерфейсом? |
тоесть стандартный onclick не устраивает?
конечно же свой велосипед ударит на производительность |
Стандартный нет, например через стандартный у меня будет выглядит примерно так onclick="new AppMenu().create()"
хочу чтобы было так data-click="app_menu.create" да и еще использую кастомный я смогу подхватывать а не создавать снова и снова через new |
diman91, а что мешает сделать так
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<div id="click"> click </div>
<script>
var elem = document.getElementById("click"),
app = new App();
elem.onclick = function () {
this.innerHTML = app.getRandom();
}
function App() {
this.getRandom = function () {
return Math.random().toString().slice(2);
}
}
</script>
</body>
</html>
|
Сделать так конечно можно, только вот у меня в интерфейсе все управляющие элементы подгружаются динамически, и каждый раз навешивать обработчик нехочится, да еще и id присваивать.
|
diman91, а зачем каждый раз навешивать ? Почитайте
http://learn.javascript.ru/bubbling-and-capturing |
cyber,Вы не совсем поняли, приведу пример, открываем грид в строке видим управляющие элементы например жмакаем "Редактировать" открывается модальное окно со сложной формой, в ней куча функционала, и допустим 25 элементов которые запускают разные функции, причем функции могут быть не просто разные но и от разных модулей.
|
Приведу пример модуля
var AppMenu = (function () {
var _self;
var _protectFn;
function AppMenu() {
_self = this;
}
AppMenu.prototype = {
changeStatus:function(status){
var elements = _protectFn.getCheckedElements();
var data = {"req":"changeStatus","status":status,"elements":elements};
if (elements.length>0) {
if (confirm("Вы уверены что хотите изменить статус у "+elements.length+" объектов?")) {
new ajaxSender({
url:'/office/appMenu/status',
data:data,
success: function(answer){
_protectFn.afterChangeStatus(answer);
}
}).send();
}
}
}
//и так далее публичные методы
}
_protectFn = {
getCheckedElements:function(){
var els = [];
$(".checks").each(function(){
if ($(this).is(':checked')) {
els[els.length] = $(this).attr("data-el");
}
});
return els;
},
afterDelete:function(answer){
//
}
//и так далее защишеные методы
}
return AppMenu;
})();
Бывает так что надо чтобы элемент создавал новый экземпляр, иногда нужно запустить метод в уже созданном экземпляре. Поэтому вещать на элементы onclick="new blablabla" не всегда подходит. А награмождать лишний код тоже неохото. |
diman91,
<!DOCTYPE HTML>
<html>
<head> </head>
<body>
<div id="container">
<div data-method-click="positive" > click and get positive number</div>
<div data-method-click="negative"> click and get positive negative</div>
</div>
<script>
var cont = document.getElementById("container"),
app = new App,
handlers = {
positive: app.getPositive,
negative: app.getNegative
};
cont.addEventListener("click", onContainerClick);
function onContainerClick (e) {
var val = e.target.getAttribute("data-method-click");
if(val && handlers[val]){
e.target.innerHTML = handlers[val]();
}
}
function App() {
this.getPositive = function () {
return Math.random().toString().slice(2);
};
this.getNegative = function () {
return "-" + Math.random().toString().slice(2);
};
}
</script>
</body>
</html>
|
cyber,Возможно Вы гдето близко от той реализации которую я хочу:)
Что если повесить обработчик на боди
document.body.addEventListener("click", onBodyClick);
function onBodyClick(e){
var data_click = e.target.getAttribute("data-click");
if(data_click){
//
}
}
|
| Часовой пояс GMT +3, время: 08:46. |