0

以前にこの質問を作成しましたが、別の方法で回答がありませんでした。だから今日、私の問題を明確な方法で共有するためにいくつかの簡単なコードを書きました。

  1. 以前jQueryは画像スライドショー関数を呼び出していました。
  2. の AJAX 関数show.phpが呼び出さget.phpれ、結果が DIV に出力されます。

私の問題は、によって提供される DIV 内でのスライド (前 - 次) がget.phpでは機能しないことですshow.php。しかしget.php、ブラウザで直接呼び出すと、機能します。

私は混乱しています.AJAXを呼び出すときにdivにエラーがあると思います.

マイファイル

show.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>test </title>
        <link rel="stylesheet" type="text/css" href="demo.css" />
        <script type="text/javascript" src="jquery-1.4.2.min.js"></script>
        <script type="text/javascript" src="newscript.js"></script>
        <link href="themes/2/js-image-slider.css" rel="stylesheet" type="text/css" />
        <script src="themes/2/js-image-slider.js" type="text/javascript"></script>
        <link href="generic.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <?php
            include("samiloxide.php");
            $sql=mysql_query(" select * from  section ");

            while($r=mysql_fetch_array($sql)){
                echo "<li><a  onclick='loadpage($r[id])' >$r[section]</a></li>" ;
            }
        ?>
        <div id="pageContent"></div>
    </body>
</html>

newscript.js

var section;
function loadpage(section){ 
    var section = section.toString();

    $.ajax({
       type: "POST",
       url: "get.php",
      dataType: "script",
       data: ({section : section}),
     success: function(html){
            $("#pageContent").empty();
            $("#pageContent").append(html);
        }
    });
}

get.php

<script type="text/javascript" src="jquery-1.4.2.min.js"></script>
<style type="text/css">
    <!--
    #gallery-wrap{margin: 0 auto; overflow: hidden; width: 732px; position: relative;}
    #gallery{position: relative; left: 0; top: 0;}
    #gallery li{float: left; margin: 0 20px 15px 0;}
    #gallery li a img{border: 4px solid #40331b; height: 175px; width: 160px;}
    #gallery-controls{margin: 0 auto; width: 732px;}
    #gallery-prev{float: left;}
    #gallery-next{float: right;}
    -->
</style>

<script type="text/javascript">
    <!--
    $(document).ready(function(){ 
        // Gallery
        if(jQuery("#gallery").length){
            // Declare variables
            var totalImages = jQuery("#gallery > li").length, 
            imageWidth = jQuery("#gallery > li:first").outerWidth(true),
            totalWidth = imageWidth * totalImages,
            visibleImages = Math.round(jQuery("#gallery-wrap").width() / imageWidth),
            visibleWidth = visibleImages * imageWidth,
            stopPosition = (visibleWidth - totalWidth);

            jQuery("#gallery").width(totalWidth);

            jQuery("#gallery-prev").click(function(){
                if(jQuery("#gallery").position().left < 0 && !jQuery("#gallery").is(":animated")){
                    jQuery("#gallery").animate({left : "+=" + imageWidth + "px"});
                }
                return false;
            });

            jQuery("#gallery-next").click(function(){
                if(jQuery("#gallery").position().left > stopPosition && !jQuery("#gallery").is(":animated")){
                    jQuery("#gallery").animate({left : "-=" + imageWidth + "px"});
                }
                return false;
            });
        }
    });
    -->
</script>

           <?php
            include("samiloxide.php");
//if(!$_POST['page']) die("0");

$section = (int)$_POST['section'];

$sql=mysql_query(" select * from images  where section='$section'");

echo "
<div id='gallery-wrap'>
    <ul id='gallery'>
    ";


while($rr=mysql_fetch_array($sql)){

      echo " <li><a href='$rr[image]'><img src='$rr[image]' alt='' /></a></li>";
           }
           echo "

    </ul>
</div>
<div id='gallery-controls'>
    <a href='#' id='gallery-prev'><img src='images/prev.png' alt='' />next</a>
    <a href='#' id='gallery-next'><img src='images/next.png' alt='' />last</a>
</div>
           ";
?>
4

1 に答える 1

0

これは少し複雑で、コピー、貼り付け、検証するだけでコードを簡単に修正することはできません。

ではget.php、ギャラリーを含むドキュメントをロードし、それから作業ギャラリーにし$(document).ready()ます。

しかし では、ファイルshow.phpをロードするときには呼び出されません。ofはかなり前に既に呼び出されており、ドキュメントは現在状態にあります。したがって、レイアウトをロードするときに、そのレイアウトを機能させるコードを自動的に実行するわけではありません。get.php$(document).ready()$(document).ready()show.phpinteractive

$(document).ready()コードget.phpをに移動しshow.phpてから、AJAX 呼び出し完了にバインドする必要があります。または、コードのバインドを解除します。コードを でget.phpラップせずに、HTML の最後から呼び出すだけ$(document).ready()です。

ただし、これは常にすべてのブラウザで保証されているわけではありません。ドキュメントの準備ができたときに while$(document).ready()が適切に呼び出されるためshow.php、HTML ファイルの読み込みを要求するだけだからです。

そして、HTML がロードされ、onLoad起動されます。異なることは期待できません。

次に、その HTML は他のアセット (画像など) をロードするように要求しますが、ブラウザーはこれを認識しませんでした。既にonLoad実行されているため、ギャラリーのセットアップ コードは既に実行されています。適切にスタイルを設定するために、レイアウトでイメージの SRC が既に読み込まれている必要がある場合、常に機能するとは限りません。画像はブラウザのキャッシュにあるため、2 回目は機能する可能性があります。低速接続ではなく、高速接続で機能する場合があります。小さな画像ですばやくロードでき、大きな画像では機能しない場合があります。これらのすべての動作は、既に読み込まれているイメージが必要であることを示しています。

繰り返しになりますが、適切な遅延の後にセットアップを開始するのが手っ取り早い修正方法です (ただし、何が適切かはわかりません)。すべての画像のサイズがわかっている場合は、HTML または CSS でそれらのサイズを指定することもできます。結局のところ、レイアウトでは通常、ページ上のスペースを占有するように画像を読み込む必要がありますが、そのために画像が実際に表示可能である必要はありません。それらは空のスペースである可能性があります(背景でスタイル設定されている可能性があります)。

3 番目の可能性は、より複雑ですが、すべてのブラウザーで動作することが保証されているもので、画像 SRC を別の種類のタグ (たとえば、imageloading のクラスを持つ DIV、デフォルトでは非表示) に保存し、load() が成功した後にこれらのタグを分析することです。を付けて IMG に変換しonloadます。これらの onload がすべて起動したら、ギャラリーのセットアップを開始しても問題ないことがわかります。説明 (およびコード) が長くなりますが、この最後の方法は、単純な「クイック フィックス: 少し待ってからセットアップを開始する」方法よりも実際にははるかに高速です。

于 2012-11-22T09:54:09.903 に答える