用过的Java功能对象原型包装在DomContent中定义的IIFE中

时间:2019-03-03 07:33:59

标签: javascript dom dom-events iife

我定义了一个IIFE,并在其中定义了功能对象及其原型,并用DomContentLoaded包装了它,但是我无法在html中使用它。以下是js文件中的代码:

const DomLoad = (function(){
function ChangeData() {
    this.active = 'blue-color';
}
ChangeData.prototype.change = function(imagename, idname, colorname) {
    document.getElementById(this.active).classList.remove("active");
    this.active = idname;
    document.getElementById(this.active).className += " active";   
    document.getElementById("text").innerHTML = colorname;            
    document.getElementById("carimage").src='assets/'+imagename+'.jpg';
};     
var changedata = new ChangeData();})();document.addEventListener("DOMContentLoaded", DomLoad);

以下是HTML文件中的代码:

<div class="color-circle" id="grey-color" onclick="changedata.change('grey','grey-color', 'Grey')"></div>

出现错误:

  

TypeError:changedata未定义

4 个答案:

答案 0 :(得分:0)

您正在IIFE中定义和初始化changedata,并且您知道使用var在函数内部声明的变量仅作用于该函数,并且在该函数外部不可见。

因此,当您var changedata = new ChangeData();在IIFE中执行此操作时,它在全局上下文中不可见,因此您将获得TypeError: changedata is undefined

还有一个问题是,您将执行IIFE的结果分配给DomLoad的{​​{1}},因为您未返回任何内容,实际上它应该是函数引用本身。

答案 1 :(得分:0)

您正在尝试访问超出范围的变量。您可以创建各种getter,然后调用该getter以访问IIFE内部的“ private”变量。像这样:

return {
  getChangedata: function() {
    return changedata;
  }
}

IIFE结束时可能会起作用。

然后您可以使用change访问DomLoad.getChangedata().change()方法。

答案 2 :(得分:0)

这对我有用

"use Strict";
(function(global){
function ChangeData() {
    this.active = 'blue-color';
}

ChangeData.prototype.change = function(imagename, idname, colorname) {
    document.getElementById(this.active).classList.remove("active");
    this.active = idname;
    document.getElementById(this.active).className += " active";   
    document.getElementById("text").innerHTML = colorname;            
    document.getElementById("carimage").src='assets/'+imagename+'.jpg';
};     

global.changedata = new ChangeData();
document.addEventListener("DOMContentLoaded", ChangeData,false);
})(window);    

答案 3 :(得分:0)

您的IIFE不返回任何内容,因此DomLoadundefinedchangeData也是IIFE中的局部变量,不能从内联事件处理程序中访问。你应该要么做

const changedata = (function(){
    function ChangeData() {
        this.active = 'blue-color';
    }
    ChangeData.prototype.change = function(imagename, idname, colorname) {
        document.getElementById(this.active).classList.remove("active");
        this.active = idname;
        document.getElementById(this.active).className += " active";   
        document.getElementById("text").innerHTML = colorname;            
        document.getElementById("carimage").src='assets/'+imagename+'.jpg';
    };     
    return new ChangeData();
});

<div class="color-circle" id="grey-color" onclick="changedata.change('grey','grey-color', 'Grey')"></div>

function DomLoad(){
    function ChangeData() {
        this.active = 'blue-color';
    }
    ChangeData.prototype.change = function(imagename, idname, colorname) {
        document.getElementById(this.active).classList.remove("active");
        this.active = idname;
        document.getElementById(this.active).className += " active";   
        document.getElementById("text").innerHTML = colorname;            
        document.getElementById("carimage").src='assets/'+imagename+'.jpg';
    };     
    const changedata = new ChangeData();
    document.getElementById("grey-color").addEventListener("click", function(event) {
        changedata.change('grey','grey-color', 'Grey');
    });
}
document.addEventListener("DOMContentLoaded", DomLoad);

<div class="color-circle" id="grey-color"></div>