Bir öğe oluşturma ve insertBefore çalışmıyor

3 Cevap php

Tamam, ben bu konuda kafamı duvara kadar beceriyor oldum ve eleman yaratmak değil neden hiçbir ipucu var. Belki de burada gözden kaçan çok küçük bir şey. Temel olarak, bir PHP belge sayfa yüklendiğinde aldığında ortasında bir yerde böyle, outputted olmak olan bu Javascript kodu var, ŞİMDİ, ne yazık ki bu başlık içine gidemem. Ben zaten sorun, ama belki de hmmmmm ... emin değilim gerçi.

// 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>';

Ayrıca, ben bu işlevler içinde bağlayan kulüpler diğer fonksiyonlar sadece iyi çalışır eminim. Burada sorun, bu fonksiyonu içinde, div tüm oluşturulan geçmez ve ben neden anlayamıyorum ki? Ayrıca Firefox, kundakçı ben neden emin değilim ama, işlev içinde bu dikkat çekmek için çalıştılar rağmen, değişken divName tanımsız olduğunu bana anlatıyor.

Her neyse, ben oluşturulan div elemanı sadece aşağıdaki HTML önce eklenecek gerekir:

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

Ben bu fonksiyon fazla 1 kez denebilir, çünkü adı değeri değişen ve artan ediyorum neden olduğu yinelenen id değerlerini istemiyorum çünkü ben yerine id burada adını kullanıyorum. Aynı sayfada 3 shoutboxes var Örneğin (lol ... Nedenini sorma), ben doğru yapıyorum inanıyorum ben zaten "dp_Reserved_Counted" değişti diğer isimleri, atlamak gerekiyor. Her durumda, ben eğer ben başlık içine bu koyun ve sadece bir kez, ama bu anlatımı hiçbir şekilde bu yüklü olarak mümkün değildir ve hangi doğrudan gerçek içine kodlanmış, o yüzden kişinin onlar, Yaygara HTML içinde nerede sayfasında çıktı. Temel olarak, emin sorun olup değil, ama eğer sorun ... arrg benim yukarıdaki kodu içinde olduğu sürece, iş çevresinde bir çeşit olmalı

Please help me. Really what I need is a second set of eyes on this. Thanks :)

3 Cevap

LoadShouts yöntemi konularda bir dizi vardı. İlk yerine maç olacak düz bir boolean çek arasında "tanımsız" bir dize karşılaştırma olmak. Ben de un-gerekli mantık bir demet kaldırıldı. Bunun ötesinde, yeni shoutHolder için atanan id niteliği yerine doğrudan bir özellik ataması aşağıdaki daha iyi çalışıyorsa .. bak, bir dizi olarak kabul ediliyordu.

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;
  }
}

Eğer test olduğunuzda divName, bu sizin koşulları sırasını değiştirmek

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

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

Bunun için:

                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;

Sorun komut adı olmadan bir div bulduğunda, varolmayan bir değer indexOf özelliğini aramaya çalışır ve bu nedenle bir hata atar olmasıdır.

Tamam, beyler, sadece nasıl gitti bildirmek istedim. Ve ben büyük ölçüde Tracker1 ve Casey Umut hem de teşekkür ederim. Özellikle fonksiyonun mükemmel yeniden yazmak için Tracker. Siz ROCK. İşte bytheway istimal son işlev, aşağı benim oy eller var neden Tracker1 en Yanıt, için düzenleme sadece küçük bir parça!

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>';

Tekrar teşekkürler, siz İYİ vardır!