好吧,我一直在撞墙撞墙,我不知道为什么它没有创造元素。也许是我在这里忽略的非常小的东西。基本上,这个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
请帮帮我。真的我需要的是第二眼。 谢谢:))
答案 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>';
再次感谢,你是最棒的!