初学javascript练习面向对象,写了个渣代码,效果很简陋,只是为了学习面向对象的一个简易例子而已。
麻烦各位帮我看看这段代码符合面向对象写法吗?谢谢各位了。
可以到这里 http://yqjun.tk/demo/showTshirt.html 看效果。
<!DOCTYPE html>
<html>
<head>
<title>鼠标跟随展示大图OOP练习</title>
<style type="text/css" media="screen">
/*global*/
body, div, ul, li, img {
margin: 0;
padding: 0;
}
ul {
list-style: none;
}
body {
position: relative;
}
/*-------------橱窗---------------*/
#showcase {
width: 800px;
margin: 10px auto;
}
#showcase ul {
overflow: hidden;
}
#showcase ul li {
float: left;
width: 170px;
height: 170px;
margin-right: 20px;
border: 3px solid #EEE;
}
/*-------------大图-------------*/
#goodsPic {
display: none;
position: absolute;
top: 0;
left: 0;
width: 400px;
height: 400px;
border: 3px solid #AAA;
}
</style>
<script type="text/javascript">
//全局函数——简化getElementById & getElementsByTagName(暂时,会和JQuery冲突)
function $(id) {
return document.getElementById(id);
}
function $$(tagName, parentID) {
return $(parentID).getElementsByTagName(tagName);
}
//构造方法
function Showcase(containerID, goodsPicBoxID) {
//属性
showcaseSelf = this; //本身,用于事件监听
this.goodsPreviewBox = $$("li", containerID); //获得预览图对象数组
this.goodsPicBox = $(goodsPicBoxID); //获得大图容器对象
this.goodsPic = $$("img", goodsPicBoxID)[0]; //获得大图image对象
this.goodsPicURL = new Array(); //获得大图URL数组
//方法
//添加大图url
Showcase.prototype.addGoods = function(goodsPicURL) {
this.goodsPicURL[this.goodsPicURL.length] = goodsPicURL;
}
//显示大图&随鼠标移动
Showcase.prototype.showGoodsPic = function(event, index) {
with(this.goodsPicBox.style) {
display = "block";
left = event.clientX + "px";
top = event.clientY + "px";
}
this.goodsPic.src = this.goodsPicURL[index];
}
//隐藏大图
Showcase.prototype.hideGoodsPic = function() {
this.goodsPicBox.style.display = "none";
this.goodsPic.src = "";
}
//“主”函数
Showcase.prototype.run = function() {
for (var i = 0; i < this.goodsPreviewBox.length; i++) {
this.goodsPreviewBox[i].index = i;
//移入显示
this.goodsPreviewBox[i].onmousemove = function(event) {
var event = event || window.event;
showcaseSelf.showGoodsPic(event, this.index);
}
//移出隐藏
this.goodsPreviewBox[i].onmouseout = function() {
showcaseSelf.hideGoodsPic();
}
}
}
}
window.onload = function() {
var myTshirt = new Showcase("showcase", "goodsPic");
myTshirt.addGoods("img/shirt_1_big.jpg");
myTshirt.addGoods("img/shirt_2_big.jpg");
myTshirt.addGoods("img/shirt_3_big.jpg");
myTshirt.addGoods("img/shirt_4_big.jpg");
myTshirt.run();
};
</script>
<head>
<body>
<div id="showcase">
<ul>
<li><img src="./img/shirt_1.jpg"></li>
<li><img src="./img/shirt_2.jpg"></li>
<li><img src="./img/shirt_3.jpg"></li>
<li><img src="./img/shirt_4.jpg"></li>
</ul>
<div id="goodsPic">
<img src="" />
</div>
</div>
</body>
</html>
Showcase.prototype.run = function(obj)
{
for(var i = 0; i < this.goodsPreviewBox.length; i++)
{
this.goodsPreviewBox[i].index = i;
//移入显示
this.goodsPreviewBox[i].onmousemove = function(event)
{
var event = event || window.event;
obj.showGoodsPic(event, this.index);
}
//移出隐藏
this.goodsPreviewBox[i].onmouseout = function()
{
obj.hideGoodsPic();
}
}
}
调用
myTshirt.run(myTshirt);
这样就没问题了。
在一个类里声明一个属性实例指向自己,感觉有点怪异,Java、C++里似乎没见过这样用的。这大概和javascript的实现有关,不过如果这样用更方便就这样用吧,呵呵。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。