【问题标题】:Javascript - Run my script only if landscape is detectedJavascript - 仅在检测到景观时运行我的脚本
【发布时间】:2019-09-22 12:11:24
【问题描述】:

我正在运行脚本以在带有滚动的菜单中显示通知,但我不知道如何检测设备是否具有方向景观以验证脚本

调用onClick="VerHayMas();" 完美运行,但如果用户打开菜单一次,单击#boton-menu 并且您的设备处于纵向,在将方向更改为横向后,脚本不再符合目标。

仅当设备处于横向时,脚本才有其逻辑,即 当菜单需要显示通知时。

那么,我的脚本是否可能仅对(max-width:999px) and (orientation:landscape) 有效,而忽略了肖像...?

我是JS的初学者,真的不知道该怎么做。

有什么想法吗?

提前致谢!

HTML 和 CSS

#mas-menu {display:none}

<div id="boton-menu" onClick="VerHayMas();">+</div>

脚本:

var clicksVerHayMas = 0;

function VerHayMas() {
    clicksVerHayMas = clicksVerHayMas + 1;
    if (clicksVerHayMas == 1) {
        document.getElementById('mas-menu').style.display = 'block';

        window.setTimeout(function() {
            $('#mas-menu').fadeOut('slow');
        }, 4000);
    }
};

编辑:

我已尝试使用以下脚本,但它不起作用。如果用户以纵向模式调用onClick="VerHayMas();",则脚本不再以横向模式运行。

我在这里做错了什么?

const matchesMediaQuery = window.matchMedia('(max-width:999px) and (orientation:landscape)').matches;

if (matchesMediaQuery) {

var clicksVerHayMas = 0;
  function VerHayMas() {
  clicksVerHayMas = clicksVerHayMas +1;
  if(clicksVerHayMas == 1){
  document.getElementById('mas-menu').style.display = 'block';

  window.setTimeout(function(){
  $('#mas-menu').fadeOut('slow');
  },4000);
  }};
}

【问题讨论】:

  • 你可以分别用window.innerHeightwindow.innerWidth获取窗口的宽度和高度。保持简单如何,如果高度小于宽度,则用户处于横向模式。
  • 如果你只是想在横向隐藏一些东西,为什么不使用一行CSS呢?
  • 您将函数声明放在if 语句中的尝试不起作用,因为它不再是可以从内联事件处理程序属性调用的全局变量。

标签: javascript jquery


【解决方案1】:

你可以使用matchMedia解决这个问题:

const matchesMediaQuery = window.matchMedia('(max-width:999px) and (orientation:landscape)').matches;

if (matchesMediaQuery) {
    // do something
}

请务必在 MDN 链接中注明浏览器支持。

编辑以提供上下文:

因为用户可能在他们的屏幕上移动,你会想要在每次运行时对 inside VerHayMas 进行评估,以确定是否应该执行脚本的主体:

var clicksVerHayMas = 0;

function VerHayMas() {
    var isLandscapeAndMeetsSizeRequirements = window.matchMedia('(max-width:999px) and (orientation:landscape)').matches;

    if (isLandscapeAndMeetsSizeRequirements) {
        clicksVerHayMas = clicksVerHayMas + 1;
        if (clicksVerHayMas == 1) {
            document.getElementById('mas-menu').style.display = 'block';

            window.setTimeout(function() {
                $('#mas-menu').fadeOut('slow');
            }, 4000);
        }
    }
};

所以VerHayMas 将在每次点击时运行,但只有当屏幕满足媒体查询字符串确定的要求时,它才会执行if 块内的代码。

【讨论】:

  • 您不能简单地在VeryHayMas 内运行matchMedia,以便它在需要对该信息采取行动之前立即评估屏幕尺寸和方向吗?当然,方向可能会发生变化,因此您每次进行检查时都需要运行它。
  • @Pablo_Web - 用一个例子更新了答案,展示了它是如何工作的。
  • Alexander Nied ...现在我明白了。我做错了。我会研究你的剧本。它非常干净整洁。谢谢!。问候...
【解决方案2】:

我会保持简单,如果屏幕高度小于宽度,则用户处于横向模式。您可以从全局window 对象中获取高度和宽度。

if (window.innerWidth > window.innerHeight) {
    // The user is in landscape mode!
    userInLanscapeFunc();
} 

参考:https://developer.mozilla.org/en-US/docs/Web/API/Window/innerHeight

【讨论】:

  • 也许使用screen.width/.height 会更好,尽管这取决于他们是否真的关心可用窗口区域的形状或屏幕方向
猜你喜欢
  • 2018-09-03
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-08-05
  • 2015-05-15
  • 2016-10-24
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多