在下面的代码中,我试图加载一些图像,并在它们单独加载后立即将它们放入舞台.但它被窃听,因为只显示最后一张图像.我怀疑这是一个关闭问题.我该如何解决?AS3中的闭包行为与Java Script中的行为不一样吗?
var imageList:Array = new Array();
imageList.push({'src':'image1.jpg'});
imageList.push({'src':'image2.jpg'});
var imagePanel:MovieClip = new MovieClip();
this.addChildAt(imagePanel, 0);
for (var i in imageList) {
var imageData = imageList[i];
imageData.loader = new Loader();
imageData.loader.contentLoaderInfo.addEventListener(
Event.COMPLETE,
function() {
imagePanel.addChild(imageData.loader.content as Bitmap);
trace('Completed: ' + imageData.src);
});
trace('Starting: ' + imageData.src);
imageData.loader.load(new URLRequest(imageData.src));
}
Run Code Online (Sandbox Code Playgroud) Html实体必须在HTML页面中的图像的alt属性中进行编码.所以
<img id="formula" alt="A → B" src="formula.png" />
Run Code Online (Sandbox Code Playgroud)
会运作良好.
另一方面,相同的JavaScript代码将无法使用
document.getElementById('formula').alt = 'A → B';
Run Code Online (Sandbox Code Playgroud)
并将产生A→ B而不是A→B.
当无法在源代码中放入特殊(未编码)字符时,如何通过JavaScript实现?
我在Javascript中的事件处理程序中遇到以下问题.我有一个像这样有一个mousemove事件处理程序的对象.
function MyObject(){ }
function MyObject.prototype = {
currentMousePosition: null,
onMouseMove: function(ev){
this.currentMousePosition = this.getCoordinates(ev);
},
getCoordinates: function(ev){
if (ev.pageX || ev.pageY)
return { x: ev.pageX, y: ev.pageY };
return { x: ev.clientX + document.body.scrollLeft - document.body.clientLeft, y: ev.clientY + document.body.scrollTop - document.body.clientTop };
}
};
Run Code Online (Sandbox Code Playgroud)
我试图解决的问题解决了对象上下文.在我的onMouseMove函数中,它分配currentMousePosition属性.当然这不起作用,因为它是处理mousemove事件的静态函数.
我正在寻找的是一种使用我的事件处理程序传递对象上下文的技术/方法.我能想到的最好的例子是Google Maps API函数GEvent.bind()有了它,您可以使用要在指定事件上触发的函数传递对象.我基本上都在寻找同样的东西.
这让我感兴趣的纯粹是研究和个人发展.我有一组命名空间的函数/变量.
在1个函数中我需要通过setTimeout调用另一个函数但是将范围保持为'this'.我正在努力解决这个问题,似乎无法在setTimeout运行时绑定它.
var foo = {
ads: ["foo","bar"],
timeDelay: 3,
loadAds: function() {
var al = this.ads.length;
if (!al)
return; // no ads
for(var i = 0; i < al; i++) {
setTimeout(function() {
this.scrollAd(this.ads[i]);
}.apply(this), this.timeDelay * 1000);
}
},
scrollAd: function(adBlock) {
console.log(adBlock);
}
};
};
Run Code Online (Sandbox Code Playgroud)
.apply(this)DOES更改范围,因为console.log输出正确的对象,但它会立即运行该函数,然后在回调保持为空时出现异常/警告:
useless setTimeout call (missing quotes around argument?)
Run Code Online (Sandbox Code Playgroud)
这样做有一种优雅的方式吗?我知道我能做到
var _this = this;
Run Code Online (Sandbox Code Playgroud)
并_this在anon回调中引用.例如,在mootools我会用.bind(this)...
不,因为这涉及动画,我不想" "在字符串周围使用,因为它需要进行评估并会影响性能......
如果我有一大堆这样的代码:
.hover(
function () {
hoverState($("#navbar a").index(this),1);
},
function () {
hoverState($("#navbar a").index(this),-1);
});
Run Code Online (Sandbox Code Playgroud)
有没有办法摆脱匿名函数,只是说:
.hover(
hoverState($("#navbar a").index(this),1),
hoverState($("#navbar a").index(this),-1);
);
Run Code Online (Sandbox Code Playgroud)