【问题标题】:Insert a div dynamically based on the viewport parameter根据视口参数动态插入一个div
【发布时间】:2016-09-08 12:37:43
【问题描述】:

如何根据视口参数动态插入 div?因为我在管理没有响应的横幅广告方面需要帮助。例如,仅当 body 客户端宽度大于 768 时才会加载 728x90、970x250、160x600 的顶部 div,否则将加载 320x50 标记 div。

现在我在网上做:

<div id="ezoic-pub-ad-placeholder-100">
<script type="text/javascript"><!--
               e9 = new Object();
    e9.size = "728x90";
//--></script>
<script type="text/javascript" src="http://tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js"></script>
</div>

但是,它应该如何工作,当屏幕宽度小于 768 时,它会显示我的 300 x 50:

<script type="text/javascript"><!--

               e9 = new Object();

    e9.size = "320x50";

//--></script>

<script type="text/javascript" src="http://tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js"></script>

更新:

我创建了这个,从逻辑上讲它应该可以工作,但它不显示任何内容,除非我的浏览器有问题。有人可以查吗?

<script>
window.onresize = function(){

var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');

if ( $(window).width() <= 767) {

e9 = new Object();
e9.size = "320x50";
script.src = "http://tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js";
head.appendChild(script);

}else {

e9 = new Object();
e9.size = "728x90";
script.src = "http://tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js";
head.appendChild(script);

}
}
</script>

【问题讨论】:

  • 不再需要在脚本块中添加 HTML 注释。事实上,我认为自 2000 年以来就没有必要这样做了。
  • 你能分享一个链接到你的网页吗?我无法重现您展示的广告。
  • @PinkTurtle prowrestling.com。它没有实时显示代码,因为它没有显示横幅。所以我恢复到广告网络提供的原始代码。我要更改的部分是导航栏下方的横幅广告。
  • 我认为您可以加载两个广告尺寸并根据窗口大小调整显示/隐藏它们。那有意义吗 ?您能否同时显示两种广告尺寸?
  • @PinkTurtle 这是有道理的。我不想同时显示两种广告尺寸,因为 300x250 仅适用于移动设备。我正在考虑可能废弃 javascript,因为它不起作用并切换到 CSS,所以我可以调整 728x90 的大小以适应所有屏幕。不过,将不得不更多地研究这种方法。由于 728 的支出超过 300,因此尽可能保留它是有意义的。

标签: javascript html css


【解决方案1】:

我认为 Window.matchMedia() 是你的朋友。这是API

您可以创建如下规则:

var mq = window.matchMedia( "(min-width: 500px)" );

并监听窗口调整大小

window.onresize = function(){
  if(mq.match){ //show or hide what you need }
}

【讨论】:

  • 我添加了更新的代码。但是它不加载任何东西,现在只是空的空间。
【解决方案2】:

检查客户端的宽度:

window.onresize = function(){
  if(window.innerWidth <= 767){ 
    // Code to display a DOM element.

  }
}

【讨论】:

    【解决方案3】:

    这样的事情可能会奏效

    function insertDiv(){
        var screenSize = document.width;
        var bannerWrapper = document.getElementById('bannerWrapper');
    
        if(screenSize > 1200){
            bannerWrapper.innerHtml('<div class="bigBanner">Buy this!</div>');
        }else if(screenSize > 600 && screenSize < 1999){
            bannerWrapper.innerHtml('<div class="mediumBanner">Buy this!</div>');
        }else if(screenSize < 599){
            bannerWrapper.innerHtml('<div class="smallBanner">Buy this! </div>');
        }
    }
    

    【讨论】:

      【解决方案4】:

      更新后的问题中的函数看起来不错,但它需要触发调整大小事件才能使其工作,这就是页面加载时没有任何反应的原因。

      此外,您需要确定加载另一个脚本是否会覆盖前一个脚本的功能(当您更改大小时会发生这种情况),并且您还应该在添加新脚本时清理前一个脚本。 (请注意,您的代码每次发生调整大小事件时都会向页面头部添加一个新脚本)

      如果您可以加载两个脚本然后只选择调用哪个脚本会容易得多,但由于这看起来像一个 3rd-party API,这可能是不可能的。

      要解决我提到的第一个问题,您只需要在页面加载时运行用于调整大小回调的函数。您可以将该代码定义为一个函数,然后将该函数主体附加到调整大小的侦听器,然后手动执行一次:

      function handleResize(){
      
        var head = document.getElementsByTagName('head')[0];
        var script = document.createElement('script');
        var e9 = new Object();    
      
        if ( $(window).width() <= 767) {
          e9.size = "320x50";
          script.src = "http://tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js";    
        } else {
          e9.size = "728x90";
          script.src = "http://tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js";    
        }
      }
      
      head.appendChild(script);
      
      window.onresize = handleResize; // attach it
      handleResize(); // run it once
      

      【讨论】:

        【解决方案5】:
        <script>
        var createAds = function() {
          var head = document.getElementsByTagName('head')[0];
          var script = document.createElement('script');
          script.id = "ads";
          head.appendChild(script);
        
          return script;
        };
        
        var resizeAds = function(){
        
          var ads = document.getElementById('ads') || createAds();
        
          var width = window.innerWidth || window.screen.width;
        
          // It seems that your .js needs to get the e9 global object
          window.e9 = window.e9 || new Object();
        
        // HTTP ommitted for use the current protocol: http/https
        
          if (width <= 767) {
            window.e9.size = "320x50";
            ads.src = "//tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js";
          } else {
            window.e9.size = "728x90";
            ads.src = "//tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js";
          }
        
        };
        
        resizeAds();
        window.onresize = resizeAds;
        </script>
        

        【讨论】:

          【解决方案6】:

          广告脚本创建几个全局变量:e9Manager、e9AdSlots、e9Loader,然后检查它们是否已初始化:if (e9Loader === undefined)。如果是,脚本什么也不做。

          因此,如果您确实需要在调整大小时重新加载广告(但为什么?),您应该销毁所有 e9 全局对象并重新初始化它们。

          <script>
              window.onresize = function(){
                  console.log('resize');
                  var head = document.getElementsByTagName('head')[0];
                  var script = document.createElement('script');
                  script.setAttribute('id', 'ad_script');
                  e9 = new Object();
                  e9Loader = undefined;
                  e9Manager = undefined;
                  e9AdSlots = undefined;
          
                  var element = document.getElementById("ad_script");
                  if (element) {
                      element.parentNode.removeChild(element);
                  }   
                  if ( window.innerWidth <= 767) {
                      e9.size = "320x50";
                      script.src = "http://tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js";
                      head.appendChild(script);
                   } else {
                      e9.size = "728x90";
                      script.src = "http://tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js";
                      head.appendChild(script);
                  }
              }
              window.onload = function(){
                  window.onresize();
              };
          </script>
          

          这样的事情应该可以工作。但是,我建议只在页面加载时执行一次

          【讨论】:

          • 我也在考虑同样的问题,首先你应该在加载时加载它,然后在调整大小时加载它
          【解决方案7】:

          您可以使用https://github.com/krux/postscribe 在页面加载后呈现广告。 完整的工作示例:

          <html>
          <head>
              <title>Test</title>
              <script src="https://cdnjs.cloudflare.com/ajax/libs/postscribe/2.0.6/postscribe.min.js"></script>
              <script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
              <script type="text/javascript">
                  window.onresize = function(){
                      $('#ezoic-pub-ad-placeholder-100').children().remove();
                      if ( $(window).width() <= 767) {
                          e9 = new Object();
                          e9.size = "320x50";
                          $(function() {
                              postscribe('#ezoic-pub-ad-placeholder-100', '<script src="http://tags.expo9.exponential.com/tags/ProwrestlingcomMobile/320x50/tags.js"><\/script>');
                          });
                      }else {
                          e9 = new Object();
                          e9.size = "728x90";
                          $(function() {
                              postscribe('#ezoic-pub-ad-placeholder-100', '<script src="http://tags.expo9.exponential.com/tags/ProWrestlingcom/ROS/tags.js"><\/script>');
                          });
                      }
                  }
                  window.onload = function(){
                      window.onresize();
                  };
          </script>
          
          </head>
          <body>
              <div id="ezoic-pub-ad-placeholder-100"></div>
          </body>
          </html>
          

          无法从异步加载的外部脚本写入文档的问题。所以postscribe决定了这个问题。

          【讨论】:

            【解决方案8】:

            使用没有debounceonresize 处理程序会降低性能。 这真是不好的做法。尽量避免这种情况。 欲了解更多信息 - http://bencentra.com/code/2015/02/27/optimizing-window-resize.html

            【讨论】:

              【解决方案9】:

              这可能不是你最初想要的,但为什么不试试纯 css 呢?

              您的目标是根据用户视口展示不同的广告。使用 css,您可以非常轻松地根据实际用户分辨率显示/隐藏元素。您甚至不必捕捉任何事件或包含任何库。您甚至可以让您的广告具有响应性(同样,非常容易)或在打印页面时隐藏它们。

              HTML

              <a href="#target-page" class="banner">
                <span class="shadow"></span>
                <span class="text">Banner</span>
              </a>
              <a href="#target-page" class="banner only-small-viewport">
                <span class="shadow"></span>
                <span class="text">small screen</span>
              </a>
              <a href="#target-page" class="banner only-large-viewport">
                <span class="shadow"></span>
                <span class="text">large screen</span>
              </a>
              

              CSS

              .banner { 
                display: block;
                position: relative;
              }
              .banner .text {
                position: absolute;
                left: 0;
                right: 0;
                top: 50%;
                transform: translateY(-50%);
                text-align: center;
                font-size: 10vmax;
              }
              .banner .shadow {
                position: absolute;
                left: 0; right: 0; top: 0; bottom: 0;
                background-color: rgba(255,255,255, 0.8);
                transition: 1s background-color;
                z-index: 100;
              }
              .banner:hover .shadow {
                background-color: rgba(255,255,255, 0);
              }
              
              @media (max-width: 768px) {
                .banner.only-large-viewport { display: none; }
              }
              @media (min-width: 768px) {
                .banner.only-small-viewport { display: none; }
              }
              
              
              .banner {
                background-image: url("http://speciale-life.com/wp-content/uploads/2016/03/zoom-1-400x225.jpg");
                width: 400px;
                height: 225px;
              }
              @media (min-width: 736px) {
                .banner {
                  background-image: url("https://s-media-cache-ak0.pinimg.com/736x/35/ae/b8/35aeb834c602ba9394e3163fe66cca9d.jpg");
                  width: 736px;
                  height: 414px;
                }
              }
              @media (min-width: 736px) {
                .banner {
                  background-image: url("https://s-media-cache-ak0.pinimg.com/736x/35/ae/b8/35aeb834c602ba9394e3163fe66cca9d.jpg");
                  width: 736px;
                  height: 414px;
                }
              }
              @media (min-width: 1280px) {
                .banner {
                  background-image: url("http://cfile22.uf.tistory.com/image/2571CB3856D7FA8138BAA1");
                  width: 1280px;
                  height: 721px;
                }
              }
              

              Here is jsFiddle

              【讨论】:

                【解决方案10】:

                两个主要问题。

                1. window.onresize 每次浏览器大小变化时都会运行,即使只是一点点变化,因此需要管理 - 你不希望它一直加载脚本。

                要解决这个问题,您可以在每次浏览器调整大小时运行检查,但只有在更改为新大小时才实际执行某些操作。您还应该在页面首次运行时运行检查,否则您将等待触发调整大小事件,如上所述。

                var banner_current = "a";
                function banner_check() {
                    var screen_size = document.width;
                    var banner_suggested = ""; 
                    if (screen_size > 1200) {
                        banner_suggested = "a";
                    } else if (screen_size > 600){
                        banner_suggested = "b";
                    } else {
                        banner_suggested = "c";
                    }
                    if (banner_suggested !== banner_current) {
                        banner_load(banner_suggested);
                    }
                }
                window.onresize = banner_check;
                banner_check();
                
                1. 异步添加脚本后,您可能需要对其进行初始化才能使其正常工作。

                这将涉及删除或重置它正在使用的任何变量,它可能会在启动时检查,以及调用 init 函数。我不具体了解您的脚本,但应该可以使用以下内容。

                function banner_load(new_banner) {
                
                    // check for existing script here and delete if present
                
                    // create new script
                    var script_new = document.createElement('script');
                    switch(new_banner) {
                        case "a":
                            script_new.src = "https://new-script.com/js_a.js";
                            break;
                        case "b":
                            script_new.src = "https://new-script.com/js_b.js";
                            break;
                        default:
                            script_new.src = "https://new-script.com/js_c.js";
                    }
                    script_new.type = 'text/javascript';
                    script_new.async = 'true';
                    script_new.onload = script_new.onreadystatechange = function() {
                
                
                         // check if vars defined and if so clear them, e.g:
                         if (typeof e9Loader !== 'undefined') { e9Loader = null; }
                         if (typeof e9Manager !== 'undefined') { e9Manager = null; }
                         if (typeof e9AdSlots !== 'undefined') { e9AdSlots = null; }
                
                         // run init function in new script
                
                    };
                
                    // load script
                    var head = document.getElementsByTagName('head')[0];
                    head.appendChild(script_new);
                
                }
                

                如果您在添加另一个文件时没有删除一个文件,您可能会得到冲突的变量和函数名称,然后您将很难让新脚本正常运行。此链接很好地概述了如何正确删除文件:

                http://www.javascriptkit.com/javatutors/loadjavascriptcss2.shtml

                【讨论】:

                  猜你喜欢
                  • 2011-09-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-07-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多