Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Кто знает как реализовано всплытие Submit в jQuery? (https://javascript.ru/forum/events/36516-kto-znaet-kak-realizovano-vsplytie-submit-v-jquery.html)

constantant 18.03.2013 09:47

Кто знает как реализовано всплытие Submit в jQuery?
 
Кто знает как реализовать кросс-браузерное (IE7, IE8) всплытие события Submit и ему подобных(которые не всплывают)? В jQuery это реализовано. Хотелось бы понять принцип такой реализации.

Спасибо.

danik.js 18.03.2013 12:12

Разве это не будет работать где-то ?
<form>
    <button type="submit">Засабмитить</button>
</form>
<script>
    var handler = function (e) {
        alert ('Всплыло!');
        if (e.preventDefault) {
            e.preventDefault();
        } else {
            e.returnValue = false;
        }
    }
    
    if ('addEventListener' in document) {
        document.addEventListener('submit', handler);
    } else {
        document.attachEvent('onsubmit', handler);
    }
</script>

constantant 19.03.2013 16:15

Цитата:

Сообщение от danik.js
Разве это не будет работать где-то ?

Да, в ишаке версий 7 и 8 не будет)

zilker 19.03.2013 16:42

А исходники jQuery закрыты чтоли?

// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
	// Beware of CSP restrictions ([url]https://developer.mozilla.org/en/Security/CSP[/url]), test/csp.php
	for ( i in { submit: true, change: true, focusin: true }) {
		div.setAttribute( eventName = "on" + i, "t" );

		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
	}


// IE submit delegation
if ( !jQuery.support.submitBubbles ) {

	jQuery.event.special.submit = {
		setup: function() {
			// Only need this for delegated form submit events
			if ( jQuery.nodeName( this, "form" ) ) {
				return false;
			}

			// Lazy-add a submit handler when a descendant form may potentially be submitted
			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
				// Node name check avoids a VML-related crash in IE (#9807)
				var elem = e.target,
					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
					jQuery.event.add( form, "submit._submit", function( event ) {
						event._submit_bubble = true;
					});
					jQuery._data( form, "submitBubbles", true );
				}
			});
			// return undefined since we don't need an event listener
		},

		postDispatch: function( event ) {
			// If form was submitted by the user, bubble the event up the tree
			if ( event._submit_bubble ) {
				delete event._submit_bubble;
				if ( this.parentNode && !event.isTrigger ) {
					jQuery.event.simulate( "submit", this.parentNode, event, true );
				}
			}
		},

		teardown: function() {
			// Only need this for delegated form submit events
			if ( jQuery.nodeName( this, "form" ) ) {
				return false;
			}

			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
			jQuery.event.remove( this, "._submit" );
		}
	};
}

constantant 19.03.2013 16:55

Цитата:

Сообщение от zilker
А исходники jQuery закрыты чтоли?

мне интересен алгоритм, то есть достаточно просто рассказать на словах, а в коде можно копаться до бесконечности :)

danik.js 19.03.2013 17:09

В jquery своя система событий. Там и реализовали всплытие. Вот если бы через attachEvent всплытие срабатывало, то тогда было бы интересно...

zilker 19.03.2013 17:09

1. jQuery проверяет что браузер не поддерживает всплытие submit
2. jQuery эмитирует всплытие

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

constantant 19.03.2013 22:57

Цитата:

Сообщение от zilker
Без копания в коде и без понимания внутреннего механизма событий jQuery все равно не разобраться

Поправил пост, а то действительно как-то узко я спросил. Вопрос не в jQuery конкретно, а в принципе в общем.

danik.js 20.03.2013 08:20

http://stackoverflow.com/questions/3...-submit-events


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