【问题标题】:Change JavaScript code for page, if user resize it如果用户调整页面大小,则更改页面的 JavaScript 代码
【发布时间】:2017-12-08 22:37:28
【问题描述】:

1。总结

我在我的网站上对 PC 和移动设备的 CSS 和 JavaScript 代码使用媒体查询。如果 PC 用户调整我网站的页面大小,则活动窗口的宽度将


2。设置

  1. 我网站页面的 CSS:

    @media screen and (min-width: 60rem) {
        /* My CSS for PC */
        }
    }
    
    @media screen and (max-width: 60rem) {
        /* My CSS for mobile devices */
    }
    

    真实代码——https://github.com/Kristinita/KristinitaPelican/blob/master/themes/sashapelican/static/css/general/image_right.css#L35-L56

  2. 我网站页面的 JavaScript:

    window.onload = function() {
        if (window.matchMedia("(min-width: 60rem)").matches) {
            // My JavaScript for PC
        } else {
            // My JavaScript for mobile devices
        }
    
    };
    

    真实代码——https://github.com/Kristinita/Kristinita.github.io/blob/master/theme/js/Gemini/GeminiAndJQueryLazy.js#L8-L48

如果用户在 PC 或移动设备上使用我的 CSS 和 JavaScript 打开页面而不调整活动窗口的大小,则页面可以正常工作。


3。重现步骤

PC 用户在现代浏览器中打开我网站的任何页面 (example) → 用户调整页面大小(例如,使用 Super+Left_ArrowSuper+Right_Arrow 热键对于Windows Aero Snap)。现在窗口宽度


4。预期行为

更新页面的 CSS 和 JavaScript。


5。实际行为

CSS 更新,JavaScript 不更新。如果窗口宽度

如果窗口宽度


6。没有帮助

  1. 我尝试使用MatchMedia.js
  2. 我为媒体查询添加event listener

    // media query event handler
    if (matchMedia) {
      var mq = window.matchMedia("(min-width: 500px)");
      mq.addListener(WidthChange);
      WidthChange(mq);
    }
    
    // media query change
    function WidthChange(mq) {
      if (mq.matches) {
        // window width is at least 500px
      } else {
        // window width is less than 500px
      }
    
    }
    

    完整代码 - https://www.pastery.net/uxkvma/

  3. 我无法为任务编写代码:如果用户按下 Super+Left_ArrowSuper+Right_Arrow,页面会重新加载。如果用户按 Ctrl+Left_ArrowCtrl+Right_Arrow,我可以编写重新加载页面的代码:

    $(document).keydown(function(e) {
        if (e.keyCode == 37 && e.ctrlKey || e.keyCode == 39 && e.ctrlKey){
        window.location.reload();
        }
    });
    

    但如果我将ctrlKey 替换为metaKey,代码将不起作用。

  4. 现在I usewindow.location.reload(),如果通过任何方法调整页面大小:

    window.addEventListener('resize', function(event) {
      clearTimeout(resizeTimeout);
      var resizeTimeout = setTimeout(function(){
        window.location.reload();
      }, 1500);
    });
    

    但这不是最好的主意,因为例如,如果用户按 Ctrl+F 在页面中查找文本或打开浏览器控制台,页面将重新加载。


7。不提供

  1. 如果用户必须安装插件、更改设置或对浏览器执行其他操作,请不要提供解决方案。解决方案必须适用于任何现代浏览器的默认设置。

【问题讨论】:

  • 在服务器端获取分辨率,并为分辨率维护不同的视图。这意味着,如果它是全分辨率,则返回“FullView”html 视图,如果调整大小则发送“ResizedView”视图。
  • 这里有点困惑。您是说服务器应该根据浏览器的屏幕分辨率加载脚本?或者您是说脚本应该在客户端根据屏幕大小进行更改?
  • @Sagar:用户有任何现代浏览器(例如,Firefox 或 Chrome)+ 使用默认浏览器设置 + 用户调整我网站的页面大小。用户不需要为浏览器安装插件或更改浏览器设置,但 JavaScript 代码会为他正确更改。谢谢。
  • 也许这会有所帮助? stackoverflow.com/questions/1818474/…
  • @BibyAugustine:对不起,我可以在哪里阅读更多详细信息,如何实现您的算法?谢谢。

标签: javascript jquery media-queries


【解决方案1】:

window.resize

纯javascript

(function() {

window.addEventListener("resize", myFunction);

function myFunction() {
    var w = window.outerWidth;
    var h = window.outerHeight;
    var txt = "Window size: width=" + w + ", height=" + h;
    var img = document.querySelector("img");
    var p   = document.querySelector("p[id=size]");    
    
    p.style.float = "right"; // DOM CSS    
    p.innerHTML   = txt; // DOM HTML
    
    if (w > 500) { 
      img.setAttribute("src", "https://www.enfa.co.id/sites/indonesia/files/inline-images/article/si-kecil-belajar-apa-dari-permainan-cilukba_0.jpg");  
      
      // My JavaScript for PC
      anotherFunction("lightgrey");
 
    } else { 
      img.setAttribute("src", "https://pbs.twimg.com/profile_images/574971671183912961/RJ8uis5w.jpeg");
      
      // My JavaScript for mobile devices      
      anotherFunction("yellow");
 
    }    
}

function anotherFunction(color) {
    var p   = document.querySelector("p[id=size]");

    p.style.backgroundColor = color; // DOM CSS    
}

})(); //self executing function
<body> 
  <p id="size">Please click "Full page"</p>
  <p>Please resize the browser</p>
  
  <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSqLQwPshtQVlcV5b9V26btY1zPlX-Egb3Tlnj9T2LNc3jNNPffhQ" />
</body>

event_onresize
innerWidth
css_selectors

【讨论】:

  • 感谢您的回答。不幸的是,我不明白,从我的问题中我能做些什么。请参阅my javascriptdemo。谢谢。
【解决方案2】:

您是否尝试过使用 jquery? (纯js中也有类似的方法)。

类似

if($(window).width() >= '60rem') {

     //do one js code

}else{

     //do another js code

}

【讨论】:

  • 感谢您的回答。不幸的是,这破坏了我的页面布局。如果我按照您的说法替换脚本的this line,页面会很好显示,如果移动设备宽度,但我有一个错误,如果 PC 宽度。 Page 截图before — 截图after。谢谢。
【解决方案3】:

我猜你的 window.onload 为你的函数进行了某种初始化。

你做这样的事情怎么样:

var deregisterScripts = function() {
   // remove scripts.
}
var initScripts = function() {
    deregisterScripts();
    if (window.matchMedia("(min-width: 60rem)").matches) {
        initJavaScriptDesktop();
    } else {
        initJavaScriptMobile();
    }

};
window.onload = initScripts;
window.onresize = initScripts;

在您的 init 函数中,您可以从当前未使用的视图中取消注册不必要的内容。

每次调整窗口大小时,所有脚本都会重新初始化,它们应根据您的媒体查询进行切换。

【讨论】:

  • 感谢您的回答。如果我猜对了,我需要为删除脚本编写额外的代码吗?谢谢。
  • 这取决于。我不知道您在 onload 中到底做了什么。如果您的函数和变量都具有相同的名称,我猜您可以简单地覆盖它们。如果您将它们附加到 dom 元素,则可能必须取消附加并重新附加它们。这真的取决于你在那里做什么(以及如何)。
  • My script,我使用custom scrollbar。如果在网页PC窗口宽度,滚动条申请body标签;如果是移动设备宽度,滚动条申请main标签。 // 对不起,我可以在哪里阅读,如何编写代码,删除脚本?谢谢。
  • 嗯我不知道那些插件,但我会尝试将 pcscrollbar 和 mobilescrollbar 存储在您可以在调整大小时(可能是窗口)到达的地方,然后在您的移动视图,反之亦然。我刚刚查看了他们的文档,应该可以解决问题。
【解决方案4】:

您熟悉 MVC(模型-视图-控制器)架构吗?

在该架构中,控制器决定需要向用户显示哪个视图。您可以使用不同的 HTML、CSS 和 javascript 代码创建多个视图。例如,我确实有“完整”和“调整大小”的视图。当用户调用类似的 URL 时

http://...../Home/Index

然后索引操作将在 HomeController 中执行(此控制器在服务器端工作)。在这个 Index 操作方法中,我们将检查分辨率。例如

if(resolution==300)
then return Full
else
return resized

【讨论】:

  • 感谢您的回答。抱歉,MVC 适用于静态网站(HTML、CSS、JavaScript),而不适用于动态网站?
  • 不。 MVC 是一种架构,而不是像 c# 或 php 这样的编程语言,它是一种结构。 asp.net、php 和 javascript 也支持(angular js)MVC 架构。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
  • 2012-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多