我一直在尝试整天调试这个脚本,我什么也得不到任何帮助,我将不胜感激。
我不断收到一个错误,即错过了大括号或方括号或括号。而且当我尝试获取我的选项的值时,它表示x未定义但是当我输入0作为我的索引时我可以检索opts.value,我的问题是为什么x未定义以及此脚本中缺少什么
prices= (function(){
table=document.getElementsByTagName("table");
selects=table[0].getElementsByTagName("select");
for(var x=0;x<=10;x++){
opts=new Array();
opts=selects[x].getElementsByTagName("option")[selects[x].selectedIndex];
}
return{
value: (function(){
val=new Array();
for(var i=0;i<=5;i++){
val[i]=opts.value
}
return val;
})();,
total: (function(){}
var num="$15.00"
var t;
for(var j=0;j<=3;j++){
t+=num.slice(1).valueOf();
}
return t
})();
};
})();
var hello="hello"
document.write("<p>hello</p>");//line just test whether or not function is working
document.write(opts.value);
答案 0 :(得分:1)
好吧,如果该脚本位于文档的<head>
中,它会在创建之前尝试读取DOM元素,除非您通过onload调用它,而不是显示它。
您的另一个选择是在关闭正文之前将<script> ... </script>
放在页面底部。虽然我不能100%确定这是问题,因为你还没有发布你的HTML,如果你得到未定义的DOM元素,这是一个公平的猜测。
答案 1 :(得分:1)
很抱歉,如果我错过任何内容,我没有尝试运行它,因为我保留了您正在使用的html场景。因为它使用document.write,它将从页面上第一个表中的11个选择中返回默认选定的选项值。
// I've changed your "demo" to show the use of a "closure"...
var prices = (function() { //maybe good to add var
var table = document.getElementsByTagName("table"); //maybe good to add var
var selects = table[0].getElementsByTagName("select"); //maybe good to add var
var opts = new Array(); //pull it out of for loop and add var! FYI var opts = []; is equivalent.
for (var x = 0; x <= 10; x++) { //your test requires at least eleven selects in the first table.
opts[x] = selects[x].options[selects[x].selectedIndex]; // maybe wanted 11 selected options in a closure?
}
return { // remove both anonymous wrappers from your object literal (function(){ ... })();
value: function() {
var val = new Array(); //maybe very good to add var
for (var i = 0; i <= 5; i++) {
val[i] = opts[i].value; //good to add ; read selected option.value x6 from opts array in closure!
}
return val;
},
total: function() { // deleted an extra }
var num = "$15.00"; //add ;
var t; // must initialize to 0 since you're using +=
for (var j = 0; j <= 3; j++) {
t += num.slice(1).valueOf(); // null +=15.00 x3
}
return t; // null, good to add ;
}
};
})();
// I'm guessing you've done too much work to have previously defined opts as a global, yes?
document.write(prices.value().join('\r\n<br />')); // selected values copied from the closure
/* //using document.write so all this need to run at the bottom of a page
var hello = "hello"; //good to add ;
document.write("<p>hello</p>"); //line just test whether or not function is working
document.write(opts.value);
*/
请参阅评论以获取帮助修复price.total等。
答案 2 :(得分:0)
似乎return t
缺少分号。
此外,在total:
之后的anon-function中,您似乎有成对括号{}
后跟更多正文,最后在return t
之前以不匹配的闭括号结尾
如果您解决了这些问题,我认为您将更加努力地使用代码
答案 3 :(得分:0)
我没有那么多检查你的代码做了什么,但试图找到你缺少的大括号/语法错误的答案。似乎有很多。我使用适当的缩进重新格式化了上面的代码,并提出了这个:
var prices = (function() {
table = document.getElementsByTagName("table");
selects = table[0].getElementsByTagName("select");
for (var x = 0; x <= 10; x++) {
opts = new Array();
opts = selects[x].getElementsByTagName("option")[selects[x].selectedIndex];
}
return {
value:
(function() {
var val = new Array();
for (var i = 0; i <= 5; i++) {
val[i] = opts.value;
}
return val;
})() ,
total:
(function() {
var num = "$15.00";
var t;
for(var j = 0; j <= 3; j++) {
t += num.slice(1).valueOf();
}
return t;
})()
};
})();
有些事情需要注意:
(function() { ... })()
定义一个函数(function() { ... }
位),然后立即调用它(终止()
位)。整个表达式具有函数返回的值。
return { value: ..., total: ... }
返回一个字典,可以由prices
变量引用。请注意,您在var
之前(以及prices = ...
之前错过了val
关键字。此外,在total: function()
之后,您需要删除结束大括号,因为后面的内容属于这个功能。
您为opts
分配两次(var
关键字也可能丢失,除非它在函数外声明)。也许您应该在var opts = new Array()
循环之外写for
,然后在opts[x]
循环内分配到for
?