4

Jqueryパズル

フォルダからランダムなjpg画像の名前を返すphpスクリプトがあります。画像の名前をまったく変更する必要がないので便利です。それらをフォルダーにドロップするだけで、ランダマイザーが機能します。今のところ、私はこのようなスクリプト(http://mydomain.com/images/rotate.php )を呼び出し 、単純なWebページのリロードで画像を交換します。

ただし、10秒程度の間隔で新しい画像の画像を交換し、フェードインおよびフェードアウトするという点で、jQueryで機能させたいと考えています。

1/23/10を編集:

これは、spacer.gifを交換することで機能します。もっとエレガントな解決策があるかもしれませんが、これは私にとってはうまくいきます。Munchは、MidnightLightningのアイデアによって、それを理解しました。

function swapImage(){
  var time = new Date();
  $('#image').fadeOut(1000)
   .attr('src', 'http://mydomain.com/spacer.gif')
   .attr('src', 'http://mydomain.com/images/rotate.php?'+time.getTime())
   .fadeIn(1000);
}

var imageInterval = setInterval('swapImage()',10*1000); 

そしてこれはrotate.phpです:

<?php

$folder = '.';


    $extList = array();
    $extList['gif'] = 'image/gif';
    $extList['jpg'] = 'image/jpeg';
    $extList['jpeg'] = 'image/jpeg';
    $extList['png'] = 'image/png';


$img = null;

if (substr($folder,-1) != '/') {
    $folder = $folder.'/';
}

if (isset($_GET['img'])) {
    $imageInfo = pathinfo($_GET['img']);
    if (
        isset( $extList[ strtolower( $imageInfo['extension'] ) ] ) &&
        file_exists( $folder.$imageInfo['basename'] )
    ) {
        $img = $folder.$imageInfo['basename'];
    }
} else {
    $fileList = array();
    $handle = opendir($folder);
    while ( false !== ( $file = readdir($handle) ) ) {
        $file_info = pathinfo($file);
        if (
            isset( $extList[ strtolower( $file_info['extension'] ) ] )
        ) {
            $fileList[] = $file;
        }
    }
    closedir($handle);

    if (count($fileList) > 0) {
        $imageNumber = time() % count($fileList);
        $img = $folder.$fileList[$imageNumber];
    }
}

if ($img!=null) {
    $imageInfo = pathinfo($img);
    $contentType = 'Content-type: '.$extList[ $imageInfo['extension'] ];
    header ($contentType);
    readfile($img);
} else {
    if ( function_exists('imagecreate') ) {
        header ("Content-type: image/png");
        $im = @imagecreate (100, 100)
            or die ("Cannot initialize new GD image stream");
        $background_color = imagecolorallocate ($im, 255, 255, 255);
        $text_color = imagecolorallocate ($im, 0,0,0);
        imagestring ($im, 2, 5, 5,  "IMAGE ERROR", $text_color);
        imagepng ($im);
        imagedestroy($im);
    }
}

?>
4

6 に答える 6

4

このようにすることの欠点は、新しい画像の読み込み期間があり、そのためにアニメーションが少し風変わりになる可能性があることです。そのファイルに2つの部分があり、$ _ GET値が1つに等しい場合はパスが返され、その$_GET値が設定されていないか他のものと等しい場合は画像が返されると便利な場合があります。そうすれば、一連の画像をプリロードでき、画像間のアニメーションがよりスムーズになります。

そうは言っても、このようなことがうまくいくはずだと私には思えます。

$(document).ready(function(){
   function swapImage(){
      var time = new Date();
      $('#image').fadeOut(1000)
       .attr('src', 'http://mydomain.com/images/rotate.php?'+time.getTime())
       .fadeIn(1000);
   }

   var imageInterval = setInterval('swapImage()',10*1000); 
});

時間はそれを作るので、ブラウザはそれが新しい画像を取得していると思います。

Spacer.gif

黒のスペーサーを使用してこれを行うには、画像をdivでラップし、スペーサーに一致するようにdivに#000の背景色を付けることをお勧めします。

#image-wrap{background-color:#000;}

これにより、画像が現在の背景色にフェードインして黒に変更されてフェードインするのではなく、実際に黒にフェードインするようになります。jsは上記と非常によく似ています。

function swapImage(){
  var time = new Date();
  $('#image').fadeOut(1000)
   .attr('src', 'http://mydomain.com/spacer.gif')
   .attr('src', 'http://mydomain.com/images/rotate.php?'+time.getTime())
   .fadeIn(1000);
}

var imageInterval = setInterval('swapImage()',10*1000); 

そこに時間を保つことはおそらく必要ではありませんが、ねえ、それはブラウザが「画像」をキャッシュすることに対するもう一つの安全策です。

于 2010-01-18T07:48:39.547 に答える
2

phpスクリプトは新しい画像のソースを返すためload()、画像のソースを交換する単純なajax呼び出しの使用を避け、使用するのが最善の場合があります。

var img=$('#image');//cache the element

function refreshNotification(){
  $.ajax({
    url: 'http://mydomain.com/images/rotate.php',
    success: function(src){
      img.attr({src: src});
    }
  });
}

setInterval(refreshNotification, 10000);
于 2010-01-11T07:08:32.517 に答える
1

PHPスクリプトが単に画像のURLを返すと仮定すると、このようなものが機能する可能性があります。

$(document).ready(function(){
    window.setInterval(switchImage, 10000);

    function switchImage() {
        var rn = Math.floor(Math.random() * 100000)
        $.get('http://mydomain.com/images/rotate.php', 
              { n: rn }, 
              receiveNewImage);
    }

    function receiveNewImage(src) {
        $('#image').fadeTo(1000, 0.0, function() { switchAndFadeIn(src); } );
    }
    function switchAndFadeIn(newSrc) {
        $('#image').attr('src', newSrc).fadeTo(1000, 1.0);
    }
});

編集:ランダムパラメータを追加しました。

編集:あなたのPHPでは、このようなものは役に立ちますか?

header("Cache-Control: no-cache, must-revalidate");
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Expires data in the past
于 2010-01-11T07:08:23.410 に答える
1

ブロックswapImage()の外側で関数を定義するのはどうですか?$(document).ready()

<script type="text/javascript" scr="path/to/jquery.js"></script>
<script type="text/javascript">
function swapImage(){
    var time = new Date();
    $('#rotate').fadeOut(1000)
     .attr('src', 'rotate.php?'+time.getTime())
     .fadeIn(1000);
}
$(document).ready(function(){
  var imageInterval = setInterval('swapImage()',5000);
});
</script>

<img src="rotate.php" id="rotate" />
于 2010-01-21T21:21:10.053 に答える
0
$("#image").each(function({
$(this).fadeOut(function() { 

$(this).attr("src", "http://mydomain.com/images/image.jpg"); 
$(this).load(function() { $(this).fadeIn(); }); // this should be on the bottom....
}); 
})

JQEachの各機能を確認してください

スクリプトを更新しました。画像が読み込まれるのを待っているので動作するはずですが、ソースがありません...これを確認してください><img onerror="alert('there was an error') />" エラーが発生した場合は、ソースが存在しないことを意味します。ところで、複数の画像を使用する予定がある場合は、HTMLに一意のIDが1つある可能性があるため、#imageを使用しないでください。使用しないと競合が発生します。

お役に立てれば

于 2010-01-11T12:15:11.703 に答える
0

セットアップには、jQueryにAJAXリクエストをキャッシュしないように指示するステップがありません。AJAX呼び出しに追加して、新しいコピーを取得するように強制できる「cache」パラメーターがあります。

$.ajax({
  url: 'http://mydomain.com/images/rotate.php',
  cache: false,
  success: function(src){
    img.attr({src: src});
  }
});
于 2010-01-19T18:58:14.130 に答える