JavaScript / jQuery verificar links quebrados

Eu desenvolvi um pequeno programa Javascript / jQuery para acessar uma coleção de arquivos pdf para uso interno. E eu queria que a informação div de um arquivo pdf fosse destacada se o arquivo realmente existisse.

Existe uma maneira de determinar programaticamente se um link para um arquivo está quebrado? Se sim, como?

Qualquer guia ou sugestão é apropriada.

Se os arquivos estiverem no mesmo domínio, você poderá usar o AJAX para testar sua existência, como disse Alex Sexton ; no entanto, você não deve usar o método GET , apenas HEAD e, em seguida, verificar o status HTTP para o valor esperado (200 ou apenas menos de 400).

Aqui está um método simples fornecido a partir de uma questão relacionada :

 function urlExists(url, callback) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function() { if (xhr.readyState === 4) { callback(xhr.status < 400); } }; xhr.open('HEAD', url); xhr.send(); } urlExists(someUrl, function(exists) { console.log('"%s" exists?', someUrl, exists); }); 

O problema é que o JavaScript tem a mesma política de origem, portanto, você não pode pegar o conteúdo de outro domínio. Isso não mudará se você fizer um upvoting (perguntando sobre os 17 votos). Eu acho que você precisa disso para links externos, então é impossível apenas com .js …

Se os arquivos não estiverem em um site externo, você pode tentar fazer uma solicitação de ajax para cada arquivo. Se voltar como uma falha, então você sabe que ela não existe, caso contrário, se ela for concluída e / ou demorar mais do que um determinado limite para retornar, você pode imaginar que ela existe. Nem sempre é perfeito, mas geralmente as solicitações de ‘filenotfound’ são rápidas.

 var threshold = 500, successFunc = function(){ console.log('It exists!'); }; var myXHR = $.ajax({ url: $('#checkme').attr('href'), type: 'text', method: 'get', error: function() { console.log('file does not exist'); }, success: successFunc }); setTimeout(function(){ myXHR.abort(); successFunc(); }, threshold); 

Como Sebastian diz que não é possível devido à mesma política de origem. Se o site puder ser publicado (temporariamente) em um domínio público, você poderá usar um dos serviços de verificador de links existentes. Eu estou por trás do checkerr.org

Você pode $.ajax para isso. Se o arquivo não existir, você receberá um erro 404 e, em seguida, poderá fazer o que for necessário (na interface com o usuário) no retorno de chamada de erro. Cabe a você como acionar a solicitação (timer?). Claro que, se você também tiver a capacidade de fazer alguma codificação do lado do servidor, poderá fazer uma única solicitação AJAX – varrer o diretório e retornar os resultados, como diz o JSON.