Is it possible to check if by a given url the image exists and it's an image resource ?
for example:
angular.isImage('http://asd.com/asd/asd.jpg')
Or it's just a stuff for the server side ?
NO JQUERY please i'm not using it
I think the best javascript approach would be to use HTMLImageElement object with deferred object:
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;
}
Usage:
isImage('http://asd.com/asd/asd.jpg').then(function(test) {
console.log(test);
});
Using HTMLImageElement gives you some benefits: not only it tests that the file is downloadable but also it is valid image resource that can be displayed by img tag.
I wrapped this code in simple service to make a test and it seems to work:
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
}
};
});
isImage() has a typo; in both onerror and onload you use resolve(). First one should be reject(). Apart from that, neat solution.false flag) in case of image unavailability, it doesn't feel to me like exceptional situation, so resolve is better. Plus for this functionality it would not be convenient to have both success and error handlers just in order to set proper flag $scope.result = result;.$q is, see: docs.angularjs.org/api/ng/service/$qYou can use ng-src
<img ng-src="" />
Another way is you check if the it exists using the http module.
var app = angular.module('myapp', []).run(function($http){
$http.get('http://asd.com/asd/asd.jpg',
//success
function(data){
};
});
Update:
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";
});