| define([ |
| "../core", |
| "../manipulation" // appendTo |
| ], function( jQuery ) { |
| |
| var iframe, |
| elemdisplay = {}; |
| |
| /** |
| * Retrieve the actual display of a element |
| * @param {String} name nodeName of the element |
| * @param {Object} doc Document object |
| */ |
| // Called only from within defaultDisplay |
| function actualDisplay( name, doc ) { |
| var style, |
| elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), |
| |
| // getDefaultComputedStyle might be reliably used only on attached element |
| display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? |
| |
| // Use of this method is a temporary fix (more like optimization) until something better comes along, |
| // since it was removed from specification and supported only in FF |
| style.display : jQuery.css( elem[ 0 ], "display" ); |
| |
| // We don't have any data stored on the element, |
| // so use "detach" method as fast way to get rid of the element |
| elem.detach(); |
| |
| return display; |
| } |
| |
| /** |
| * Try to determine the default display value of an element |
| * @param {String} nodeName |
| */ |
| function defaultDisplay( nodeName ) { |
| var doc = document, |
| display = elemdisplay[ nodeName ]; |
| |
| if ( !display ) { |
| display = actualDisplay( nodeName, doc ); |
| |
| // If the simple way fails, read from inside an iframe |
| if ( display === "none" || !display ) { |
| |
| // Use the already-created iframe if possible |
| iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement ); |
| |
| // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse |
| doc = iframe[ 0 ].contentDocument; |
| |
| // Support: IE |
| doc.write(); |
| doc.close(); |
| |
| display = actualDisplay( nodeName, doc ); |
| iframe.detach(); |
| } |
| |
| // Store the correct default display |
| elemdisplay[ nodeName ] = display; |
| } |
| |
| return display; |
| } |
| |
| return defaultDisplay; |
| |
| }); |