Qual seria uma boa maneira de tentar carregar o jQuery hospedado no Google (ou em outras bibliotecas hospedadas pelo Google), mas carregar minha cópia do jQuery se a tentativa do Google falhar?
Não estou dizendo que o Google é esquisito. Há casos em que a cópia do Google é bloqueada (aparentemente no Irã, por exemplo).
Eu configuraria um timer e verificaria o objeto jQuery?
Qual seria o perigo das duas cópias aparecerem?
Na verdade, não estou procurando respostas como "basta usar o do Google" ou "apenas o seu". Eu entendo esses argumentos. Também entendo que é provável que o usuário tenha a versão do Google em cache. Estou pensando em fallbacks para a nuvem em geral.
Editar: Esta parte foi adicionada ...
Como o Google sugere o uso do google.load para carregar as bibliotecas ajax, e ele executa um retorno de chamada quando concluído, pergunto-me se essa é a chave para serializar esse problema.
Eu sei que parece um pouco louco. Só estou tentando descobrir se isso pode ser feito de maneira confiável ou não.
Atualização: o jQuery agora está hospedado na CDN da Microsoft.
fonte
Respostas:
Você pode conseguir assim:
Isso deve estar na sua página
<head>
e qualquer manipulador de eventos pronto para jQuery deve estar no<body>
para evitar erros (embora não seja à prova de idiotas!).Mais um motivo para não usar o jQuery hospedado pelo Google é que, em alguns países, o nome de domínio do Google é proibido.
fonte
A maneira mais fácil e limpa de fazer isso de longe:
fonte
XHTML 1.0
eHTML 4.01
type="text/javascript"
partes, de modo que as pessoas escrevendo html para navegadores mais antigos, nota que você vai agora ter de acrescentar que no.type="text/javascript"
também não era necessário em navegadores mais antigos, pois todos eram padronizados para Javascript. Navegadores realmente mais antigos examinaram olanguage
atributo; mas, mesmo assim, o Javascript era o padrão se o atributo estivesse ausente.<script src="//cdn1.com/jquery.js"></script> <script>window.jQuery || document.write('<script src="//cdn2.com/jquery.js"><\/script>')</script> <script>window.jQuery || document.write('<script src="local/jquery.js"><\/script>')</script>
Isso parece funcionar para mim:
A maneira como funciona é usar o
google
objeto carregado por http://www.google.com/jsapi nowindow
objeto. Se esse objeto não estiver presente, estamos assumindo que o acesso ao Google está falhando. Se for esse o caso, carregamos uma cópia local usandodocument.write
. (Neste caso, estou usando meu próprio servidor, use o seu próprio para testar isso).Eu também testo a presença de
window.google.load
- eu também poderiatypeof
verificar se as coisas são objetos ou funções, conforme apropriado. Mas acho que isso funciona.Aqui está apenas a lógica de carregamento, pois o destaque do código parece falhar desde que eu publiquei toda a página HTML que estava testando:
Embora eu deva dizer, não tenho certeza de que, se essa é uma preocupação para os visitantes do site, você deve estar brincando com a API de bibliotecas do Google AJAX .
Curiosidade : inicialmente tentei usar um bloco try..catch em várias versões, mas não consegui encontrar uma combinação tão limpa quanto essa. Eu estaria interessado em ver outras implementações dessa idéia, puramente como um exercício.
fonte
Se você possui o modernizr.js incorporado em seu site, pode usar o yepnope.js embutido para carregar seus scripts de forma assíncrona - entre outros jQuery (com fallback).
Isso carrega o jQuery do Google-cdn. Depois é verificado, se o jQuery foi carregado com sucesso. Caso contrário ("não"), a versão local é carregada. Além disso, seus scripts pessoais são carregados - o "both" indica que o processo de carregamento é iniado independentemente do resultado do teste.
Quando todos os processos de carregamento são concluídos, uma função é executada, no caso 'MyApp.init'.
Pessoalmente, prefiro esse modo de carregamento de script assíncrono. E como confio nos testes de recursos fornecidos pela modernizr ao criar um site, eu o incluo no site de qualquer maneira. Portanto, não há realmente sobrecarga.
fonte
yepnope.js
está obsoleta. Veja stackoverflow.com/questions/33986561/…Existem algumas ótimas soluções aqui, mas gostaria de dar um passo adiante em relação ao arquivo local.
Em um cenário em que o Google falha, ele deve carregar uma fonte local, mas talvez um arquivo físico no servidor não seja necessariamente a melhor opção. Eu trago isso à tona porque, no momento, estou implementando a mesma solução, apenas desejo retornar a um arquivo local que é gerado por uma fonte de dados.
Minhas razões para isso é que eu quero ter um pouco de mente quando se trata de acompanhar o que eu carrego do Google versus o que eu tenho no servidor local. Se eu quiser alterar as versões, manterá minha cópia local sincronizada com o que estou tentando carregar do Google. Em um ambiente em que há muitos desenvolvedores, acho que a melhor abordagem seria automatizar esse processo, para que tudo o que você precise fazer seja alterar um número de versão em um arquivo de configuração.
Aqui está a minha solução proposta que deve funcionar em teoria:
Em teoria, se meu código for escrito corretamente, tudo o que preciso fazer é alterar o número da versão na configuração do meu aplicativo e, em seguida, o viola! Você tem uma solução de fallback automatizada e não precisa manter arquivos físicos em seu servidor.
O que todos pensam? Talvez isso seja um exagero, mas poderia ser um método elegante de manter suas bibliotecas AJAX.
Bolota
fonte
Depois de tentar incluir a cópia do Google na CDN.
No HTML5, você não precisa definir o
type
atributo.Você também pode usar...
fonte
[Violation] Avoid using document.write().
Você pode usar seu arquivo local como último recurso.
Parece que agora o CDN do jQuery não suporta https. Se o fez, você pode querer carregar a partir daí primeiro.
Então, aqui está a sequência: Google CDN => Microsoft CDN => Sua cópia local.
fonte
Carregue condicionalmente a versão mais recente / herdada do jQuery e fallback:
fonte
jQuery
variável de verificação )Como verificar uma variável não definida em JavaScript
Como faço para incluir um arquivo JavaScript em outro arquivo JavaScript?
fonte
Por causa do problema de proibição do Google, prefiro usar o CDN da Microsoft, http://www.asp.net/ajaxlibrary/cdn.ashx
fonte
Aqui está uma ótima explicação sobre isso!
Também implementa atrasos no carregamento e tempos limite!
http://happyworm.com/blog/2010/01/28/a-simple-and-robust-cdn-failover-for-jquery-14-in-one-line/
fonte
Para as pessoas que usam o ASP.NET MVC 5, adicione esse código no seu BundleConfig.cs para ativar a CDN para jquery:
fonte
ATUALIZAÇÃO:
Esta resposta acabou errada. Por favor, veja os comentários para a explicação real.
A maioria de vocês já foi respondida, mas quanto à parte final:
Nenhum realmente. Você desperdiçaria largura de banda, pode adicionar alguns milissegundos ao fazer o download de uma segunda cópia inútil, mas não há nenhum dano real se os dois aparecerem. Obviamente, você deve evitar isso usando as técnicas mencionadas acima.
fonte
Eu criei um Gist que deveria carregar dinamicamente o jQuery, se já não estiver carregado, e se a fonte falhar, ele continuará em fallbacks (costurados a partir de muitas respostas): https://gist.github.com/tigerhawkvok/9673154
Observe que pretendo manter o Gist atualizado, mas não esta resposta, pelo que vale a pena!
fonte
JQuery hospedado pelo Google
Plano de Backup / Fallback!
Referência: http://websitespeedoptimizations.com/ContentDeliveryNetworkPost.aspx
fonte
Considero que deve escapar do último <to \ x3C na string. Quando o navegador vê, considera que este é o fim do bloco de scripts (como o analisador HTML não tem idéia sobre JavaScript, ele não pode distinguir entre algo que apenas aparece em uma string e algo que realmente significa finalizar o script elemento). Portanto, aparecer literalmente em JavaScript que esteja dentro de uma página HTML (no melhor dos casos) causará erros e (no pior dos casos) será um enorme buraco na segurança.
fonte
Ou
Não funcionará se a versão do cdn não estiver carregada, porque o navegador executará essa condição e, durante o processo, ainda fará o download do restante dos javascripts que precisam do jQuery e retornam erros. A solução foi carregar scripts através dessa condição.
fonte
Quase todas as CDNs públicas são bastante confiáveis. No entanto, se você estiver preocupado com o domínio do Google bloqueado, poderá simplesmente recorrer a uma CDN jQuery alternativa . No entanto, nesse caso, você pode preferir fazer o contrário e usar outra CDN como sua opção preferida e usar o CDN do Google para evitar solicitações com falha e tempo de espera:
fonte
Usando a sintaxe Razor no ASP.NET, esse código fornece suporte a fallback e funciona com uma raiz virtual:
Ou faça um ajudante ( visão geral do ajudante ):
e use-o assim:
fonte
CdnScript
auxiliar, você precisa de apenas uma linha de código por script . Quanto mais scripts você tiver, maior será o retorno.try { for (Script s : ...) cdnLoad(s); } catch (...) { for (Script s : ...) ownLoad(s); }
. Traduzir isso para um monte deif
s pode ser um pesadelo.Embora a escrita
document.write("<script></script>")
pareça mais fácil para o backoff do jQuery, o Chrome fornece um erro de validação nesse caso. Então eu prefiro quebrar a palavra "script". Portanto, fica mais seguro como acima.Para problemas de longo prazo, seria melhor registrar os fallbacks do JQuery. No código acima, se o primeiro CDN não estiver disponível, o JQuery será carregado a partir de outro CDN. Mas você pode querer saber esse CDN incorreto e removê-lo permanentemente. (este caso é um caso muito excepcional) Também é melhor registrar problemas de fallback. Assim, você pode enviar casos errados com o AJAX. Como o JQuery não está definido, você deve usar vanilla javascript para solicitação AJAX.
fonte
A incapacidade de carregar o recurso de um armazenamento de dados externo além do seu controle é difícil. A procura de funções ausentes é totalmente falaciosa, como forma de evitar o tempo limite, conforme descrito aqui: http://www.tech-101.com/support/topic/4499-issues-using-a-cdn/
fonte
Mais um substituto que substitui ajax.googleapis.com por cdnjs.cloudflare.com :
fonte
Você pode usar código como:
Mas também existem bibliotecas que você pode usar para configurar vários possíveis fallbacks para seus scripts e otimizar o processo de carregamento:
Exemplos:
basket.js Eu acho que a melhor variante por enquanto. Armazenará em cache seu script no localStorage, o que acelerará os próximos carregamentos. A chamada mais simples:
Isso retornará uma promessa e você poderá fazer a próxima chamada com erro ou carregar dependências com êxito:
RequireJS
yepnope
fonte