我有一系列数组,其中包含我想在各种HTML div中用作文本的单词(其中大约有35个,为简洁起见,我只包括一些)。
var bodyplan = ['Anguilliform', 'Compressiform', 'Depressiform', 'Filiform', 'Fusiform', 'Globiform', 'Sagittiform', 'Taeniform'];
var mouthposition = ["Inferior", "Jawless", "Subterminal", "Superior", "Terminal"];
var barbels = ['1', '2', '4 or more'];
var caudalshape = ['Continuous', 'Emarginate', 'Forked', 'Lunate', 'Rounded', 'Truncate'];
我有一个切换功能,可以根据用户选择更改文本:
switch(n){
case 1:
changelabels(bodyplan, 8);
break;
case 2:
changelabels(mouthposition, 5);
break;
case 3:
changelabels(barbels, 3);
break;
case 4:
changelabels(caudalshape, 6);
break;
case 5:
changelabels(dorsalspines, 8);
break;
default:
alert("handquestsel error")}};
最后,我有我想要进行更改的功能(除了它没有):
function changelabels(opt1,opt2){
var i = opt2;
var im = opt2 - 1;
var c = 1;
var index = 0;
while (i>=c){
var oldlbl = document.getElementById("rb" + c + "lbl");
var newlbla = opt1.slice(im,i);
var newlblb = opt1.toString();
oldlbl.innerHTML = newlblb;
c = c + 1
index = index + 1
}};
我知道我的功能的代码在这一点上是完全错误的,但是我已经多次修改它以至于我不知道发生了什么。有一次,我确实有能够改变文本的功能,但它做得不正确(它解析了数组的名称,没有像我希望的那样从数组中提取值)。请帮忙。我知道我在这里忽略了一些基本概念,但不确定是哪些。我已经失去了我花在试图解决这个问题的时间。它似乎应该是如此简单,但在我所有的混乱尝试中,它仍然无法找到答案。
编辑:我希望我的switch语句调用该函数并传递给函数,该函数是从中拉出标签的相应数组。该应用程序的目的是帮助用户学习识别鱼。当用户在页面上进行选择时,将针对各种字符状态显示一系列图片,其中附带标签描述该状态。例如,当用户选择嘴位置时,一系列div将显示鱼具有的不同嘴部位置并且在图片下方具有标签以告知用户该特定字符状态被称为什么。我可以让图片改变得很好,但我对标签感到很难过。
答案 0 :(得分:1)
为什么不只是:
document.getElementById("bodyplan_label").innerHTML = bodyplan[bodyplan_index];
您似乎试图将所有内容都放在真正抽象的数据结构中,我认为没有理由。保持简单。
同样bodyplan
只有8个元素,因此bodyplan[8]
将为您提供out of bounds exception
,因为数组从0
开始,这在所有现代编程语言中都很常见。
答案 1 :(得分:0)
如果我正确地读取您的要求和代码,则在您的switch语句中传递对相应数组的引用和该数组的预期长度 - 您不需要第二个参数,因为所有JavaScript数组都有{{ 3}}
您不希望使用.slice()
从数组中获取单个值,因为这会返回从原始数据中复制的新数组 - 只需使用arrayVariable[index]
获取单个项目index
。
所以,把它放在一起试试这样的事情(使用你现有的数组定义):
switch(n){
case 1:
changelabels(bodyplan);
break;
case 2:
changelabels(mouthposition);
// etc.
}
function changelabels(data) {
var i,
lbl;
for (i = 0; i < data.length; i++) {
lbl = document.getElementById("rb" + (i+1) + "lbl");
lbl.innerHTML = data[i];
}
}
注意比你的代码简单多少?我在这里假设您正在更新的元素具有格式为“rb1lbl”,“rb2lbl”等的ID,编号从1开始:我使用(i + 1)获取这些ID,因为JavaScript数组索引从零。另请注意,您甚至不需要lbl
变量:您可以说document.getElementById("rb" + (i+1) + "lbl").innerHTML = data[i]
- 但我已将其保留,以便我们在下面展开一些内容...
在你的函数中,你似乎正在更改一组元素(单选按钮标签?)上的标签,数组中每个值一个,但是当你用完数组项时就会停止,这意味着任何剩余元素仍将保留来自先前选择的值(例如,如果先前的选择是具有8个选项的“bodyplan”并且您仅用5改变为“mouthposition” - 您可能应该隐藏3个剩余元素,否则这些元素将继续显示最后几个“bodyplan” “项目。一种方法是根据你可以在元素上循环的数组长度设置你的循环,如果当前元素有一个超出数组末尾的索引隐藏它,就像这样:
function changelabels(data) {
var i,
lbl,
elementCount = 20; // or whatever your element count is
for (i = 0; i < elementCount; i++) {
lbl = document.getElementById("rb" + (i+1) + "lbl");
if (i < data.length) {
lbl.innerHTML = data[i];
lbl.style.display = "";
} else {
lbl.innerHTML = "";
lbl.style.display = "none";
}
}
}
如果这些元素是单选按钮的标签(只是基于id的猜测),那么你也想隐藏或显示相应的单选按钮,但我希望你能弄清楚如何添加几行来以上就是这样做的。
(如上所述,当数组索引从0开始时,要注意元素id从1开始计数。)
如果上述方法不起作用,请发布(至少部分)相关的HTML - 显然我只是猜测它可能是什么样的。
答案 2 :(得分:0)
解决方案:将数组变量的范围更改为本地,方法是将它们移动到使用它们的函数中,而不是将它们作为全局变量放在页面顶部。我不理解,因为我遵循变量声明的每个规则。但由于某些未知原因,javascript中的全局变量令人憎恶。
解决方案编辑:在声明我的全局变量时发现错误。这可能是我无法访问它们的问题的根源。但是,自从我更正了我的代码以来,这是一个非问题。
答案 3 :(得分:-1)
我不明白您尝试使用代码完成的内容。但要通过引用传递变量(在本例中为数组),您只需添加“&amp;”在变量之前。
function the_name(&$var_by_ref, $var_by_value) {
// Here if you modify $var_by_ref this will change the variable passed to the function.
}
更多:http://php.net/manual/en/language.references.pass.php
希望有所帮助。