Domanda

Ho una semplice pagina HTML con un div. Sto usando jQuery per caricare il contenuto di un'app aspx nel "contenuto" div. Il codice è simile al seguente:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
                "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js">
    </script>
    <script type="text/javascript">
        jQuery.noConflict();
    </script>
</head>
<body>
    <div id="content">
        <div id="loading"> 
            <div class="loading-indicator">Loading...</div>
        </div>
    </div>
</body>
<script type="text/javascript">
    jQuery(document).ready(function() {
        jQuery("#content").load("default.aspx");
    });
</script>
</html>

Il problema è default.aspx usa shadowbox e altre librerie javascript. Quando quel codice tenta di essere eseguito su default.aspx, si comporta come se i file sorgente js non fossero caricati. Controllo firebug e ci sono i file js (no 404 o altro). Qualcuno sa cosa mi manca? Come puoi vedere ho usato la funzione jQuery noConflict perché pensavo che l'uso di $ potesse essere in conflitto con le altre librerie ma nessun aiuto lì ...

È stato utile?

Soluzione

Il codice che non viene eseguito viene visualizzato come blocchi di script, capisco le librerie caricate ma eventuali blocchi di script o javascript inline non verranno eseguiti quando caricati in modo dinamico. Devi trovare una soluzione che valuti i blocchi di script restituiti affinché uno di essi sia valido. Vedrò se riesco a scavare un esempio dal prototipo, mi ricordo che ne hanno uno.

UPDATE:

Questo è direttamente dal prototipo ...

  ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>'

  extractScripts: function() {
    var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
    var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
    return (this.match(matchAll) || []).map(function(scriptTag) {
      return (scriptTag.match(matchOne) || ['', ''])[1];
    });
  }

  evalScripts: function() {
    return this.extractScripts().map(function(script) { return eval(script) });
  }

Ovviamente puoi semplificarlo per le tue esigenze, ma quando una pagina viene restituita in modo dinamico devi valutare manualmente tutti gli script poiché il browser non valuterà automaticamente lo script iniettato nell'elemento.

Altri suggerimenti

Ho questo codice, potrebbe essere più dettagliato di quanto sia necessario, ma i file js nidificati non dovrebbero essere un problema.

jQuery.get('default.aspx', null, function(data) {
    $('#default').append(data);
}, 'html');

Sembra un problema comune: http://andreineculau.wordpress.com/2006/09/29/ajax-ondemand-javascript-or-dynamic-script-tags/

Suppongo sia la sicurezza integrata nei browser per impedire a una risposta ajax di eseguire script arbitrari.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top