javascript - 在 JavaScript 中使用模块模式时如何引用 DOM 元素?

标签 javascript ajax xmlhttprequest module-pattern

如何从封装的 JavaScript 对象中获取 DOM 元素的值? 这是行不通的。我没有得到任何未定义的信息。我认为该页面没有呈现,因此无法看到,但我将其放入 .ready 函数中,但我仍然未定义。

$(document).ready(function() {
  GetLoans = {
    myModal: function() {
      return document.querySelector("#myModal")
    },
    myModalBody: function() {
      return document.querySelector(".modal-body")
    },
    getNewLoans: function() {
      var xhr;
      xhr = new XMLHttpRequest();
      var url = "/api/books";
      xhr.open("GET", url, true);
      xhr.responseType = 'json';
      xhr.send(null); //or your data
      xhr.onreadystatechange = function() {
          if (xhr.readyState == 4 && (xhr.status == 200)) {
            var result = xhr.response;
            for (var key in result) {
              if (result.hasOwnProperty(key)) {
                //console.log(result[key].patron_id);
                this.myModalBody.innerHTML = result[key].patron_id;
              }
            }
          }
        }
        // var serverResponse = xhr.responseText;
        // this.myModalBody.innerHTML = serverResponse;
    },
    bindUIActions: function() {
      // this.myModalBody.addEventListener("click", this.getNewLoans(), false);

    },
    init: function() {
      this.getNewLoans();
      //this.bindUIActions();

    }
  };
  GetLoans.init();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
        </button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

Uncaught TypeError: Cannot set property 'innerHTML' of undefined
    at XMLHttpRequest.xhr.onreadystatechange

请不要使用 jQuery(是的,我知道我正在使用 Document.Ready 函数。)

最佳答案

首先,您引用的 this 对象未正确绑定(bind)到您的模块。从调用中删除对 this 的引用,因为您使用它的函数与它们需要访问的函数位于同一范围内。

你确实有模块方法来获取 DOM 引用:

myModalBody: function() {
  return document.querySelector(".modal-body")
}

myModal: function() {
  return document.querySelector("#myModal")
}

但是,当您编写时,您实际上并没有调用这些方法:

this.myModalBody.innerHTML = result[key].patron_id;

你需要写:

myModalBody().innerHTML = result[key].patron_id;

以便调用该函数并使用该函数的返回值。

如果没有调用括号,您将查找名为 innerHTMLmyModalBody 函数/对象的属性,该属性不存在。

此外,在您的事件接线代码中,您有:

 this.myModalBody.addEventListener("click", this.getNewLoans(), false);

其中不应包含括号,因为它将立即调用该方法,导致事件处理程序成为 AJAX 调用的结果(这很可能不是函数,对吧?)。尝试:

 myModalBody.addEventListener("click", getNewLoans, false);

$(document).ready(function() {
  GetLoans = {
    myModal: function() {
      return document.querySelector("#myModal")
    },
    myModalBody: function() {
      return document.querySelector(".modal-body")
    },
    getNewLoans: function() {
      var xhr;
      xhr = new XMLHttpRequest();
      var url = "/api/books";
      xhr.open("GET", url, true);
      xhr.responseType = 'json';
      xhr.send(null); //or your data
      xhr.onreadystatechange = function() {
          if (xhr.readyState == 4 && (xhr.status == 200)) {
            var result = xhr.response;
            for (var key in result) {
              if (result.hasOwnProperty(key)) {
                //console.log(result[key].patron_id);
                myModalBody().innerHTML = result[key].patron_id;
              }
            }
          }
        }
        var serverResponse = xhr.responseText;
        myModalBody().innerHTML = serverResponse;
    },
    bindUIActions: function() {
      myModalBody().addEventListener("click", getNewLoans, false);

    },
    init: function() {
      this.getNewLoans();
      //this.bindUIActions();

    }
  };
  GetLoans.init();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span>
        </button>
        <h4 class="modal-title" id="myModalLabel">Modal title</h4>
      </div>
      <div class="modal-body">
        ...
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
        <button type="button" class="btn btn-primary">Save changes</button>
      </div>
    </div>
  </div>
</div>

关于javascript - 在 JavaScript 中使用模块模式时如何引用 DOM 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42101236/

相关文章:

javascript - Installshield javascript 中的密码验证和警报消息

javascript - 如何将消息从 popup.html 发送到内容脚本?

JavaScript - 打开、刷新和访问新选项卡

javascript - 无法在 PHP 内回显以 ajax 发送的 POST 参数

java - 为什么spring不使用ajax上传呢?

javascript - 在 R/Shiny 中使用 Simple Webaudiorecorder.js 并将录音发布到服务器

sharepoint - 使用 XMLHTTP 删除 Sharepoint 文件

Javascript 模块 : return a bare object, 或命名

php - 想要在单击 div 时调用 PHP 页面?

javascript - 如何使用 jQuery 异步上传文件?