0

私のサイトはgapagap.comで、投稿を下にスクロールすると、より多くの投稿が読み込まれますが、「投票」機能があり、クリックすると一部の投稿で機能する場合があり、ランダムな投稿では機能しない場合があります。ここにコードスニペットがあります..

INDEX.php

       <div id="entries-content" class="list">
            <ul id="entries-content-ul" class="col-1">
                {section name=i loop=$posts}
                {include file="posts_bit.tpl"}
                {/section}   
                      {literal}
            <script type="text/javascript">
            $(document).ready(function(){
      //calling header function to set the active tab state
      headerTabChange('hot');

                var tpage = 2;
                function lastAddedLiveFunc()
                {

                                      $('div#lastPostsLoader').html('');
                    $.get("{/literal}{$baseurl}/{literal}indexmore.php?page="+tpage, function(data){
                        if (data != "") {

                                            $(".col-1").append(data);

                        }
                        $('div#lastPostsLoader').empty();
                    });
                };

                $(window).scroll(function(){

                    var wintop = $(window).scrollTop(), docheight = $(document).height(), winheight = $(window).height();
                    var  scrolltrigger = 0.95;

                    if  ((wintop/(docheight-winheight)) > scrolltrigger) {
                     lastAddedLiveFunc();
                     tpage = tpage+1;
                     $('#backtotop').show();
                    }
                });
            });
            </script>
            {/literal}     

              </ul>
            <div id="lastPostsLoader"></div>
        </div>  
    </div>

      {include file='right.tpl'}
      {include file='vote_js.tpl'}  

これがvote_js.tplのコードです:

    {literal}
     <script type="text/javascript">
          $('.vote').click(function(){
        if( $(this).hasClass('loved')){
        $(this).removeClass('loved');
        likedeg(-1,$(this).attr('rel'));
        }else{
        likedeg(1,$(this).attr('rel'));
         $(this).addClass('loved');
        }
        });
        function likedeg(x,p){
        jQuery.ajax({
        type:'POST',
        url:'{/literal}{$baseurl}{literal}'+ '/likedeg.php',
        data:'art='+x+'&pid=' + p,
        success:function(e){
            $('#love_count_'+p).html(e);
            }
        });
         }
        </script>
    {/literal}

post.tplで投票機能を持つ別のコードを次に示します。

   <li>
    {if $smarty.session.USERID ne ""}

   <a class="vote love {insert name=get_fav_class value=var PID=$posts[i].PID}" id="post_love_{$posts[i].PID}" rel="{$posts[i].PID}" href="javascript:void(0);"><span>{$lang144}</span></a>
      {else}
     <a class="vote love " id="post_love_{$posts[i].PID}" rel="{$posts[i].PID}" href="{$baseurl}/login"><span>{$lang144}</span></a>
       {/if}
      </li>

投票機能はfunction.php内にあります

       function insert_get_fav_status($var)
       {
              global $conn;
          $query="SELECT count(*) as total FROM posts_favorited WHERE                   USERID='".mysql_real_escape_string($_SESSION[USERID])."' AND PID='".intval($var[PID])."'";
          $executequery=$conn->execute($query);
$total = $executequery->fields[total];
//echo $total.'<br />';
//var_dump($var);
return intval($total);
        }

         function insert_get_fav_class($var)
             {
               global $conn;
                $query="SELECT count(*) as total FROM posts_favorited WHERE  USERID='".mysql_real_escape_string($_SESSION[USERID])."' AND PID='".intval($var[PID])."'";
               $executequery=$conn->execute($query);
               $total = $executequery->fields[total];
                  //echo $total.'<br />';
                 //var_dump($var);
                if (intval($total) == 1) return("loved");
                 else return ("");
               }

             function insert_get_unfav_status($var)
             {
              global $conn;
                $query="SELECT count(*) as total FROM posts_unfavorited WHERE  USERID='".mysql_real_escape_string($_SESSION[USERID])."' AND PID='".intval($var[PID])."'";
           $executequery=$conn->execute($query);
           $total = $executequery->fields[total];
          return intval($total);
                }

                function insert_get_fav_count($var)
                {
                 global $conn;
             $query="SELECT count(*) as total FROM posts_favorited WHERE                           PID='".intval($var[PID])."'";
          $executequery=$conn->execute($query);
          $total = $executequery->fields[total];
         return intval($total);
                }

私は PHP 開発者であることを理解してください。JAVASCRIPT と JQUERY の知識はゼロです。

4

3 に答える 3

2

私自身の質問にもう一度答えて申し訳ありません....しかし、率直に言って、私はこの習慣を変えたくありません..笑.

そこの代わりに

{ $(".col-1").append(data);

私はそれを { $(".col-1").html(html()+data);

ご支援いただきありがとうございます。

于 2013-04-15T06:09:21.177 に答える
1

このコードを意味する場合:

<script type="text/javascript">
 (function (d, buildThese) {
   var homeScript, newScript, n = buildThese.length, i;
   for (i = 0; i < n; i = i + 1) {
     newScript = d.createElement('SCRIPT');
     newScript.type = 'text/javascript';
     newScript.async = true;
     newScript.src = buildThese[i];
     homeScript = d.getElementsByTagName('SCRIPT')[0];
     homeScript.parentNode.insertBefore(newScript, homeScript);
  }
});
</script>

現在、このクロージャーを呼び出していることに気付きました:

  • 要素が DOM に完全に挿入される前に
  • 引数なし (試してみてください: この特定の関数では、 d と buildThese の両方がundefinedです)
  • チェックせずに

太字の 2 つの理由は、コードが台無しになる原因です。そこに何もない場合、buildThese は未定義になり、その長さは 0 になります。したがって、ループは実行されません。あったとしても、d は定義されていないため、d.createElement で致命的なエラーが発生します。

必要な関数は jQuery done()です。この巧妙な小さな関数を使用すると、すべての新しい要素が挿入されたときにトリガーされるコールバックを設定できます。それはこのように動作します:

$.get("myURL").done(function() { alert("I'm done!"); });

これにより、コードに 2 つの意図しない影響が生じます。

  • 新しいページをロードするたびに Twitter API スクリプトの重複を避けることができます。
  • HTMLのみを取得できるため、JS を 1 か所に保持できます。
于 2013-04-08T10:33:36.827 に答える