2010-11-06 6 views
1

J'essaye d'asynchroniser (ou de charger paresseusement) ce widget Reddit, mais j'ai un problème.Lazy Load Reddit Widgets

est ici le code de base qui fonctionne parfaitement lorsqu'il est directement dans le code HTML:

<script src="http://www.reddit.com/domain/skattertech.com/new/.embed?limit=4&amp;t=all&amp;sort=new&amp;style=off" type="text/javascript"></script> 

Si je tente de déplacer que sur dans mon scripts.js où j'exécute d'autres choses jQuery, il finit par réécrire l'ensemble du DOM avec le widget. Je suis conscient que le chargement que src dans le navigateur montre le code qui est en cours d'exécution commence par document.write. Donc, je devine, car il perd un point de référence, il est en train d'écraser toute la fenêtre.

Voici les deux méthodes que j'avais essayé et échoué:

$('.redditdiv').html('<script src="http://www.reddit.com/domain/skattertech.com/new/.embed?limit=4&amp;t=all&amp;sort=new&amp;style=off" type="text/javascript"></script>'); 

L'autre tentative a échoué:

var redditscript = document.createElement('SCRIPT'); 
redditscript.type = 'text/javascript'; 
redditscript.async = true; 
redditscript.src = 'http://www.reddit.com/domain/skattertech.com/new/.embed?limit=4&amp;t=all&amp;sort=new&amp;style=off'; 
$('.redditdiv').append(redditscript); 

Si quelqu'un a une suggestion, ce serait tout à fait impressionnant. Merci!

P.S. Question Bonus: Quelqu'un at-il une suggestion pour ce widget Twitter aussi?

<script src="http://widgets.twimg.com/j/2/widget.js"></script> 
<script> 
new TWTR.Widget({version: 2,type: 'profile',rpp: 4,interval: 6000,width: 'auto',height: 300, theme: {shell: {background: '#ffffff',color: '#000000'},tweets: {background: '#ffffff',color: '#606060',links: '#4476cc'} }, features: {scrollbar: false,loop: false,live: false,hashtags: false,timestamp: true,avatars: false,behavior: 'all'} }).render().setUser('skattertech').start(); 
</script> 
+1

Voir [insérer le javascript dans HTML Dynamiquement qui utilise document.write] (http://stackoverflow.com/questions/53945/dynamically-inserting-javascript-into-html-that-uses-document- écrire). –

+0

Matthew, merci pour la suggestion. J'ai essayé la version simple que Noah avait suggérée. Ça n'a pas l'air de faire quoi que ce soit. Pourriez-vous éventuellement écrire un exemple pour l'un des morceaux de code ci-dessus? (Désolé, je suis nouveau ce truc.) –

Répondre

3

Adapter le script de la question mentionnée par Matthew Flaschen, nous pouvons utiliser quelque chose comme ceci:

var content = ''; 
document.write = function(s) { 
    content += s; 
}; 

$.getScript('http://www.reddit.com/domain/skattertech.com/new/.embed?limit=4&amp;t=all&amp;sort=new&amp;style=off', function(){ 
    $('body').append(content); 
}); 

Nous utilisons la fonction $.getScript, qui est spécialement conçu pour charger dynamiquement des scripts. Le deuxième paramètre est le callback chargé, donc la fonction passée à la fonction sera exécutée sur load.

Vous devez remplacer le sélecteur 'body' par l'élément dont vous avez besoin. Sinon, si vous n'avez pas besoin jQuery,

var s = document.createElement('script'), 
    content = ''; 

s.src = 'http://www.reddit.com/domain/skattertech.com/new/.embed?limit=4&amp;t=all&amp;sort=new&amp;style=off'; 

document.write = function(s) { 
    content += s; 
}; 

s.onload = function(){ 
    document.getElementById('reddit').innerHTML = content; 
}; 

document.getElementsByTagName('head')[0].appendChild(s); 

Voir: http://jsfiddle.net/8yg9x/ pour la version jQuery et http://jsfiddle.net/d95xh/ pour la plaine la version Javascript

+0

Hey Yi, j'ai utilisé votre premier exemple pour les dernières semaines et ça fonctionne très bien. J'ai maintenant un autre petit problème. J'essayais de répéter cela pour un deuxième widget sur la même page. J'ai réutilisé le code, mais j'ai désactivé toutes les variables et j'ajoute à une partie différente de la page. Le problème est que le document initial.la capture d'écriture est ajoutée à la capture finale. Toute solution pour utiliser cette idée plus d'une fois? Exemple: http://jsfiddle.net/82EbS/3/ –

+0

@Sahas Hmmm ... il n'y a pas de moyen facile d'éviter cela, car il est impossible de dire quel script appelle la fonction 'document.write'. Vous pouvez placer la deuxième partie dans le rappel pour le premier, mais cela va ralentir le chargement des widgets, car maintenant ils ne peuvent pas tous les deux être chargés en même temps. Cependant, cela semble être la seule solution évidente. Voir: http://jsfiddle.net/yijiang/82EbS/4/ –

+0

Yi, merci d'avoir clarifié cela. J'ai trouvé une solution simple. Je viens d'ouvrir 'http: // www.reddit.com/static/button/button2.js' Il crée juste un iFrame très basique. Je peux construire et injecter assez facilement. De cette façon, je peux continuer à utiliser 'document.write' pour l'autre widget reddit qui me laisse sans autre option. :) Merci encore! –

0

Vous pouvez utiliser

<script src='//redditjs.com/subreddit.js'></script> 

ou si vous vouliez utiliser plus d'options. Les détails des options peuvent être trouvés here.

<script src='//redditjs.com/subreddit.js' data-subreddit='aww' data-height='400' data-width='330' data-sort='hot' data-theme='dark' data-subreddit-mode='small' ></script> 

Le résultat final ressemblera à ceci.

http://i.imgur.com/YczjBJD.png