Como substituir todo o CSS de uma página, depois de uma solicitação ajax com jQuery?
Pergunta
Eu tenho um documento com um CSS ligados.Como posso substituir o atual CSS com um vindo de um documento que eu só buscados com a solicitação AJAX usando jQuery?
Aqui está o código que eu estou tentando agora, mas sem sucesso até o momento:
$(function() {
$.get('next_page.html', function(data, textStatus) {
$('link[rel=stylesheet]:first')
.attr('href', $(data).find('link[rel=stylesheet]:first').attr('href'));
});
});
Atualização: $.find() não funciona em qualquer navegador (testado no Firefox 3.5, Google Chrome e Safari 3 no Mac), mas $.filter() encontrada a folha de estilos só no Firefox 3.5 - ainda nada em Google Chrome e Safari 3.
Ele deve ser simples, clique com o botão direito de substituir o atual CSS "href" com o novo, e voilá?
Por algum motivo, o jQuery não consegue encontrar qualquer coisa dentro da <head>
tag que está vindo de solicitação AJAX.Além disso, a jQuery não consegue encontrar o todo <head>
se, desde o AJAX de dados.Em outras palavras, $(data).find('head').size()
dentro da função de retorno de chamada retorna 0.
Estou usando o jQuery 1.4.
ATUALIZAÇÃO Fev 10, 2010:I apresentou um bug sobre este jQuery e eles concordaram que não é possível encontrar qualquer coisa, desde o <head>
tag do ajax de dados.
Aqui está a resposta que eu recebi:
http://dev.jquery.com/ticket/6061#comment:1 — "Sim, está correto - análise HTML reta apenas garantimos o conteúdo do elemento body.Se você gostaria de acessar o XML da página diretamente, então eu recomendo que você explicitamente tornar o arquivo .xhtml ou pedido-lo como XML, por exemplo:"
Solução 3
Isso é válido como por jQuery dev team — "análise reta HTML apenas garantimos o conteúdo do elemento body.Se você deseja acessar o XML da página diretamente, então eu recomendo que você explicitamente tornar o arquivo .xhtml ou pedido-lo como XML, por exemplo:"
$.ajax({ dataType: "xml", file: "some.html", success: function(data){ ... });
Outras dicas
Este jquery deve fazê-lo:
$(document).ready(function() {
$.get("next_page.html", function(data) {
$("link[rel='stylesheet']").attr("href", $(data).filter("link[rel='stylesheet']").attr("href"));
});
});
Tente isso:
$.load('next_page.html', function(data) {
$('link[rel=stylesheet]:first').replaceWith($(data).find('link[rel=stylesheet]:first'));
});
Você não estava realmente fazendo uma chamada AJAX no seu próprio exemplo, talvez foi esse o problema, ou você só esqueceu de adicionar o .load
parte?Isso deve funcionar muito bem, dado que é no interior do $(document).ready(function() { ... });
bloco.
eu tenho isso funcionando no meu site.Eu simplesmente adicionado um id para a minha tag link onde meu css é carregado.e, em seguida, você alterar o attri href (você tem que parte direita).
HTML:
<link type="text/css" href="/llt_style/skin/nuit.css" rel="stylesheet" id="llt_skin_href"/>
E eu uso um selecione para permitir que o usuário escolha a sua pele.
<select onchange="$('#llt_skin_href').attr('href', $(this).val());">
<option value="/llt_style/skin/jour.css">Jour</option>
<option value="/llt_style/skin/nuit.css">Nuit</option>
</select>