从原型 dom 加载事件内部创建全局对象

Create global Object from inside Prototype dom loaded event

提问人:Stephan Kristyn 提问时间:7/28/2010 最后编辑:Brian Tompsett - 汤莱恩Stephan Kristyn 更新时间:7/21/2019 访问量:993

问:

我想创建一个在 DOM 加载后可全局访问的对象。我的方法是使用原型dom:loaded事件并实例化对象。

JavaScript 代码:

document.observe("dom:loaded", function() {

    var globalPAO = new picArrayObject();
    alert(globalPAO.picArray[0]); // alerts [object HTMLDivElement]
});

var picArrayObject = function () {

    var myPic1 = document.getElementById('pic1');
    var myPic2 = document.getElementById('pic2');
    var myPic3 = document.getElementById('pic3');

    function construct() {
        this.picArray = [myPic1,myPic2,myPic3];
    }

return new construct();
}

myTrigger.onClick = function () {

    alert(globalPAO.picArray[0]); // alerts nothing
}

亲自试一试:http://jsfiddle.net/vEGXH/2

javascript oop prototypejs dom-events unobtrusive-javascript

评论


答:

0赞 Felix Kling 7/28/2010 #1

我看到的三件事:

  1. 您必须在处理程序中分配单击处理程序,否则具有 ID 的元素可能尚不存在(实际上,这是 Safari 错误控制台中显示的错误:"dom:loaded"trigger

    TypeError:表达式“myTrigger”[null] 的结果不是对象。

    ).

  2. 使用似乎过于复杂。return new construct()

  3. var globalPAO创建一个局部变量。如果省略,则创建一个全局的。var

改进的示例:

document.observe("dom:loaded", function() {

    globalPAO = new picArrayObject();
    alert(globalPAO.picArray[0]); // alerts [object HTMLDivElement]

    var myTrigger = document.getElementById('trigger');
    myTrigger.onclick = function () {
        alert(globalPAO.picArray[0]); // alerts object HTMLDivElement]
    }
});

var picArrayObject = function () {

    var myPic1 = document.getElementById('pic1');
    var myPic2 = document.getElementById('pic2');
    var myPic3 = document.getElementById('pic3');

    this.picArray = [myPic1,myPic2,myPic3];
}

亲自试一试:http://jsfiddle.net/vEGXH/4/

评论

0赞 Stephan Kristyn 7/28/2010
1.) 我在 ver.2 小提琴 2 中修复了它。关闭应该使 VAR 成为私有的,你不是这样做的吗?见 3.ly/G9PQ 3。这成功了,谢谢!
0赞 Felix Kling 7/28/2010
@Stephan:是的,它使变量私有化。不知道这是意图;)我不知道有没有更好的办法。
0赞 Serkan Yersen 7/30/2010 #2

为什么不把它放在窗户里呢?

例如,您可以将其用作脚本中的任何位置window.globalPAO = new picArrayObject();globalPAO