Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Как добавить свой обработчик перед остальными? (https://javascript.ru/forum/events/56596-kak-dobavit-svojj-obrabotchik-pered-ostalnymi.html)

12345678 24.06.2015 13:35

Как добавить свой обработчик перед остальными?
 
На одном сайте добавляется обработчик отправки формы через addEventListenet(). Как добавить свой перед этим?

ksa 24.06.2015 13:37

Цитата:

Сообщение от 12345678
Как добавить свой перед этим?

Как вариант
- удалить тот
- добавить свой
- добавить тот

Вот статейка про обработчики событий...
http://javascript.ru/tutorial/events...owser#udalenie

12345678 24.06.2015 15:13

Я читал, что нельзя получить события добавленные через addeventlistener

12345678 24.06.2015 15:14

http://stackoverflow.com/a/10030771

ksa 24.06.2015 15:18

Цитата:

Сообщение от 12345678
Я читал, что нельзя получить события добавленные через addeventlistener

Там как раз для добавления его используют...
http://javascript.ru/tutorial/events...e-obrabotchika

Т.ч. уверяют, что все примеры кроссбраузерны. :)

12345678 24.06.2015 15:20

Да, чтобы добавить его сначала надо прочесть? Он устанавливается из замыкания.

>form.events
undefined

ksa 24.06.2015 15:29

Цитата:

Сообщение от 12345678
чтобы добавить его сначала надо прочесть?

Да. :yes:

Там, в примере удаления показан пример "чтения" уже имеющихся обработчиков...
Цитата:

var handlers = elem.events && elem.events[type]

Правда есть и приписка...
Цитата:

if (!handlers) return

В любом случае это единственный вариант тебе что-то сделать с событиями... :(

12345678 24.06.2015 15:36

>form.events
undefined

В каком браузере это вообще должно работать?

Так что, никак? :(

ksa 24.06.2015 15:50

Цитата:

Сообщение от 12345678
В каком браузере это вообще должно работать?

В статье той они сами те обработчики навешивают и записывают... Потом работают с тем объектом.
Цитата:

Сообщение от 12345678
Так что, никак?

Если не прочитаешь, что навешено - никак не поменяешь порядок следования. :no:

12345678 24.06.2015 15:51

Я не знаю что они там понаписывали, проверил в фаерфоксе - ёк. Может, кто-то у себя проверит?

ksa 24.06.2015 15:54

Цитата:

Сообщение от 12345678
Может, кто-то у себя проверит?

Я смотрел пример
http://javascript.ru/tutorial/events/crossbrowser#demo
в Опере - работает. :yes:

12345678 24.06.2015 15:59

В хромой или в старой?
В лисе тоже устанавливается, но мне кагбы надо заменить.

Так значит, никак?

ksa 24.06.2015 16:06

Цитата:

Сообщение от 12345678
В хромой или в старой?

Opera 30.0...

Вот работает добавление и удаление...

<!DOCTYPE html>
<html>
<head>
<meta http-equiv='Content-Type' content='text/html; charset=windows-1251' />
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<script src="https://code.angularjs.org/1.3.9/angular.min.js"></script>
<script src="https://code.angularjs.org/1.3.9/angular-route.js"></script>
<link rel='stylesheet type=text/css href=tmp.css' />
<link rel="stylesheet/less" type="text/css" href="style.less">
<script src="http://cdnjs.cloudflare.com/ajax/libs/less.js/2.5.0/less.min.js"></script>
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
Event = (function() {

  var guid = 0
    
  function fixEvent(event) {
	event = event || window.event
  
    if ( event.isFixed ) {
      return event
    }
    event.isFixed = true 
  
    event.preventDefault = event.preventDefault || function(){this.returnValue = false}
    event.stopPropagation = event.stopPropagaton || function(){this.cancelBubble = true}
    
    if (!event.target) {
        event.target = event.srcElement
    }
  
    if (!event.relatedTarget && event.fromElement) {
        event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
    }
  
    if ( event.pageX == null && event.clientX != null ) {
        var html = document.documentElement, body = document.body;
        event.pageX = event.clientX + (html && html.scrollLeft || body && body.scrollLeft || 0) - (html.clientLeft || 0);
        event.pageY = event.clientY + (html && html.scrollTop || body && body.scrollTop || 0) - (html.clientTop || 0);
    }
  
    if ( !event.which && event.button ) {
        event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
    }
	
	return event
  }  
  
  /* Вызывается в контексте элемента всегда this = element */
  function commonHandle(event) {
    event = fixEvent(event)
    
    var handlers = this.events[event.type]

	for ( var g in handlers ) {
      var handler = handlers[g]

      var ret = handler.call(this, event)
      if ( ret === false ) {
          event.preventDefault()
          event.stopPropagation()
      }
    }
  }
  
  return {
    add: function(elem, type, handler) {
      if (elem.setInterval && ( elem != window && !elem.frameElement ) ) {
        elem = window;
      }
      
      if (!handler.guid) {
        handler.guid = ++guid
      }
      
      if (!elem.events) {
        elem.events = {}
		elem.handle = function(event) {
		  if (typeof Event !== "undefined") {
			return commonHandle.call(elem, event)
		  }
        }
      }
	  
      if (!elem.events[type]) {
        elem.events[type] = {}        
      
        if (elem.addEventListener)
		  elem.addEventListener(type, elem.handle, false)
		else if (elem.attachEvent)
          elem.attachEvent("on" + type, elem.handle)
      }
      
      elem.events[type][handler.guid] = handler
    },
    
    remove: function(elem, type, handler) {
      var handlers = elem.events && elem.events[type]
      
      if (!handlers) return
      
      delete handlers[handler.guid]
      
      for(var any in handlers) return 
	  if (elem.removeEventListener)
		elem.removeEventListener(type, elem.handle, false)
	  else if (elem.detachEvent)
		elem.detachEvent("on" + type, elem.handle)
		
	  delete elem.events[type]
	
	  
	  for (var any in elem.events) return
	  try {
	    delete elem.handle
	    delete elem.events 
	  } catch(e) { // IE
	    elem.removeAttribute("handle")
	    elem.removeAttribute("events")
	  }
    } 
  }
}())
</script>
</head>
<body>
<button id='test'>Test</button>
<button id='del'>Delete</button>
<script>
var obj=document.getElementById('test');
Event.add(obj, 'click', test);
obj=document.getElementById('del');
Event.add(obj, 'click', del);
function test() {
    alert('Ok');
};
function del() {
	var obj=document.getElementById('test');
	Event.remove(obj, 'click', test);
	alert('Del!');
};
</script>
</body>
</html>

ksa 24.06.2015 16:07

Цитата:

Сообщение от 12345678
Так значит, никак?

Везде пишут в какой последовательности будет срабатывать... Но не видел я где на ту последовательность посмотреть и как повлиять... :(

Только вот та статейка как самому ту последовательность организовать и как с ней работать.

12345678 24.06.2015 16:19

Что б было понятно зачем - я хочу юзерскрипт написать.


Часовой пояс GMT +3, время: 17:43.