javascript - 让加载屏幕与 Polymer 配合使用

标签 javascript html dom polymer

我正在尝试让加载屏幕在 Polymer 中工作,如以下要点所示:https://gist.github.com/SlicedSilver/f2e93a5995f84d9cd512

这个想法非常简单:入口点是一个轻量级 HTML 文件,用于呈现加载屏幕,其主体包含一个 onload 回调,一旦呈现该轻量级页面,该回调就会通过 DOM 加载 Polymer 应用程序。

它在桌面浏览器上运行得很好。在移动浏览器上,filestoload.html 永远不会被加载(但也不会抛出任何错误),因此加载屏幕只是停留在那里,应用程序永远不会加载。完整代码如下,但要特别注意这一行:

tag.setAttribute('onload', 'polymerLoader.insertPolymerApplication()');

该 onload 事件永远不会触发,也不会抛出错误。我尝试通过 DOM 和适当的事件处理程序来捕获它,但没有成功。我什至尝试将其完全从 JS 手中夺走,作为健全性检查,将链接添加到 HTML 文件,如下所示:

<link rel="import" href="/filestoload.html" onload="polymerLoader.insertPolymerApplication()" >

相同的结果 - 在桌面上显示应用程序,但仅在移动设备上显示加载屏幕。我没有什么想法。有什么帮助吗?

...

这是轻量级入口点(index.html)

<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
    <link rel="shortcut icon" type="image/png" href="/assets/images/favicon.ico"/>

    <title>GreenMaven</title>
    <meta name="description" content="greenmaven description">

    <script src="assets/js/polymerAppLoader.js"></script>

    <style type="text/css">

      .loading {
        position: fixed;
        top: 50%;
        left: 50%;
        /* bring your own prefixes */
        transform: translate(-50%, -50%);
        z-index: -500;
        display: block;
      }
    </style>
  </head>
  <body onload="polymerLoader.loadPolymerApplication()">

    <div id="loader" class="loading">
      <img src="assets/images/gears.svg" />
    </div>
    
  </body>
</html>

这是加载 Polymer 应用程序其余部分的 JS:

'use strict';
/* global polymerLoader */
/*jshint unused:false*/
/*jshint -W079*/


// This is the normal conditional loader for the Web components Polyfill
if ('registerElement' in document && 'createShadowRoot' in HTMLElement.prototype && 'import' in document.createElement('link') && 'content' in document.createElement('template')) {
  // We're using a browser with native WC support!
} else {
  // Add web components polyfill...
  document.write('<script src="bower_components/webcomponentsjs/webcomponents.lite.js"><\/script>');
}

var polymerLoader = (function() {

  // Function for creating a link element and inserting it into the <head> of the html document
  function addLinkTag(elementType, address, shim, loadTrigger) {
    var tag = document.createElement('link');
    tag.rel = elementType;
    tag.href = address;
    if (shim) {
      // add the shim-shadowdom attribute
      tag.setAttribute('shim-shadowdom', '');
    }
    if (loadTrigger) {
      // This file needs to be loaded before inserting the Polymer Application
      // when finished loading it will call the polymerLoader.insertPolymerApplication() function
      tag.setAttribute('onload', 'polymerLoader.insertPolymerApplication()');
      expectedCalls++;
    }
    document.getElementsByTagName('head')[0].appendChild(tag);
  }

  var pgApploaded = false;

  function loadPolymerApplication() {
    // Only insert once.
    if (!pgApploaded) {
      addLinkTag('import', 'filestoload.html', false, true);
      pgApploaded = true;
    }
  }

  // Counter variable for insertPolymerApplication() calls
  var callCount = 0;
  var expectedCalls = 0;

  function insertPolymerApplication() {
    callCount++;
    // Only when callCount >= expectedCalls
    // The application is only inserted after all required files have loaded
    // for the application to work.
    if (callCount >= expectedCalls) {
      // here is the html that is inserted when everything is loaded.
      document.querySelector('body').innerHTML += '<template is="auto-binding" id="app"><polymer-app id="main-app"></polymer-app></template>';
      document.getElementById('loader').style.display = 'none';
    }
  }


  return {
    insertPolymerApplication: function() {
      insertPolymerApplication();
    },

    loadPolymerApplication: function() {
      loadPolymerApplication();
    }
  };
})(document);

最后,这是 filestoload.html 文件,其中包含通常在 Polymer index.html 中找到的链接和脚本:

<!doctype html>
<!-- Here is where you put the scripts required by the page, that would normally be -->
<!-- included in the index.html page, you can still use grunt/gulp build functions on these -->

<!-- will be replaced with elements/elements.vulcanized.html -->
<link rel="manifest" href="/manifest.json">
<link rel="import" href="/src/greenmaven-app/greenmaven-app.html">
<link rel="stylesheet" href="assets/css/main.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" integrity="sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ" crossorigin="anonymous">

<!-- endreplace-->

<!-- build:js scripts/app.js -->
<script src="properties_base/farmhacker-properties.js"></script>
<!-- endbuild-->

<!-- build:js scripts/thirdparty.js -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/tether/1.4.0/js/tether.min.js" integrity="sha384-DztdAPBWPRXSA/3eYEEUWrWCy7G5KFbe8fFjk5JAIxUYHKkDx6Qin1DkWx51bBrb" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js" integrity="sha384-vBWWzlZJ8ea9aCX4pEW3rVHjgjt7zpkNpZk+02D9phzyeVkE+jo0ieGizqPLForn" crossorigin="anonymous"></script>
    
    <script>
      $(function() {
        $('a[href*="#"]:not([href="#"])').click(function() {
          if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
            if (target.length) {
              $('html, body').animate({
                scrollTop: target.offset().top - $('#navbar').height()
              }, 1000);
              return false;
            }
          }
        });
      });
    </script>
<!-- endbuild-->

最佳答案

事实证明这是 Polymer 构建中的某种错误,可能与另一个错误有关,在该错误中运行 polymer build 导致应用程序从 Bower 组件中抛出一堆 404 错误。

当我对服务器进行原始部署(无需构建/硫化)时,桌面和移动设备上的一切都运行良好,并且没有错误。

关于javascript - 让加载屏幕与 Polymer 配合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42358957/

相关文章:

php - 将 CSS 背景速记转换为速记

javascript - 背景视频可以在 Firefox 上运行,但不能在 Chrome 上运行

html - CSS3 中的分割高度

javascript - 使用javascript将数组数据发送到另一个页面?

javascript - 按参数排序

JavaScript - 将 eventListener 附加到没有 jQuery 的子元素

javascript - 非常简单的 javascript 根本不起作用

javascript - 如何在使用javascript粘贴之前修改复制的文本

javascript - 如何更改浏览器的测试日期?

javascript - jquery ajax 调用未在函数调用内执行警报