javascript - 'this.function' 不是一个函数 - OO JS

标签 javascript

我有一个模态对象,其属性具有各种函数,但是当我单击打开模态时,我收到错误 this.openModal 不是函数。我尝试过调试,但一旦它达到我希望它运行的功能,它就会崩溃。我怀疑这可能是“this”绑定(bind)的问题,但我不确定问题出在哪里。我的所有 JS 都在下面,一个函数链接到另一个函数上,这样更容易看到整个对象。

var modal = function () {

  // Modal Close Listeners
  this.closeModalListen = function(button) {
    var modalFooter = button.parentElement;
    var modalContent = modalFooter.parentElement;
    var modalElement = modalContent.parentElement;
    var backdrop = document.getElementById("modal-backdrop");
    this.closeModal(modalElement, backdrop);
  }

  // Open Modal
  this.openModal = function(button) {
    var button = button;
    var modal = button.getAttribute("data-modal");
    var modalElement = document.getElementById(modal);
    var backdrop = document.createElement('div');
    backdrop.id="modal-backdrop";
    backdrop.classList.add("modal-backdrop");
    document.body.appendChild(backdrop);
    var backdrop = document.getElementById("modal-backdrop");
    backdrop.className += " modal-open";
    modalElement.className += " modal-open";
  }

  // Close Modal
  this.closeModal = function(modalElement, backdrop) {
    modalElement.className = modalElement.className.replace(/\bmodal-open\b/, '');
    backdrop.className = backdrop.className.replace(/\bmodal-open\b/, '');
  }

  // Initialise Function
  this.init = function () {
    // Create Events for creating the modals
    if (document.addEventListener) {
        document.addEventListener("click", this.handleClick, false);
    }
    else if (document.attachEvent) {
        document.attachEvent("onclick", this.handleClick);
    }
  }

  // Handle Button Click
  this.handleClick = function(event) {
    var thisModal = this;
      event = event || window.event;
      event.target = event.target || event.srcElement;
      var element = event.target;
      while (element) {
          if (element.nodeName === "BUTTON" && /akela/.test(element.className)) {
              thisModal.openModal(element);
              break;
          } else if (element.nodeName === "BUTTON" && /close/.test(element.className)) {
              thisModal.closeModalListen(element);
              break;
          } else if (element.nodeName === "DIV" && /close/.test(element.className)) {
              thisModal.closeModalListen(element);
              break;
          }
          element = element.parentNode;
      }
  }
}

// Initalise Modal Engine
var akelaModel = new modal();
akelaModel.init();

我希望用纯js而不是jquery来解决这个问题。

最佳答案

您需要先将函数绑定(bind)到对象,然后再将其作为事件监听器:

document.addEventListener("click", this.handleClick.bind(this), false);

document.attachEvent("onclick", this.handleClick.bind(this));

否则,它将与其原始对象分离,并且不具有预期的 this

关于javascript - 'this.function' 不是一个函数 - OO JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43022556/

相关文章:

javascript - Angular 2中的属性指令@Input别名

javascript - 如何将流、 promise 和管道一起编写单元测试?

javascript - 使用 JSON 将 Javascript 对象发送到 Python Flask 时出错

javascript - 上传带有进度百分比的 angularjs 文件

javascript - 使用 Div 创建网格以制作流动的图像画廊

javascript - interact.js SVG rect 捕捉到带边距的 div

javascript - 需要图像按钮方面的帮助

javascript - chrome 扩展 chrome.storage 如何同时进行大量获取和设置并避免竞争条件?

javascript - 隐藏输入需要文本

javascript - 如何在不弹出的情况下使用带有 create-react-app 的 Webpack Module Federation 插件