【问题标题】:Angular js - isImage( ) - check if it's image by urlAngular js - isImage() - 通过 url 检查它是否是图像
【发布时间】:2014-04-20 19:26:39
【问题描述】:

是否可以通过给定的 url 检查图像是否存在并且它是图像资源?

例如:

angular.isImage('http://asd.com/asd/asd.jpg')

或者它只是服务器端的东西?

NO JQUERY,请我不使用它

【问题讨论】:

    标签: javascript angularjs image


    【解决方案1】:

    您可以使用ng-src

    <img ng-src="" />
    

    另一种方法是使用http 模块检查它是否存在。

    var app = angular.module('myapp', []).run(function($http){
      $http.get('http://asd.com/asd/asd.jpg',
        //success
        function(data){
    
        };
    });
    

    更新:

    HTML

    <div ng-controller="Ctrl">
           <img ng-src="{{src}}" isImage />
    </div>
    

    JS

    var app = angular.module('app', []);
    
    app.directive('isImage', function() {
        return {
            restrict: 'A',
            link: function(scope, element, attrs) {
                element.bind('load', function() {
                    alert('image is loaded');
                });
            }
        };
    });
    
    app.controller('Ctrl', function($scope) {
        $scope.src ="http://asd.com/asd/asd.jpg";
    });
    

    【讨论】:

    • 对不起,我忘了说明我不使用 jQuery :) 我也一样,谢谢
    • @sbaaaang:我还提到了使用 ng-src 属性的 Angular 方式,另一种方式是通过您在线程中已经提到的服务器端进行检查
    • 我没有 -1,实际上我给了你 +1,但请删除 jquery 部分,如果可以请指定如何使用 ng-src 可能很棒!非常感谢
    • @sbaaaang: dfsq 给出了一个更好的答案,如果它是一个指令,我会喜欢的。
    • 对于那些有同样问题的人,这是使用指令的一个很酷的答案。测试完美。 stackoverflow.com/a/17122325/2689390
    【解决方案2】:

    我认为最好的 javascript 方法是将 HTMLImageElement 对象与延迟对象一起使用:

    function isImage(src) {
    
        var deferred = $q.defer();
    
        var image = new Image();
        image.onerror = function() {
            deferred.resolve(false);
        };
        image.onload = function() {
            deferred.resolve(true);
        };
        image.src = src;
    
        return deferred.promise;
    }
    

    用法:

    isImage('http://asd.com/asd/asd.jpg').then(function(test) {
        console.log(test);
    });
    

    使用HTMLImageElement给你带来一些好处:它不仅测试文件是否可下载,而且它是可以通过img标签显示的有效图片资源。

    我将此代码包装在简单的服务中以进行测试,它似乎可以工作:

    app.controller('MainCtrl', function($scope, Utils) {
        $scope.test = function() {
            Utils.isImage($scope.source).then(function(result) {
                $scope.result = result;
            });
        };
    });
    
    app.factory('Utils', function($q) {
        return {
            isImage: function(src) {
                // ... above code for isImage function
            }
        };
    });
    

    演示:http://plnkr.co/edit/u5F6FfO3dEkNSMYV1amo?p=preview

    【讨论】:

    • @dfsq 你isImage()有错字;在onerroronload 中都使用resolve()。第一个应该是reject()。除此之外,整洁的解决方案。
    • @ThalisK。这不是错字,我故意解决(使用false 标志)以防图像不可用,我觉得这不是特殊情况,所以解决更好。另外,对于这个功能,为了设置正确的标志$scope.result = result;,同时拥有成功和错误处理程序并不方便。
    • @dfsq 是的,在你的情况下它没有意义。我被你的回答误导了,承诺拒绝回调与成功回调的工作不同,并且没有被调用。一切都清楚。
    • 对于那些不知道$q 是什么的人,请参阅:docs.angularjs.org/api/ng/service/$q
    • 我相信这会导致 chrome 内存泄漏。您检查的每个图像都将创建一个新的 Image() 对象,并且此引用可以保留。见stackoverflow.com/questions/21309760/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2011-01-17
    相关资源
    最近更新 更多