source: Dev/branches/rest-dojo-ui/client/dijit/BackgroundIframe.js @ 256

Last change on this file since 256 was 256, checked in by hendrikvanantwerpen, 13 years ago

Reworked project structure based on REST interaction and Dojo library. As
soon as this is stable, the old jQueryUI branch can be removed (it's
kept for reference).

File size: 3.0 KB
Line 
1define([
2        "require",                      // require.toUrl
3        ".",    // to export dijit.BackgroundIframe
4        "dojo/_base/config",
5        "dojo/dom-construct", // domConstruct.create
6        "dojo/dom-style", // domStyle.set
7        "dojo/_base/lang", // lang.extend lang.hitch
8        "dojo/on",
9        "dojo/_base/sniff", // has("ie"), has("mozilla"), has("quirks")
10        "dojo/_base/window" // win.doc.createElement
11], function(require, dijit, config, domConstruct, domStyle, lang, on, has, win){
12
13        // module:
14        //              dijit/BackgroundIFrame
15        // summary:
16        //              new dijit.BackgroundIframe(node)
17        //              Makes a background iframe as a child of node, that fills
18        //              area (and position) of node
19
20        // TODO: remove _frames, it isn't being used much, since popups never release their
21        // iframes (see [22236])
22        var _frames = new function(){
23                // summary:
24                //              cache of iframes
25
26                var queue = [];
27
28                this.pop = function(){
29                        var iframe;
30                        if(queue.length){
31                                iframe = queue.pop();
32                                iframe.style.display="";
33                        }else{
34                                if(has("ie") < 9){
35                                        var burl = config["dojoBlankHtmlUrl"] || require.toUrl("dojo/resources/blank.html") || "javascript:\"\"";
36                                        var html="<iframe src='" + burl + "' role='presentation'"
37                                                + " style='position: absolute; left: 0px; top: 0px;"
38                                                + "z-index: -1; filter:Alpha(Opacity=\"0\");'>";
39                                        iframe = win.doc.createElement(html);
40                                }else{
41                                        iframe = domConstruct.create("iframe");
42                                        iframe.src = 'javascript:""';
43                                        iframe.className = "dijitBackgroundIframe";
44                                        iframe.setAttribute("role", "presentation");
45                                        domStyle.set(iframe, "opacity", 0.1);
46                                }
47                                iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work.
48                        }
49                        return iframe;
50                };
51
52                this.push = function(iframe){
53                        iframe.style.display="none";
54                        queue.push(iframe);
55                }
56        }();
57
58
59        dijit.BackgroundIframe = function(/*DomNode*/ node){
60                // summary:
61                //              For IE/FF z-index schenanigans. id attribute is required.
62                //
63                // description:
64                //              new dijit.BackgroundIframe(node)
65                //                      Makes a background iframe as a child of node, that fills
66                //                      area (and position) of node
67
68                if(!node.id){ throw new Error("no id"); }
69                if(has("ie") || has("mozilla")){
70                        var iframe = (this.iframe = _frames.pop());
71                        node.appendChild(iframe);
72                        if(has("ie")<7 || has("quirks")){
73                                this.resize(node);
74                                this._conn = on(node, 'resize', lang.hitch(this, function(){
75                                        this.resize(node);
76                                }));
77                        }else{
78                                domStyle.set(iframe, {
79                                        width: '100%',
80                                        height: '100%'
81                                });
82                        }
83                }
84        };
85
86        lang.extend(dijit.BackgroundIframe, {
87                resize: function(node){
88                        // summary:
89                        //              Resize the iframe so it's the same size as node.
90                        //              Needed on IE6 and IE/quirks because height:100% doesn't work right.
91                        if(this.iframe){
92                                domStyle.set(this.iframe, {
93                                        width: node.offsetWidth + 'px',
94                                        height: node.offsetHeight + 'px'
95                                });
96                        }
97                },
98                destroy: function(){
99                        // summary:
100                        //              destroy the iframe
101                        if(this._conn){
102                                this._conn.remove();
103                                this._conn = null;
104                        }
105                        if(this.iframe){
106                                _frames.push(this.iframe);
107                                delete this.iframe;
108                        }
109                }
110        });
111
112        return dijit.BackgroundIframe;
113});
Note: See TracBrowser for help on using the repository browser.