我是javascript对象的新手,我有一个问题。我正在尝试制作一个图片库,但我一直收到一个错误,即.current,this.size& this.initial是未定义的,因此脚本无法工作。请帮我解决这个错误。以下是完整的脚本。
function gallery()
{
this.image = new Array(10);
this.initial = 1;
this.current = 0;
this.size = 10;
this.frame_height = 400;
this.frame_width = 600;
this.initialize=function()
{
if(document.images)
{
var count = 1;
for(count=1;count<=this.size;count++)
{
this.image[count] = new Image();
this.image[count].src = 'images/'+count+'.jpg';
}
}
divImg.id = "divImg";
divImg.setAttribute("Width",this.frame_width);
divImg.setAttribute("align","center");
divImg.setAttribute("margin","0px auto");
divBtn.id = "divBtn";
divBtn.setAttribute("align","center");
divBtn.setAttribute("backgroung-color","Black");
divBtn.setAttribute("color","White");
divBtn.style.margin = "0px auto";
divBtn.className ="btn";
pictureFrame.src = this.image[this.initial].src;
pictureFrame.setAttribute('Width',this.frame_width);
pictureFrame.setAttribute('Height',this.frame_height);
pictureFrame.name = 'img';
btnNext.innerHTML='NEXT';
btnPrevious.innerHTML='PREVIOUS';
btnLast.innerHTML='LAST';
btnFirst.innerHTML='FIRST';
btnFirst.onclick=this.first;
btnLast.onclick=this.last;
btnPrevious.onclick=this.previous;
btnNext.onclick=this.next;
myForm.appendChild(pictureFrame);
divImg.appendChild(myForm);
divBtn.appendChild(btnFirst);
divBtn.appendChild(btnPrevious);
divBtn.appendChild(btnNext);
divBtn.appendChild(btnLast);
pageBody.appendChild(divImg);
pageBody.appendChild(divBtn);
headerTag.appendChild(pageBody);
}
this.next=function()
{
alert(this.size);
alert(this.current);
if (this.current < this.size)
{
this.current +=1;
pictureFrame.src = this.image[this.current].src;
}
else
{
alert("This is the last image");
}
}
this.previous=function()
{
alert(this.current);
alert(this.initial);
if (this.current > this.initial)
{
this.current = this.current-1;
pictureFrame.src = this.image[this.current].src;
}
else
{
alert("This is the first image");
}
}
this.first=function()
{
this.current=this.initial;
pictureFrame.src = this.image[this.current].src;
}
this.last=function()
{
alert(this.size);
this.current=this.size;
pictureFrame.src = this.image[this.current].src;
}
};
var divImg= document.createElement('div');
var divBtn = document.createElement('div');
var btnFirst= document.createElement('button');
var btnNext= document.createElement('button');
var btnPrevious= document.createElement('button');
var btnLast= document.createElement('button');
var divTop = document.createElement('div');
var headerTag = document.getElementsByTagName('html')[0];
var pageBody = document.createElement('body');
var myForm=document.createElement("form");
var pictureFrame = document.createElement('img');
var pics=new gallery();
window.onload=pics.initialize();
答案 0 :(得分:1)
您正在使超出范围失败,这对于不熟悉ECMAscript的人来说非常常见。
每个函数都有自己的执行上下文,ECMA- / Javascript中的每个上下文都有自己的this
上下文变量。为了避免这种情况,最常见的方法是在局部变量中存储对“外部”this
上下文变量的引用:
function gallery()
{
this.image = new Array(10);
this.initial = 1;
this.current = 0;
this.size = 10;
this.frame_height = 400;
this.frame_width = 600;
var self = this;
//...
this.initialize=function()
{
if(document.images)
{
var count = 1;
for(count=1;count<=self.size;count++)
{
self.image[count] = new Image();
self.image[count].src = 'images/'+count+'.jpg';
}
}
// ...
这将适用于每个Javascript环境。与此同时,在ECMA中有“更好”(其他)方法来避免这个问题。例如,ECMAscript Edition 5引入了.bind()
方法,它允许您将this context variable
的引用“绑定”到您选择的对象。许多javascript框架提供了一种非常类似的方法将this
绑定到一个对象,甚至Javascript本身也可以让你轻松地完成它。
答案 1 :(得分:1)
jAndy说的是正确的,当window
对象调用pics.initialise
时,this
引用window
(this
指的是函数的调用者,除非该函数是匿名的。)
但是,您可能更喜欢更简单的解决方案:
而不是
var pics = new gallery();
window.onload = pics.initialize;
你可以这样做:
var pics = new gallery();
window.onload = function() {
pics.initialize();
};
因为它包含在匿名函数中,this
将引用gallery
实例,而不是window
。
jAndy的建议肯定更强大,但对于仍在使用Javascript的人来说可能有点困难。