【问题标题】:jQuery and php image rotater puzzlejQuery 和 php 图像旋转拼图
【发布时间】:2011-01-03 15:58:25
【问题描述】:

Jquery 谜题

我有一个 php 脚本,它从文件夹中返回随机 jpg 图像的名称。这很好,因为我根本不需要重命名图像;我只是把它们放在文件夹中,随机发生器就可以工作了。现在,我像这样调用脚本 - http://mydomain.com/images/rotate.php - 在简单的网页重新加载时,它会交换图像。

但我想让它与 jQuery 一起工作,因为我想让图像以十秒左右的时间间隔在新图像中交换,并将它们淡入和淡出。

编辑 1/23/10:

这是通过交换 spacer.gif 来实现的。可能有一个更优雅的解决方案,但这对我有用。蒙克通过 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);
    }
}

?>

【问题讨论】:

    标签: php jquery image fadein fadeout


    【解决方案1】:

    我认为这样做的缺点是新图像会有一个加载周期,因此动画可能有点古怪。如果 $_GET 值等于一个值,则该文件有两个部分返回路径,如果该 $_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); 
    

    可能没有必要保留时间,但是,嘿,这是防止浏览器缓存“图像”的另一个安全措施。

    【讨论】:

    • 我认为这种方法有优点;如果您尝试删除fadeOut/fadeIn 动画并尝试每10 秒将源与具有不断变化的后缀的URL 交换一次,萤火虫是否显示图像实际上正在重新加载?也许不是直接从rotate.php转到rotate.php,而是先尝试“卸载”它,方法是从rotate.php转到spacer.gif再到rotate.php?
    • 这对于 spacer.gif 来说是个好主意。那将是什么代码?黑色间隔 gif 可能是一个很好的过渡:淡出颜色到黑色,淡入颜色,并且可以解决每次从 rotate.php 调用新图像的问题,而无需使用某种时间戳。​​
    • 这行得通!关键必须是绕过某种图像缓存,即使我在 .htaccess 中禁用了缓存。 MidnightLightning,我看看能不能也给你点积分。
    【解决方案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);
    

    【讨论】:

    • 似乎这应该可以正常工作,但事实并非如此。什么都没有显示。甚至使用静态图像的 URL 而不是 php 脚本的 URL。谢谢你的帮助;我想不出还有什么可以尝试...
    • 确保使用 www.mydomain.com 对其进行测试,脚本有一些问题...是如果你在一个更深的目录......你可能需要
    • 这看起来应该很容易解决。 ajax 调用究竟返回了什么?它只是图像的来源还是&lt;img&gt; 标签?交换完成后,firebug 说受影响图像的 src 是什么?
    • 这正在变成史诗 :) Firebug 显示 get 请求触发 OK,而 html 显示图像文件的原始源......
    • 为什么/如何工作?如果我没看错,您将部分响应内容(内容类型为“图像”)分配给 src 属性,该属性应该是字符串 URL...?
    【解决方案3】:

    假设您的 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
    

    【讨论】:

    • 似乎这应该可以正常工作,但事实并非如此。什么都没有显示。甚至使用静态图像的 URL 而不是 php 脚本的 URL。谢谢你的帮助;我想不出还有什么可以尝试...
    • 你连错误都没有吗?您是否使用 Firebug 进行调试? AJAX 请求真的执行了吗?它会返回预期的值吗?
    • 是的,应该提供更多细节;起得太晚了。今天早上它有点工作;我的标题中的垃圾字符。它淡入淡出一个图像,Firebug 显示 Get 请求触发。必须有图像返回的 URL 的东西?现在我意识到图像的 URL 始终相同 - mydomain.com/images/rotate.php - 但图像不同。当我在浏览器中直接访问 ttp://mydomain.com/images/rotate.php 时,每次(非 jQuery)重新加载时都会得到不同的图像。所以这一定会有所作为,我一开始并没有意识到......感谢您的帮助。
    • 只是用我有限的 jQuery 知识猜测:我们是否需要一个完整的 ajax 调用来提取图像而不是 $.get,因为即使图像与 php 不同,图像 url 也保持不变脚本?
    • 我不太清楚你所说的“完整的 AJAX 调用”是什么意思,在我看来 $.get 符合 AJAX 调用的条件。也许请求的结果被浏览器缓存了。尝试附加一个随机数作为参数(见编辑)或在您的 PHP 脚本中设置一个相应的“过期”标题。
    【解决方案4】:

    如何在$(document).ready() 块之外定义swapImage() 函数?

    <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" />
    

    【讨论】:

    • 这几乎得到了它.... Firebug 显示脚本触发正常,我得到第一个图像很好,然后后续图像不存在,但我确实得到了丢失的图像“?” (淡入淡出)并且比以前更多。丢失图像的原因是 Firebug 中的图像 URL 附加了时间,即 rotate.php1264184509211 但删除时间戳也不起作用。 Firebug 显示正在重新加载,但只是将 rotate.php 作为 URL,没有任何反应。
    • 如果是rotate.php1234567890应该是rotate.php?1234567890
    • 它应该有所不同,因为没有“?”,服务器正在寻找一个名为 rotate.php1234567890 的文件,但带有“?”它正在寻找 rotate.php 并通过 $_GET 传递参数。对我来说,这个例子工作得很好......你使用什么版本的 jQuery?路径设置正确吗?
    【解决方案5】:
    $("#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上的每个功能

    我已经更新了我认为它应该可以工作的脚本,因为您正在等待加载图像,但它没有源... 看看这个>&lt;img onerror="alert('there was an error') /&gt;" 如果您收到错误,则表示源不存在。顺便说一句,如果您打算使用多张图片,则不应使用#image,因为您的 html 上可能有一个唯一的 id,否则您会遇到冲突

    希望对你有帮助

    【讨论】:

    • 似乎这应该可以正常工作,但事实并非如此。什么都没有显示。甚至使用静态图像的 URL 而不是 php 脚本的 URL。谢谢你的帮助;我想不出还有什么可以尝试...
    • 仍然无法让它工作,也不会抛出错误。我只使用一个#image。这个淡入/淡出间隔的时间如何?
    • $(this).fadeOut(1000,function() { 速度参数在回调之前...docs.jquery.com/Effects/fadeOut,所以会报错
    【解决方案6】:

    您的设置缺少告诉 jQuery 不要缓存 AJAX 请求的步骤。可以将 'cache' parameter 添加到 AJAX 调用中以强制它获取新副本:

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

    【讨论】:

    • Firebug 显示此触发 Get 请求,但未显示图像,仅显示图像的原始代码。它确实旋转了图像,但图像不显示,只有源。
    • 哦,是的;这不起作用,因为 AJAX 正在获取图像的 DATA,这是 AJAX 调用的结果,而不是图像的 URL,这是我推入“src”属性(圆钉,方孔; 无论随机变化如何,都不会起作用)。如果有时间考虑一下,我认为 Munch 不使用 AJAX 的想法,但使用随机后缀可能是可行的方法,如果改进的话。
    猜你喜欢
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 2015-02-18
    相关资源
    最近更新 更多