2010-11-18 9 views
1

Ich habe Probleme, den HTML-Code nach einer asynchronen get-Anfrage auf die Seite zu schreiben. Der HTML-Code wird von einem Charting-Dienst eines Drittanbieters bereitgestellt, so dass ich ihn selbst nicht ändern kann, außer wenn ich die Antwort nach dem $.get() erhalte.document.writeln() bricht mein jQuery Teilupdate. Wie kann ich das beheben?

Ich habe vor einer Weile die folgende Frage gestellt: Why is this HTML causing the page to go blank. Die Antwort war:

„document.write nachdem die Seite vollständig gerenderte ... wird ein neues Dokument erstellen“

Als solches wäre es möglich, für mich die document.writeln() ersetzen Funktion mit einer jQuery-Funktion, die den HTML-Code in diesem DOM enthält? Wenn ja, was muss ich tun?

ist es ein Fall von finden und ersetzen? Oder wird es überhaupt funktionieren? Gibt es eine andere Möglichkeit, dieses Problem zu lösen?

<!-- Chart by Corda Enterprise Server (PopChart, Highwire) Version 7.2.3.3177 (Jun 11, 2008) .NET Embedder 7.1.0.2116 --> 

<script type="text/javascript"> 
    var put2087644907Props; 
    var put1181439927Props; 
    var put433403842Props; 

    function getImageMap1325059360() { 
     put2087644907Props = new PopUpProperties; 
     put2087644907Props.width = 400; 
     // lots more of these properties being set 


     // not sure exactly, but this has something to do with providing hover-over functionality 
     document.writeln('<map name="imVB_2wFC_WSdl" id="imVB_2wFC_WSdl"><area shape="poly" coords="540,52,547,52,547,59,540,59,540,52" onmouseover="return showPopUp ? showPopUp(put2087644907Props, \'VB_2wFC_WSdl\', \'Schroder All Mats Idx Lnkd Bd I Acc 2.58%\', 543, 49) : false;"/> /* big long string */ onmouseover="return hidePopUp ? hidePopUp() : false;"/></map>'); 
    } 
</script> 
<script type="text/javascript"> 

    document.writeln('<script type="text/javascript" src="http://ie-sv-corda72:2001/?jsPopUp"></scr'+'ipt>'); 

    if(document.layers) getImageMap1325059360(); 

</script> 
<img id="VB_2wFC_WSdl" name="VB_2wFC_WSdl" width="570" height="243" style="border: 0;" 
    usemap="#imVB_2wFC_WSdl" src="http://ie-sv-corda72:2001/[email protected]_CPRVB_2wFC_WSdl" /> 
<script type="text/javascript"> 
    if (!document.layers) getImageMap1325059360(); 
</script> 
<noscript> 
    <map name="imVB_2wFC_WSdl" id="imVB_2wFC_WSdl"> 
     <area shape="poly" coords="540,52,547,52,547,59,540,59,540,52" alt="Schroder All Mats Idx Lnkd Bd I Acc 2.58%" /> 
     <area shape="poly" coords="497,41,504,41,504,48,497,48,497,41" alt="Schroder All Mats Idx Lnkd Bd I Acc 3.27%" /> 
     <%--lots of these area elements which gives the chart hover-text functionality--%> 
    </map> 
</noscript> 

<!-- Corda Enterprise Server (PopChart, Highwire) Version 7.2.3.3177 (Jun 11, 2008) .NET Embedder 7.1.0.2116 by corda.com --> 

als Referenz, dann ist dies der Code, der die get tut:

$.get(url, {}, function (result) { 

    $('#FactsheetTabs .tab_container').fadeOut(100, function() { 
     $('#tabs') 
      .append(result) // this fails in FireFox & chrome, but not IE... why?! 
      .fadeIn(100); 
    }); 
}, 'html'); 

Wenn ich die Antwort bearbeiten Sie die document.writeln() Code wie den folgenden Kommentar aus, es funktioniert:

$.get(url, {}, function (result) { 

    $('#FactsheetTabs .tab_container').fadeOut(100, function() { 
     result = result.replace("document.writeln", "//document.writeln"); 
     result = result.replace("document.writeln", "//document.writeln"); 
     $('#tabs') 
      .append(result) // this works now... 
      .fadeIn(100); 
    }); 
}, 'html'); 

Antwort

0

Sie können die document.writeln()-Funktion mit einer eigenen Funktion überschreiben, die die HTML-Datei sicher an das DOM anhängt, ohne sie zu beschädigen. Zum Beispiel:

document.writeln = function (html) { 
    $(document.body).append(html); 
} 

Die andere Option ist nah an Ihren ersetzen Methode, sondern stattdessen Kommentarbegrenzer hinzuzufügen, ersetzen document.write mit Ihrer eigenen Methode:

result = result.replace(/document\.writeln/g, "$(document.body).append"); 
+0

sieht gut aus, aber ich bin mir nicht ganz sicher, Wo soll ich das hinstellen? – DaveDev

+0

@DaveDev: bevor dein Ajax-Anruf es tun sollte. –

+0

... vorausgesetzt, dass 'document.expando = false;' noch nicht im IE aufgerufen wurde. Unwahrscheinlich, gebe ich zu. –

Verwandte Themen