javascript 如何将窗口对象传递给函数

标签 javascript html

我的函数 Slider 采用一个窗口对象,但它不包含主体。我的代码仅适用于移动屏幕 View 。 在我的函数中,在调试下面的代码时,

console.log(windows.document);

if (!mySlider) {console.log(windows.document.body);}

第一个控制台日志显示正文包含信息;然而,第二个表明 body 是空的。 我猜这是相关的

<!DOCTYPE html>
<html>

<head>
  <script>
    "use strict";
    /*
     *   Created by Waltor on 20181018.
     */
    var Slider = (function(windows) {
      var mySlider;
      var point = {
        start: 0,
        end: 0
      };

      function Slider(targetId, widthOfDisplayBlock, ImageSize, imageSrcArrays) {
        mySlider = document.getElementById(targetId);
        console.log(windows.document);
        if (!mySlider) {
          console.log(windows.document.body);
          console.log("mySlider >> " + mySlider);
          return;
        }
        createContainer(widthOfDisplayBlock, imageSrcArrays, ImageSize);
        createPhoneEvents(ontouchmove_, ontouchstart_);
      }

      function createContainer(widthOfDisplayBlock, imageSrcArrays, ImageSize) {
        var result = mySlider;
        var ImageSizeNumber = ImageSize.match(/\d/g).join("");
        var div = document.createElement("div");
        var dash = document.createElement("div");
        var dashWidth;
        var preSpace;

        result.style.overflow = "hidden";
        result.style.width = widthOfDisplayBlock;
        dashWidth = ((result.offsetWidth) - (ImageSizeNumber * 2)) / 2;

        ImageSize = ImageSize ? ImageSize : "100px";
        div.style = "width:" + ((imageSrcArrays.length + 1) * (ImageSizeNumber * 1 + dashWidth)) + "px;";
        dash.style = "float:left;position:relative;width:" + (ImageSizeNumber / 2) + "px;height:10px;top:" + (ImageSizeNumber / 2) + "px;";
        div.appendChild(dash);
        preSpace = dash.cloneNode(true);
        preSpace.style.width = dashWidth + "px";
        preSpace.style.background = "#ccc";
        div.appendChild(preSpace);

        for (var i = 0; i < imageSrcArrays.length; i++) {
          var img = document.createElement("img");
          img.src = imageSrcArrays[i];
          img.style = "float:left;width:" + ImageSize + ";height:" + ImageSize + ";";
          div.appendChild(img);
          div.appendChild(preSpace.cloneNode(true));
        }
        div.appendChild(dash.cloneNode(true));

        result.appendChild(div);
        return result;
      }

      function createPhoneEvents(ontouchmove, ontouchstart) {
        var result = mySlider;

        result.ontouchmove = ontouchmove;
        result.ontouchstart = ontouchstart;
        result.ontouchend = touchend;
      }

      function touchend() {
        point.start = 0;
        point.end = 0;
        console.log('clear!');
      }

      var count = 0;

      function ontouchmove_(event) {
        return touchmove(event, caculation);

        function caculation(start, end) {
          if (start && end) return end - start;
          return 0;
        }

        function touchmove(event, caculation) {
          console.log(count + " > " + event.touches[0].clientX);
          count++;
          var move = 0;
          var result = mySlider;
          var limit = {
            left: result.offsetLeft,
            right: result.offsetLeft + result.offsetWidth
          };

          point.end = event.touches[0].clientX;
          if (point && (point.end > limit.left) && (point.end < limit.right)) move = caculation(point.start, point.end);
          mySlider.scrollLeft -= move * 2;
          point.start = point.end;

          document.getElementById("test").innerHTML =
            "point.start >> " + point.start +
            "<br/>point.end >> " + point.end +
            "<br/>move >> " + move;
        }
      }

      function ontouchstart_(event) {

      }

      return Slider;
    })(window);

    var src = [
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg",
      "http://farm8.staticflickr.com/7347/8731666710_34d07e709e_z.jpg"
    ];

    function loading() {
      console.log(this);
      Slider("targetId", "60vw", "150px", src);
    }
  </script>
  <script>
    window.addEventListener('load', loading);
    window.addEventListener('load', Slider("targetId", "60vw", "150px", src));
  </script>
</head>

<body>
  <hr/>
  <div id="targetId" style="margin:0 auto;"></div>
  <hr/>
  <div id="test" style="font-szie:30px;"></div>
</body>

</html>

了解 javascript 如何加载信息。 谁能帮助我理解我的代码中发生了什么 以及如何传递窗口对象?

最佳答案

首先,window对象是全局的。只要您在浏览器中运行此代码,代码中的任何函数都可以访问它。

接下来,您的错误是您调用代码的地方: 你有

 <script>
   window.addEventListener('load', loading);
   window.addEventListener('load', Slider("targetId", "60vw", "150px", src));
 </script>

什么时候应该是:

 <script>
   window.addEventListener('load', loading);
   window.addEventListener('load', function() {
       Slider("targetId", "60vw", "150px", src);
   })
 </script>

这是因为你的“函数” slider 实际上是一个通过闭包的构造函数。 在顶部有 var Slider = (function () { ... })(window) 所以 Slider 会自动被调用。调用它后,它实际上返回一个您在闭包内部定义的名为 Slider 的函数。 该函数返回 null 或未定义。因此,当您添加事件监听器时,您不是给它一个在窗口完成加载时调用的函数,而是给它一个值。

关于javascript 如何将窗口对象传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52885554/

相关文章:

javascript - CSS Hover 和 Javascript 在一个页面上工作而不在另一个页面上工作?

html - 如何使用PHP将mysql查询的数据输出显示为HTML?

javascript - Meteor 返回字符串形式的值

javascript - 谷歌地图标记 php

javascript - Timbre.js 键盘输入似乎不起作用

javascript - 位于 'https://example.com' 的页面已通过 HTTPS 加载,但请求了不安全的 XMLHttpRequest 端点

jquery - 更改 Bootstrap 事件选项卡颜色内联

html - CSS 旋转对象在动画完成之前不会旋转

javascript - 为什么触发点击 contenteditable 不会激活元素并设置光标

javascript - 一切正常,但是当我单击编辑按钮时,每次都会添加一个逗号 (,)。我不会发现哪里出了问题?