UNPKG

devextreme

Version:

JavaScript/TypeScript Component Suite for Responsive Web Development

101 lines (100 loc) 3.62 kB
/** * DevExtreme (esm/__internal/core/environment/init_mobile_viewport.js) * Version: 25.2.7 * Build date: Tue May 05 2026 * * Copyright (c) 2012 - 2026 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ import $ from "../../../core/renderer"; import devices from "../../core/m_devices"; import domAdapter from "../../core/m_dom_adapter"; import { extend } from "../../core/utils/m_extend"; import resizeCallbacks from "../../core/utils/m_resize_callbacks"; import { getWidth, setWidth } from "../../core/utils/m_size"; import { styleProp } from "../../core/utils/m_style"; import supportUtils from "../../core/utils/m_support"; import { getWindow } from "../../core/utils/m_window"; import eventsEngine from "../../events/core/m_events_engine"; const window = getWindow(); export const initMobileViewport = function(options) { options = extend({}, options); let realDevice = devices.real(); const { allowZoom: allowZoom } = options; const { allowPan: allowPan } = options; const allowSelection = "allowSelection" in options ? options.allowSelection : "generic" === realDevice.platform; if (!$("meta[name=viewport]").length) { $("<meta>").attr("name", "viewport").appendTo("head") } const metaVerbs = ["width=device-width"]; const msTouchVerbs = []; if (allowZoom) { msTouchVerbs.push("pinch-zoom") } else { metaVerbs.push("initial-scale=1.0", "maximum-scale=1.0, user-scalable=no") } if (allowPan) { msTouchVerbs.push("pan-x", "pan-y") } if (!allowPan && !allowZoom) { $("html, body").css({ msContentZooming: "none", msUserSelect: "none", overflow: "hidden" }) } else { $("html").css("msOverflowStyle", "-ms-autohiding-scrollbar") } if (!allowSelection && supportUtils.supportProp("userSelect")) { $(".dx-viewport").css(styleProp("userSelect"), "none") } $("meta[name=viewport]").attr("content", metaVerbs.join()); $("html").css("msTouchAction", msTouchVerbs.join(" ") || "none"); realDevice = devices.real(); if (supportUtils.touch) { eventsEngine.off(domAdapter.getDocument(), ".dxInitMobileViewport"); eventsEngine.on(domAdapter.getDocument(), "dxpointermove.dxInitMobileViewport", e => { const count = e.pointers.length; const isTouchEvent = "touch" === e.pointerType; const zoomDisabled = !allowZoom && count > 1; const panDisabled = !allowPan && 1 === count && !e.isScrollingEvent; if (isTouchEvent && (zoomDisabled || panDisabled)) { e.preventDefault() } }) } if (realDevice.ios) { const isPhoneGap = "file:" === domAdapter.getLocation().protocol; if (!isPhoneGap) { resizeCallbacks.add(() => { const windowWidth = getWidth(window); setWidth($("body"), windowWidth) }) } } if (realDevice.android) { resizeCallbacks.add(() => { setTimeout(() => { const activeElement = domAdapter.getActiveElement(); if (activeElement.scrollIntoViewIfNeeded) { activeElement.scrollIntoViewIfNeeded() } else { activeElement.scrollIntoView(false) } }) }) } };