12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- define("dijit/Viewport", [
- "dojo/Evented",
- "dojo/on",
- "dojo/ready",
- "dojo/_base/sniff",
- "dojo/_base/window", // global
- "dojo/window" // getBox()
- ], function(Evented, on, ready, has, win, winUtils){
- // module:
- // dijit/Viewport
- /*=====
- return {
- // summary:
- // Utility singleton to watch for viewport resizes, avoiding duplicate notifications
- // which can lead to infinite loops.
- // description:
- // Usage: Viewport.on("resize", myCallback).
- //
- // myCallback() is called without arguments in case it's _WidgetBase.resize(),
- // which would interpret the argument as the size to make the widget.
- };
- =====*/
- var Viewport = new Evented();
- var focusedNode;
- ready(200, function(){
- var oldBox = winUtils.getBox();
- Viewport._rlh = on(win.global, "resize", function(){
- var newBox = winUtils.getBox();
- if(oldBox.h == newBox.h && oldBox.w == newBox.w){ return; }
- oldBox = newBox;
- Viewport.emit("resize");
- });
- // Also catch zoom changes on IE8, since they don't naturally generate resize events
- if(has("ie") == 8){
- var deviceXDPI = screen.deviceXDPI;
- setInterval(function(){
- if(screen.deviceXDPI != deviceXDPI){
- deviceXDPI = screen.deviceXDPI;
- Viewport.emit("resize");
- }
- }, 500);
- }
- // On iOS, keep track of the focused node so we can guess when the keyboard is/isn't being displayed.
- if(has("ios")){
- on(document, "focusin", function(evt){
- focusedNode = evt.target;
- });
- on(document, "focusout", function(evt){
- focusedNode = null;
- });
- }
- });
- Viewport.getEffectiveBox = function(/*Document*/ doc){
- // summary:
- // Get the size of the viewport, or on mobile devices, the part of the viewport not obscured by the
- // virtual keyboard.
- var box = winUtils.getBox(doc);
- // Account for iOS virtual keyboard, if it's being shown. Unfortunately no direct way to check or measure.
- var tag = focusedNode && focusedNode.tagName && focusedNode.tagName.toLowerCase();
- if(has("ios") && focusedNode && !focusedNode.readOnly && (tag == "textarea" || (tag == "input" &&
- /^(color|email|number|password|search|tel|text|url)$/.test(focusedNode.type)))){
- // Box represents the size of the viewport. Some of the viewport is likely covered by the keyboard.
- // Estimate height of visible viewport assuming viewport goes to bottom of screen, but is covered by keyboard.
- box.h *= (orientation == 0 || orientation == 180 ? 0.66 : 0.40);
- // Above measurement will be inaccurate if viewport was scrolled up so far that it ends before the bottom
- // of the screen. In this case, keyboard isn't covering as much of the viewport as we thought.
- // We know the visible size is at least the distance from the top of the viewport to the focused node.
- var rect = focusedNode.getBoundingClientRect();
- box.h = Math.max(box.h, rect.top + rect.height);
- }
- return box;
- };
- return Viewport;
- });
|