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 是未定义的,尽管我试图在函数中处理这个问题,但不知道为什么。

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

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

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

请帮我。我真正需要的是对这个问题进行第二次观察。谢谢 :)

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 方法中存在许多问题。首先是字符串“未定义”的比较,而不是直接的布尔检查,它将匹配。我还删除了一堆不需要的逻辑。除此之外,分配给新的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 的答案进行了一点编辑,这就是为什么你让我投票的原因!

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 回答