【问题标题】:Is this a valid test to check if a URL refers to an Image in JS/jQuery这是检查 URL 是否引用 JS/jQuery 中的图像的有效测试吗
【发布时间】:2011-01-12 22:48:02
【问题描述】:
$(function() {
    $("<img>", {
        src: "http://goo.gl/GWtGo",
        error: function() { alert("error!"); },
        load: function() { alert("ok"); }
    });
});

灵感来自How can I test if a URL is a valid image (in javascript)?

更新

下一步将是:如何将这个逻辑封装到一个函数中。我试过这个 -> http://jsfiddle.net/wp7Ed/2/

$(function() {
    function IsValidImageUrl(url) {
        $("<img>", {
            src: url,
            error: function() { return false; },
            load: function() { return true; }
        });
    }
    alert(IsValidImageUrl("http://goo.gl/GWtGo"));
    alert(IsValidImageUrl("http://error"));
});

但它当然会失败......我如何从内部事件处理程序返回?或者我该如何实现?

【问题讨论】:

标签: javascript jquery


【解决方案1】:

您永远无法在 javascript 中将异步调用转换为同步调用。

errorload 是异步事件,所以你必须这样做:

function IsValidImageUrl(url) {
    $("<img>", {
        src: url,
        error: function() { alert(url + ': ' + false); },
        load: function() { alert(url + ': ' + true); }
    });
}

IsValidImageUrl("http://goo.gl/GWtGo");
IsValidImageUrl("http://error");

或者您可以在其他地方定义的回调函数中解析,如下所示:

function myCallback(url, answer) {
    alert(url + ': ' + answer);
}

function IsValidImageUrl(url,callback) {
    $("<img>", {
        src: url,
        error: function() { callback(url, false); },
        load: function() { callback(url, true); }
    });
}

IsValidImageUrl("http://goo.gl/GWtGo", myCallback);
IsValidImageUrl("http://error", myCallback);

干净和高性能的版本像这样跳过了 jQuery 开销

function myCallback(url, answer) {
    alert(url + ': ' + answer);
}

function IsValidImageUrl(url, callback) {
    var img = new Image();
    img.onerror = function() { callback(url, false); }
    img.onload =  function() { callback(url, true); }
    img.src = url
}

IsValidImageUrl("http://goo.gl/GWtGo", myCallback);
IsValidImageUrl("http://error", myCallback);

【讨论】:

  • +1 是一个很好的答案,但是您需要在 jQuery 版本中将回调参数添加到 IsValidImageUrl 调用中。
  • 感谢您的注意,。已添加回调
  • 谢谢,但如果我需要验证用户输入?我怎样才能做到这一点?我需要知道我提交的表格是否有效 b4。你会怎么做?我将使用 jQuery Validate,但现在一个简单的例子就可以了
  • 您可以禁用提交按钮,直到检查完成。然后可以通过连接到用户输入图像 URL 的文本字段的 onchange 事件来完成检查(如果是这样的话) - 这完全取决于您的解决方案,总是有许多不同的方法可以达到相同的目标,通常约束是您已经拥有并且不愿意更改的代码。
  • 我发现它会在检查 url 是否确实是图像之前加载文件的很大一部分,例如,在检测到它不是图像之前,几乎完全下载了大型 mp4:/
【解决方案2】:

我认为是的,因为当图像未找到时会触发error 事件。与您的代码一样,如果未找到图像(意味着图像的路径无效),警报将显示消息 error!

这是另一个版本的外观:

$('#imgID').error(function(){
  alert('image not found !');
});

如果找不到之前指定的图像,您还可以更改图像的路径:

$('#imgID').error(function(){
   this.src = 'new path to some image';
});

【讨论】:

  • 谢谢,我想做一些更现实的事情并将逻辑封装到一个函数中,如何从处理程序返回? jsfiddle.net/wp7Ed/2
猜你喜欢
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 2014-04-20
相关资源
最近更新 更多