supponiamo di avere una semplice pagina web che carica dinamicamente i contenuti che assomiglia a questo:Dove vengono caricati gli script dopo una chiamata ajax?
- main.html -
<!DOCTYPE html>
<html xmlns="https://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript"
src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript">
$(function() {
$.ajax({
type: 'get', cache: false, url: '/svc.html',
success: function(h) {
$('#main').html(h);
}
});
});
</script>
</head>
<body>
<div id='main'>
loading...
</div>
</body>
</html>
e che la pagina si carichi usa un po 'di JavaScript in un file separato :
- svc.html -
<script type="text/javascript"
src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-1.6.2.js">
</script>
<script type="text/javascript" src="/plugin.js" css="/plugin.css"></script>
<div id='inner'>
dynamically loaded content
</div>
notate l'attributo css
sul tag script - indica un foglio di stile che appartiene allo script e che lo script caricherà per noi. Ecco lo script:
- plugin.js -
var css = $('<link />', {
rel: "stylesheet", type: "text/css", href: $('script:last').attr('css')
});
$('head').append(css);
e, infine, il foglio di stile, che si limitano a colori la inner
div che viene caricato, come prova che funziona il tutto:
- plugin.css -
#inner
{
border: solid 1px blue;
}
ora, si noterà la il foglio di stile viene caricato: guardiamo allo $('script')
e prendiamo l'ultimo, quindi prendiamo l'attributo css
e alleghiamo un articolo link
all'inizio del documento.
posso visitare /svc.html
e le piste javascript, carichi il mio foglio di stile, tutto è fresco - tuttavia, se visito /main.html
, le piste javascript, ma non riesce a trovare il caricamento del plugin.js
nella matrice di $('script')
(e quindi non riesce per caricare il foglio di stile). Si noti che lo script del plugin viene eseguito, ma non si vede da solo.
È un bug? una limitazione del metodo jQuery AJAX? non dovrebbe $('script')
riflettere tutti gli script che sono stati caricati?
* Edit *
dopo molto pianto e stridore di denti, ho deciso di andare per la soluzione di Kevin B, però, non riesco a farlo funzionare, fondamentalmente perché il codice plugin.js
viene eseguito al momento viene inserito il codice scriptNode
, ma all'interno del codice del plugin il nodo non è ancora stato inserito e quindi non è disponibile nell'array $('script')
, quindi sono ancora SOL. Ho messo tutto il codice per la revisione qui:
http://www.arix.com/tmp/loadWithJs/
oh ... come brutto. Ho testato l'approccio '$ ('# main'). Load()' e sembra comportarsi allo stesso modo. * * * esegue lo script ma lo getta anche via ... – ekkis
Esegue gli script quando ** non ** esegue l'hack speciale per selezionare solo un frammento dell'HTML restituito dalla chiamata AJAX. – Pointy
oh, capisco ... quindi sembra che il codice bestiale di Kevin B potrebbe essere la mia unica alternativa. grr ... – ekkis