创建元素和insertBefore不起作用

时间:2010-04-21 23:51:55

标签: php javascript createelement

好吧,我一直在撞墙撞墙,我不知道为什么它没有创造元素。也许是我在这里忽略的非常小的东西。基本上,这个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未定义,即使我试图在函数内处理这个问题,但不确定原因。

无论如何,我需要在以下HTML之前插入创建的div元素:

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

我在这里使用name而不是id,因为我不想要重复的id值,这就是为什么我要更改名称值和递增,因为这个函数可能被调用超过1次。例如,如果同一页面上有3个shoutbox(不要问为什么......大声笑),我需要跳过我已经改为“dp_Reserved_Counted”的其他名称,我相信我做的正确。在任何情况下,如果我可以,我会把它放入标题并让它只调用一次,但这是不可能的,因为这些是加载的,没有办法告诉它们是哪一个,所以它直接硬编码到实际shoutbox在HTML中的页面上的输出。基本上,不确定这是否是问题,但必须有某种解决方法,除非问题在我的代码中... arrg

请帮帮我。真的我需要的是第二眼。 谢谢:))

3 个答案:

答案 0 :(得分: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属性,因此会抛出错误。

答案 1 :(得分: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;
  }
}

答案 2 :(得分:0)

好的,只是想让你知道它是怎么回事。我非常感谢Tracker1和Casey Hope。特别是Tracker的优秀重写功能。你们都摇滚。这是我正在使用的最终功能,只是对Tracker1的答案进行了一点点编辑,这就是你投票的原因!

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

再次感谢,你是最棒的!