2015-10-20 3 views
0

Я использую следующий надрез на Javascript от другого SO ответа:Попытки получить доступ к переменным вне функции в Javascript

var _URL = window.URL || window.webkitURL; 
$("#file").change(function (e) { 
    var file, img; 
    if ((file = this.files[0])) { 
     img = new Image(); 
     img.onload = function() { 
      alert(this.width + " " + this.height); 
     }; 
     img.src = _URL.createObjectURL(file); 
    } 
}); 

Я не могу понять, как получить доступ к этим this.width и this.height переменного вне функции. Я установил их равными существующим переменным, а переменные всегда равны 0 или null.

+0

Снаружи, где? Они не будут давать вам нужные значения, пока изображение не будет загружено, следовательно, обработчик 'onload', и я уверен, что вам нужно добавить изображение в DOM для его загрузки. –

+0

создайте «глобальную переменную» и присвойте этому 'this.width' и' this.height'. : P –

+0

'this' относится к загружаемому объекту изображения. функция «onload» выполняется асинхронно. –

ответ

3

Его не очень полезно просто сделать их доступными вне функции, так как вы никогда не узнаете, что произошло. Вы хотите обратный вызов, который будет использовать эти значения в соответствующее время.

var _URL = window.URL || window.webkitURL; 
$("#file").change(function (e) { 
    var file, img; 
    if ((file = this.files[0])) { 
     img = new Image(); 
     img.onload = function() { 
      someCallback(this.width, this.height); 
     }; 
     img.src = _URL.createObjectURL(file); 
    } 
}); 

function someCallback (width, height) { 
    // use those values 
} 

Да, вы можете использовать глобальную переменную, но снова я указываю вы не будете знать, когда эти значения были заселены и может в конечном итоге с проблемами в вашем коде.

+3

также, если в итоге вы получите массу значений, которые вы собираетесь передать на обратный вызов, просто сделайте их объект и передать объект. значения = {ширина: this.width, высота: это.height} и т.п. –

+1

это отлично работает! Спасибо! – dmikester1

+0

@ dmikester1, вы очень желанны! – AtheistP3ace

0

Вы также можете сделать что-то вроде этого

var _URL = window.URL || window.webkitURL; 
var width=""; 
var height=""; 
$("#file").change(function (e) { 
    var file, img; 
    if ((file = this.files[0])) { 
     img = new Image(); 
     img.onload = function() { 
      width=this.width; 
      height=this.height; 
     }; 
     img.src = _URL.createObjectURL(file); 
    } 
}); 

Теперь вы можете использовать height и width переменные из стороны вашего события изменения. теперь эти обе переменные являются глобальными переменными

+0

Я пробовал делать это, и ширина и высота всегда были 0/null/blank. – dmikester1

+0

@ dmikester1, пожалуйста, перейдите по этим ссылкам http://stackoverflow.com/a/4862268/2798643 и http://stackoverflow.com/a/5786899/2798643, это может быть полезно для вас. –

Смежные вопросы