Which hooks are provided in jQuery?
dom, dom-events, jquery
Solution
There are 8 different types of exposed hooks.
There is one more for internal usage only (which is exposed) - `jQuery._queueHooks()`.
There are also two other hooks: `nodeHook` and `boolHook` which are used internally and their functionality is basically embedded into `jQuery.attrHooks` and `jQuery.valHooks`.
Here are the important ones:
`jQuery.attrHooks`
- Setting the type on a `radio` input after the value resets the value in IE6-9.
- Set `contenteditable` to false on removals (Bug #10429).
- Set width and height to auto instead of 0 on empty string (Bug #8150)
- Some attributes require a special call on IE - `href`, `src`, `width` and `height`.
- Return `undefined` in the case of empty string for the `style` attribute.
- Fix get/set for the `value` property in old IE
- When reading attribute values if no hook is defined it uses either `boolHook` or `nodeHook` (which is the same as `jQuery.valHooks.button`).
- Could be used to attach additional hooks when getting/setting an attribute of an element.
`jQuery.propHooks`
- `href`/`src` properties should get the full normalized URL (Bug #10299, Bug #12915).
- Fix for "Safari mis-reports the default selected property of an option".
- Could be used to attach additional hooks when getting/setting a property of an element.
`jQuery.Tween.propHooks`
`jQuery.Tween` is used for animations and such.
- Fix for `scrollTop` and `scrollLeft` in IE8 - will be removed in jQuery 2.0.
- Other animation stuff.
`jQuery.cssHooks`
Add in style property hooks for overriding the default behavior of getting and setting a style property.
- Fix for getting/setting the value of the CSS property `opacity`.
- Fix for getting `witdth` and `height` depending on the `display` property.
- Fix for setting `width` and `height` depending on the `box-sizing` property.
- Fix for getting margin-right.
- Fix for Webkit Bug #29084 - `getComputedStyle` returns percent when specified for top/left/bottom/right
- Used in `jQuery.fn.animate` to expand specified style properties like `margin`, `padding` and `border`.
- Used in other various `jQuery.fn.animate` related stuff.
- Setting various background CSS properties to `inherit` is achieved without using `jQuery.cssHooks`, because it is shorter this way.
- Could be used to attach additional hooks when getting/setting an individual style property of an element.
`jQuery.valHooks`
- Fixes a Blackberry 4.7 bug for `option` elements (Bug #6932).
- Used for reading selected value for `select` elements.
- Fixes reading some properties of the `button` element - `id`, `name` and `coords`. The same as `nodeHook` (see above).
- Fixes the incompatibility on checking `radio` and `checkbox` inputs between Webkit and others.
- Could be used to attach additional hooks when getting/setting the value of an input element.
`jQuery.event.fixHooks`
A holder for `jQuery.event.mouseHooks` and `jQuery.event.keyHooks` which require fixing and normalizing based on the support of the current browser.
`jQuery.event.mouseHooks`
- Used to transfer some properties from the original `MouseEvent` to the jQuery event object.
- Normalizes `event.which` (which mouse button was used) accross browsers, because `event.button` is not normalized.
- Calculates `pageX`, `pageY`, `clientX`, `clientY` and others if missing and set them to the jQuery event object.
`jQuery.event.keyHooks`
- Used to transfer some properties from the original `KeyboardEvent` to the jQuery event object.
- Normalizes `event.which` (the character code of the button which was pressed) across browsers. In the original event it could be `char`, `charCode`, `key` or `keyCode`.
From the jQuery 1.9.1 source.
Problem
Officially only `$.cssHooks` is documented in jQuery API documentation, and `$.valHooks` is mentioned in a sentence for a workaround to a known issue in `.val()`. I wonder how many hooks are there in jQuery besides of these 2, and should we use `$.valHooks` in our plugin development? If so, I think it should be documented as a dedicated topic instead of one-sentence only.