2011-11-23 101 views
0

我正在通过创建脚本标签来动态加载js,我已经在脚本加载中编写了回调函数,但是当js被加载后调用函数时, t访问我的对象属性,当我在萤火虫中检查它的值是缺失的。下面是我的代码,请回答我的代码中有什么问题,或者是否有其他方法来做同样的事情。在javascript回调函数中没有获取现有对象属性的值

obj = { 
    cont: null,  
    create:function(){ 
     this.cont = document.createElement('iframe'); 
     this.cont.style.setProperty('background-color', '#FFFFFF', 'important'); 
     this.getJs(); 
    }, 

getJs:function(){ 
    var oHead = document.getElementsByTagName('head')[0]; 
    var oScript = document.createElement('script'); 
    oScript.type = 'text/javascript'; 
    oScript.src = 'myjs.js'; 

    oScript.onload = obj.show;//most browsers 

    oScript.onreadystatechange = function() {// IE 6 & 7 
     if (this.readyState == 'complete') { 
      obj.show(); 
     } 
    } 
    oHead.appendChild(oScript);   
}, 

show:function(){ 
    alert(this.cont);//this.cont is not available when js load and show function get called as a 
} }obj.create(); 
+0

您可以设置事件功能的范围。看到这个问题http://stackoverflow.com/questions/183214/javascript-callback-scope – PiTheNumber

回答

2

oScript.onload = obj.show;//most browsers 

没有通过上下文(obj)到show功能。你需要作出关闭像

oScript.onload = function() { obj.show() } 

或使用bind如果你的目标浏览器支持:

oScript.onload = obj.show.bind(obj) 

大多数JS框架也包括bind或类似的功能。

+0

谢谢你的回答,它与“oScript.onload = function(){obj.show()}”但它是当我使用this.show()而不是obj.show()为什么它不工作? –

+1

基本上,当你使用一个函数作为一个事件监听器时,当这个函数被调用时'this'被动态绑定到'window'。所以在包含'this.show()'的函数中,这实际上是'window'而不是'obj'。 –

1

问题是this是动态范围的。我认为这应该工作:

oScript.onload = function() {obj.show()}; 
+0

谢谢你的回答,我的代码现在正在工作。 –

相关问题