Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #11 (permalink)  
Старый 30.05.2012, 18:54
Новичок на форуме
Отправить личное сообщение для qvab Посмотреть профиль Найти все сообщения от qvab
 
Регистрация: 27.05.2012
Сообщений: 3

Придумал такой вариант:

function newobj(elem){
this.click=function(fun){
 
document.addEventListener('DOMContentLoaded', function(){
                                                         

        document.querySelector(elem).addEventListener('click', fun, false);

                                                        }, false)

}

}


function MY(t){ return new newobj(t);}

// Получается как в JQ

MY('#test').click(function(){
                                      alert('Тест');
                                  });




Прощу комментарии. Может кто лучше вариант предложит?

Этот работает отлично, и без window.onload - не устраивает тем,
что надо оборачивать каждый раз, и onload ждет полностью загрузки всего содержимого. DOMContentLoaded определенно выигрывает.

(этот пример не кроссбраузерный).

Последний раз редактировалось qvab, 30.05.2012 в 18:56.
Ответить с цитированием
  #12 (permalink)  
Старый 30.05.2012, 19:02
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Да , чот надумано всё, а если б Вы начали с JS - Пошли б PHP переиначивать ?, Ни к чему лишние наволочки, оно и без этого багов хватает...

Ну не ходят со своим уставом в чужой монастырь, присмотрецо нун сызново... После и под себя делайте..
Ответить с цитированием
  #13 (permalink)  
Старый 31.05.2012, 11:20
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

qvab,

скрипт:
(function(){
    var doc = document, data = {}, docEl = doc.documentElement;
    
    // главная функция.
    function addHandler(evt, selector, handler) {
      if (!data[evt]) { // первый запуск для этого типа событий
        data[evt] = {};
        // надо установить обработчик
        // ставим его на документ. так же делает live у jquery.
        if (doc.addEventListener) {
          doc.addEventListener(evt, universal, false);
        } else if (doc.attachEvent) {
          doc.attachEvent("on" + evt, universal);
        } else {
            // тут выпендриваемся со свойствами. но оно уже не нужно.
        }
      }
      if (!data[evt][selector]) {
        data[evt][selector] = [];
      }
      data[evt][selector].push(handler);
    }
    
    // этот обработчик будет расфасовывать поступающие сообщения.
    function universal(e) {
      var selector, i;
      // фикс ивента для IE
      e = fixEvent(e || window.event);
*!*
      if (e.type in data) {// тут может быть баг в IE. у меня под рукой его нет.
*/!*     
   
        for (selector in data[e.type]) { // обходим все селекторы 
          if (matches(e.target, selector)) {// и находим тот, под который попадает элемент
            for(i = 0; i < data[e.type][selector].length; i += 1) { // и исполняем массив обработчиков.
              data[e.type][selector][i].call(e.target, e);
            }
          }
        }
        
      }
    }
    
    // тут добавляются w3c фишки для IE
    function fixEvent(e) {
        if (!e.target) {
            e.target = e.srcElement;
        }
    
        return e;
    }
    
    // тут проверяется соответствие элемнта селектору
    function matchesSel(selector) {
      // исп. this для поддержки нативных методов.
        return selector === "*" || this.tagName.toLowerCase() === selector.toLowerCase();
    }
    // если есть нативные реализации проверки соотв. селектору, то исп. их.
    matchesSel = docEl.matchesSelector || docEl.mozMatchesSelector || docEl.webkitMatchesSelector || docEl.oMatchesSelector || docEl.msMatchesSelector || matchesSel;
    
    // оборачиваем.
    var matches = function(element, selector){
      return matchesSel.call(element, selector);
    };

    window["addHandler"] = addHandler;
})();


пример:
<!DOCTYPE html>
<html>
<head>
<script>
(function(){function h(a){var c,d,a=a||window.event;a.target||(a.target=a.srcElement);if(a.type in b)for(c in b[a.type])if(g.call(a.target,c))for(d=0;d<b[a.type][c].length;d+=1)b[a.type][c][d].call(a.target,a)}function g(a){return"*"===a||this.tagName.toLowerCase()===a.toLowerCase()}var f=document,b={},e=document.documentElement,g=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.a||e.msMatchesSelector||g;window.addHandler=function(a,c,d){b[a]||(b[a]={},f.addEventListener?f.addEventListener(a,
h,!1):f.attachEvent&&f.attachEvent("on"+a,h));b[a][c]||(b[a][c]=[]);b[a][c].push(d)}})();</script>

<!-- ДО ЗАГРУЗКИ ДЕРЕВА! -->
<script>
  addHandler("click", "div", function(){alert("клик по диву");});
  addHandler("click", "*", function(){alert("клик по документу");});
  addHandler("click", "span", function(){alert("клик по спану");});
</script>

</head>
<body>
<h1>Кликни на них!</h1>

<div>Я див!</div><br><span>Я span</span>


</body>
</html>

Последний раз редактировалось melky, 31.05.2012 в 11:23.
Ответить с цитированием
  #14 (permalink)  
Старый 31.05.2012, 12:17
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

Сообщение от melky
if (e.type in data) {// тут может быть баг в IE. у меня под рукой его нет.
Есть Нормальный эмуль всех Ие вплоть до 8 => * может сейчас и лучше
http://www.my-debugbar.com/wiki/IETester/HomePage
Ответить с цитированием
  #15 (permalink)  
Старый 31.05.2012, 14:01
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

melky,
Что-то мне не нравиться идея вешать события на селектор, а не на элемент.

P.S. В примере баг есть. Когда кликаешь по спану, то сначала вылетает алерт клик по документу. Какоето странное всплытие получается.

Последний раз редактировалось Раед, 31.05.2012 в 14:26.
Ответить с цитированием
  #16 (permalink)  
Старый 31.05.2012, 18:01
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Deff Посмотреть сообщение
Есть Нормальный эмуль всех Ие вплоть до 8 => * может сейчас и лучше
http://www.my-debugbar.com/wiki/IETester/HomePage
когда возникает неотложная необходимость в IE, я врубаю ноутбук с восьмёркой, и там уже нормально дебажу код в IE 10 и нативных developer tools.

Сообщение от Раед Посмотреть сообщение
melky,
Что-то мне не нравиться идея вешать события на селектор, а не на элемент.
так работает live в jQuery, только с несколькими правками багов типа всплытия.
Сообщение от Раед Посмотреть сообщение
P.S. В примере баг есть. Когда кликаешь по спану, то сначала вылетает алерт клик по документу. Какоето странное всплытие получается.
а там и не учитывается всплытие. порядок исполнения обработчиков вообще может быть разным в браузерах (он зависит от порядка значений в data[evt], и от порядка добавления обработчика)

прикол то в том, что оно работает без загрузки дерева
Ответить с цитированием
  #17 (permalink)  
Старый 31.05.2012, 18:37
Аватар для Раед
''
Отправить личное сообщение для Раед Посмотреть профиль Найти все сообщения от Раед
 
Регистрация: 11.12.2011
Сообщений: 636

Сообщение от melky
а там и не учитывается всплытие. порядок исполнения обработчиков вообще может быть разным в браузерах (он зависит от порядка значений в data[evt], и от порядка добавления обработчика)
Порядок порядком, а всплытие везде одинаковое. Неужели jQ его тоже не учитывает?
Ответить с цитированием
  #18 (permalink)  
Старый 31.05.2012, 19:10
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Раед Посмотреть сообщение
Порядок порядком, а всплытие везде одинаковое. Неужели jQ его тоже не учитывает?
учитывает, я слышал, что у них есть эмуляция механизма всплытия событий (для старых браузеров)

в принципе, это решится парой циклов сортировки... но для этого нужно иметь полноценный matchesSel.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
JS Jquery нужна помощь globalus2010 Javascript под браузер 1 25.03.2011 00:05
Вывод кусков HTML кода с одного файла JS wlad2 Общие вопросы Javascript 16 04.01.2011 11:52
Очень нужна помощь с Ext JS dcbal ExtJS 1 09.07.2010 13:15
Html метки + div + JS boltayka Events/DOM/Window 1 07.09.2009 17:21
Как с помощью JS "на-лету" менять часть HTML кода greendoc Общие вопросы Javascript 2 18.03.2008 20:43