2

わかりました、私はこれで頭を壁にぶつけてきましたが、要素を作成していない理由がわかりません。たぶん、私がここで見落としていた非常に小さな何か。基本的に、この Javascript コードが出力される PHP ドキュメントにあり、ページが読み込まれる途中のように、残念ながらヘッダーに入ることができません。とにかくそれが問題なのかどうかはわかりませんが、おそらくそれは...うーん。

// Setting the variables needed to be set.
    echo '
        <script type="text/javascript" src="' . $settings['default_theme_url'] . '/scripts/shoutbox.js"></script>';
    echo '
        <script type="text/javascript">
            var refreshRate = ', $params['refresh_rate'], ';
            createEventListener(window);
            window.addEventListener("load", loadShouts, false);

            function loadShouts()
            {
                var alldivs = document.getElementsByTagName(\'div\');
                var shoutCount = 0;
                var divName = "undefined";

                for (var i = 0; i<alldivs.length; i++)
                {
                    var is_counted = 0;
                    divName = alldivs[i].getAttribute(\'name\');

                    if (divName.indexOf(\'dp_Reserved_Shoutbox\') < 0 && divName.indexOf(\'dp_Reserved_Counted\') < 0)
                        continue;
                    else if(divName == "undefined") 
                        continue;
                    else
                    {
                        if (divName.indexOf(\'dp_Reserved_Counted\') == 0)
                        {
                            is_counted = 0;
                            shoutCount++;
                            continue;
                        }
                        else
                        {
                            shoutCount++;
                            is_counted = 1;
                        }
                    }

                    // Empty out the name attr.
                    alldivs[i].name = \'dp_Reserved_Counted\';

                    var shoutId = \'shoutbox_area\' + shoutCount;

                    // Build the div to be inserted.
                    var shoutHolder = document.createElement(\'div\');
                    shoutHolder.setAttribute(\'id\', [shoutId]);
                    shoutHolder.setAttribute(\'class\', \'dp_control_flow\');
                    shoutHolder.style.cssText = \'padding-right: 6px;\';
                    alldivs[i].parentNode.insertBefore(shoutHolder, alldivs[i]);

                    if (is_counted == 1)
                    {
                        startShouts(refreshRate, shoutId);
                        break;
                    }
                }
            }

        </script>';

また、これらの関数内でリンクしている他の関数も問題なく動作すると確信しています。ここでの問題は、この関数内で div がまったく作成されず、その理由が理解できないことです。さらに、Firefox、FireBug は、関数内でこれを処理しようとしたにもかかわらず、変数 divName が未定義であることを通知していますが、その理由は不明です。

とにかく、作成した div 要素を次の HTML の直前に挿入する必要があります。

echo '
            <div name="dp_Reserved_Shoutbox" style="padding-bottom: 9px;"></div>';

この関数は複数回呼び出される可能性があるため、id 値を重複させたくないため、ここでは id の代わりに name を使用しています。たとえば、同じページに 3 つのシャウトボックスがある場合 (理由は聞かないでください... 笑)、既に "dp_Reserved_Counted" に変更した他の名前をスキップする必要があります。これは正しく行っていると思います。いずれにせよ、これをヘッダーに配置して一度だけ呼び出すことができれば可能ですが、これらはロードされており、それらがどれであるかを知る方法がないため、これは不可能です。そのため、実際のシャウトボックスが HTML 内のページに出力されます。基本的に、それが問題かどうかはわかりませんが、問題が上記のコード内にない限り、何らかの回避策があるはずです... arrg

私を助けてください。本当に私が必要としているのは、これに対する第 2 の目です。ありがとう :)

4

3 に答える 3

2

テストするときdivNameは、条件の順序を次から切り替えます

                divName = alldivs[i].getAttribute(\'name\');

                if (divName.indexOf(\'dp_Reserved_Shoutbox\') < 0 && divName.indexOf(\'dp_Reserved_Counted\') < 0)
                    continue;
                else if(divName == "undefined") 
                    continue;

これに:

                var divName = alldivs[i].getAttribute(\'name\');
                if (!divName) // this is sufficient, by the way
                    continue;
                else if (divName.indexOf(\'dp_Reserved_Shoutbox\') < 0 && divName.indexOf(\'dp_Reserved_Counted\') < 0)
                    continue;

問題は、スクリプトが名前のない div を見つけると、存在しない値の indexOf プロパティを呼び出そうとするため、エラーがスローされることです。

于 2010-04-22T00:39:13.470 に答える
0

loadShoutsメソッドには多くの問題がありました。最初は、一致するストレートブールチェックではなく、文字列「undefined」の比較です。また、不要なロジックの束を削除しました。これを超えて、新しいshoutHolderに割り当てられているid属性は、直接のプロパティ割り当てではなく、配列として渡されていました。以下がより適切に機能するかどうかを確認してください。

function loadShouts()
{
  var alldivs = document.getElementsByTagName("div");
  var shoutCount = 0;
  var divName = "undefined";

  for (var i = 0; i<alldivs.length; i++)
  {
    divName = alldivs[i].getAttribute("name");

    if (!divName)
      continue;
    if (divName.indexOf("dp_Reserved_Shoutbox") < 0 && divName.indexOf("dp_Reserved_Counted") < 0)
      continue;

    shoutCount++;    
    if (divName.indexOf("dp_Reserved_Counted") == 0)
      continue;

    // Empty out the name attr.
    alldivs[i].setAttribute("name", "dp_Reserved_Counted");

    var shoutId = "shoutbox_area" + shoutCount;

    // Build the div to be inserted.
    var shoutHolder = document.createElement("div");
    shoutHolder.setAttribute("id", shoutId);
    shoutHolder.setAttribute("class", "dp_control_flow");
    shoutHolder.style.cssText = "padding-right: 6px;";
    alldivs[i].parentNode.insertBefore(shoutHolder, alldivs[i]);

    startShouts(refreshRate, shoutId);
    break;
  }
}
于 2010-04-22T01:03:42.797 に答える
0

わかりました、それがどうなったかをあなたに知らせたかっただけです。Tracker1 と Casey Hope の両方に感謝します。特に Tracker は、関数の優れた書き直しに優れています。あなたはすべてロックします。ちなみに、これが私が使用している最終的な関数です。Tracker1 の Answer を少し編集しただけです。これが、私の投票を手に入れた理由です。

echo '
    <script type="text/javascript">
        var refreshRate = ' . $params['refresh_rate'] . ';
        createEventListener(window);
        window.addEventListener("load", loadShouts, false);

        function loadShouts()
        {
          var alldivs = document.getElementsByTagName("div");
          var shoutCount = 0;
          var divName = "undefined";

          for (var i = 0; i<alldivs.length; i++)
          {
            divName = alldivs[i].getAttribute("name");

            if (!divName)
              continue;
            if (divName.indexOf("dp_Reserved_Shoutbox") < 0 && divName.indexOf("dp_Reserved_Counted") < 0)
              continue;

            shoutCount++;    
            if (divName.indexOf("dp_Reserved_Counted") == 0)
              continue;

            // Empty out the name attr.
            alldivs[i].setAttribute("name", "dp_Reserved_Counted");

            var shoutId = "shoutbox_area" + shoutCount;

            // Build the div to be inserted.
            var shoutHolder = document.createElement("div");
            shoutHolder.setAttribute("id", shoutId);
            shoutHolder.setAttribute("class", "dp_control_flow");
            shoutHolder.style.cssText = "padding-right: 6px;";
            alldivs[i].parentNode.insertBefore(shoutHolder, alldivs[i]);

            startShouts(refreshRate, shoutId);
            break;
          }
        }

    </script>';

ありがとう、あなたは最高です!

于 2010-04-22T02:08:04.270 に答える