2014-06-11 2 views
1

J'ai un site avec un portfolio géant avec une tonne d'images haute résolution.jQuery et Ajax Chargement d'images

Je ne veux pas redimensionner ces images, mais j'aimerais pouvoir les afficher en mode asynchrone.

Sors jQuery .ajax

Mais mon code est erroné, en quelque sorte. Ce qu'il fait est semble tirer dans la page, au lieu de l'image "src"

peut vous aider à:

// Load in the images via ajax: 
var $imgs = $('.ajax-image'); 
$imgs.each(function(i){ 
    var $imgsrc = $(this).attr('src'); 
    var $url = '/php/pull-image.php?i=' + $imgsrc; 
    $.ajax({ 
     url : $url, 
     mimeType: "text/plain", 
     processData : false, 
     cache: false, 
     success: function (html) { 
      $(this).attr('src', html); 
     } 
    }); 
}); 

et PHP:

$path = $_GET['i']; 

$type = pathinfo($path, PATHINFO_EXTENSION); 
$data = file_get_contents($path); 
echo 'data:image/' . $type . ';base64,' . base64_encode($data); 

tags d'image sont simplement: <img src="http://example.com/images/image.ext" />

Qu'est-ce que je fais mal ici? et comment puis-je le réparer?

+0

Comment cela améliorerait-il les performances? Vos images font partie du code HTML, elles sont donc chargées au fur et à mesure que le navigateur charge la page et vous ne remplacez l'attribut source qu'après avoir été à nouveau chargé dans javascript. Si vous voulez avoir une influence sur ce qui est chargé quand, ne les placez pas dans l'attribut 'src', mais par exemple dans un attribut' data-src' afin que le navigateur ne les charge pas. – jeroen

+0

console.log (b64data), pour vérifier quelle est la réponse du serveur avant de l'utiliser.Essayez de cette façon en-tête ("Content-type: image /". $ Type); echo 'données: image /'. $ type. '; base64,'. base64_encode ($ data); –

Répondre

1

Comme je l'ai mentionné dans mon commentaire, je ne vois pas comment cela ferait ce que vous voulez mais pour résoudre votre problème actuel: Il est probablement causé en raison de this dans le contexte de la fonction success, n'est pas la même que la this dans le contexte de votre each() fonction.

Vous devez enregistrer l'élément afin que vous puissiez y accéder à la fonction success:

$imgs.each(function(i){ 
    var el = $(this), 
     $imgsrc = el.attr('src'), 
     $url = '/php/pull-image.php?i=' + $imgsrc; 

    $.ajax({ 
     url : $url, 
     mimeType: "text/plain", 
     processData : false, 
     cache: false, 
     success: function (html) { 
      el.attr('src', html); 
     } 
    }); 
}); 

Edit: Il n'y a pas vraiment besoin d'utiliser ici ajax/php pour définir la source de l'image. Vous pouvez également générer des images en javascript (par lots), ajouter une fonction onload() pour les images et définir la source de vos éléments html quand ils sont chargés, puis obtenir le lot suivant. Voir par exemple cette question: JavaScript: Load an image from javascript then wait for the "load" event of that image

+0

bien ... J'espérais un peu de blocage. Je tire ces images de mon blog (qui résident sur le même serveur) ...cependant, je trouve qu'il y a maintenant plus de blocage alors que tout cela charge – Kevin

+0

je suppose que je viens de "cul" umed que l'ajax était censé être accompli de manière asynchrone au chargement de la page ... – Kevin

+0

désolé ... et oui, j'ai déménagé ou l'attribut src, et mettez les urls dans un attribut data-src pour les récupérer depuis – Kevin

1

Votre page php obtient une erreur car vous ne transmettez rien pour le paramètre i. Votre php lance donc une erreur 404 - une réponse HTML complète.

Je pense que vous avez une erreur de syntaxe javascript qui est à l'origine ceci:

url : '/php/pull-image.php?i=' . $imgsrc, 

Remplacez cette ligne par:

url : '/php/pull-image.php?i=' + '<?php echo json_encode($imgsrc); ?>' , 
+0

oui. Je viens de le remarquer et de le corriger, et l'URL se rétracte maintenant ... mais l'image src n'est toujours pas remplacée par la base64 – Kevin

+0

Que contient 'html'? faire une alerte (html); Qu'est-ce que cela retourne maintenant? –