this._best()不是函数类型错误

时间:2016-01-23 23:26:37

标签: jquery image svg onload event-listener

我试图在成功加载图像后调用函数this._best(),但是我收到了类型错误。 this._best()是一个函数,因为我在许多不同的地方使用它并且它正在工作。只要我把它放在javascript中的onload事件中,就会显示typeError或referenceError。

我希望在实际加载图像后获取图像的高度和宽度,然后在获得这两个值后调用_best()函数。

我尝试了很多方法,包括:

this.svg.onload = function() {
            this.svg.addEventListener('load', function() { 
                this._W = jQuery(".Image").width();
                this._H = jQuery(".Image").height();
                this._best();
            });
}.bind(this);

this.svg.addEventListener('load', function() {
                this._W = jQuery(".Image").width();
                this._H = jQuery(".Image").height();
                this._best();
            });

我设置断点以查看断点,并且在调用_best()时始终显示错误

我还尝试使用警报进行测试:

this.svg.onload = function() {
            this.svg.addEventListener('load', function() { alert('loaded');    });
            this._W = jQuery(".Image").width();
            this._H = jQuery(".Image").height();
            this._best();
        }.bind(this);

这成功地称为_best();并在成功加载图像后显示警报。但我仍然只想获取宽度和高度的值,并在加载图像后调用_best()。

在这种情况下,我第一次加载图像时得到的宽度和高度值不正确,因为chrome没有正确加载图像但如果我再次加载它从缓存中获取值,它似乎工作因此为什么我想要从事件中获取宽度和高度。

在init函数中我有:      this.canvas = document.createElement(“div”);

我的职能:

        this.svg = document.createElement("object");
        this.svg.setAttribute("type","image/svg+xml");
        this.svg.setAttribute("data",url);
        this.svg.setAttribute("class", "Image");
        this.canvas.appendChild(this.svg);

        this.svg.onload = function() {
             this.svg.addEventListener('load', function() { 
                this._W = jQuery(".Image").width();
                this._H = jQuery(".Image").height();
             }.bind(this);
        this._best();
        }.bind(this);

和_best()函数类似于:

    function _best() {
      var a = this.canvas.clientWidth / this._W;
      var b = this.canvas.clientHeight / this._H;
    }

最佳拟合用于使图像居中。我在其他情况下使用此功能,所以这是有效的,但在这种情况下,当我加载第一次_H和_W不同于我第二次加载它。我猜chrome实际上并没有完全加载图像,直到我第二次点击加载图像。

如何在加载图像时获得_W和_H(就像我得到的第二个加载值一样),如果在onload上检索这两个值,我怎样才能调用_best()?

1 个答案:

答案 0 :(得分:1)

您还需要bind(this) addEventListener,因为它会创建另一个关闭。

所以

this.svg = document.createElement("object");
this.svg.setAttribute("type","image/svg+xml");
this.svg.setAttribute("data",url);
this.svg.setAttribute("class", "SVGImage");
this.canvas.appendChild(this.svg);

this.svg.onload = function() {
    this._W = jQuery(".SVGImage").width();
    this._H = jQuery(".SVGImage").height();
    this._best();
}.bind(this);

我还要将_best定义为

this._best = function () {
  var a = this.canvas.clientWidth / this._W;
  var b = this.canvas.clientHeight / this._H;
}.bind(this);