javascript是当今最愚蠢的体验
有人会认为,将3个字符的缩写转换为数字表示将是一项简单的任务。JavaScript说“不!” 即使代码有效且有效,我的控制台仍会出现以下错误: 未捕获的TypeError:无法调用未定义的方法“toString” 这完全没有意义,因为选择器的文本被正确替换(至少根据眼睛) 当我声明'monthStr'变量时,问题似乎就开始了。例如,如果我将其设置为静态“MAR”,并从“month”变量定义中删除“.toString()”,则错误不再发生 此外,保存代码的唯一方法是前面提到的my month变量的“.toString()”转换。如果它不在那里,我将得到一个“未定义”的值 我只是想和大家分享一下我在JavaScript方面的愚蠢经历,希望有人能详细说明为什么会抛出这个错误,即使代码工作得很完美。使用javascript是当今最愚蠢的体验,javascript,jquery,Javascript,Jquery,有人会认为,将3个字符的缩写转换为数字表示将是一项简单的任务。JavaScript说“不!” 即使代码有效且有效,我的控制台仍会出现以下错误: 未捕获的TypeError:无法调用未定义的方法“toString” 这完全没有意义,因为选择器的文本被正确替换(至少根据眼睛) 当我声明'monthStr'变量时,问题似乎就开始了。例如,如果我将其设置为静态“MAR”,并从“month”变量定义中删除“.toString()”,则错误不再发生 此外,保存代码的唯一方法是前面提到的my month变量的
trim
var monthStr = $(this).text().match(/[^\/]*/)[0];
monthStr = monthStr.trim();
var months = {
"JAN": 1,
"FEB": 2,
"MAR": 3,
};
var month = months[monthStr].toString();
alert(month);
使用trim
var monthStr = $(this).text().match(/[^\/]*/)[0];
monthStr = monthStr.trim();
var months = {
"JAN": 1,
"FEB": 2,
"MAR": 3,
};
var month = months[monthStr].toString();
alert(month);
问题很可能与以下方面有关:
$(选择器).each(函数(){…})代码>
选择器是什么,选择了多少个DOM对象?可能正在选择的DOM对象没有日期作为文本
下面是一个重现错误的示例:(请参阅控制台)
控制台:“未捕获的TypeError:无法调用未定义的”的方法“toString”
<p>MAR/26/2013</p>
<p>Hello world!</p>
$('p').each(function() {
var month = $(this).text().match(/[^\/]*/)[0];
var months = {
MAR: 3
};
alert(months[month].toString());
});
2013年3月26日
你好,世界
$('p')。每个(函数(){
var month=$(this.text().match(/[^\/]*/)[0];
风险值月份={
三月三日
};
警报(月[month].toString());
});
这是因为我们选择了两个
元素,只有一个元素的日期是文本
如果我们将代码限制为以文本形式显示日期的DOM对象,则效果良好:
2013年3月26日
var month=$('p').text().match(/[^\/]*/)[0];
风险值月份={
三月三日
};
警报(月[month].toString());
对于以日期为文本的元素,您应该使用CSS类,并且仅对这些元素使用CSS类,这样您就知道您正在选择什么。问题很可能与以下内容有关:
$(选择器).each(函数(){…})代码>
选择器是什么,选择了多少个DOM对象?可能正在选择的DOM对象没有日期作为文本
下面是一个重现错误的示例:(请参阅控制台)
控制台:“未捕获的TypeError:无法调用未定义的”的方法“toString”
<p>MAR/26/2013</p>
<p>Hello world!</p>
$('p').each(function() {
var month = $(this).text().match(/[^\/]*/)[0];
var months = {
MAR: 3
};
alert(months[month].toString());
});
2013年3月26日
你好,世界
$('p')。每个(函数(){
var month=$(this.text().match(/[^\/]*/)[0];
风险值月份={
三月三日
};
警报(月[month].toString());
});
这是因为我们选择了两个
元素,只有一个元素的日期是文本
如果我们将代码限制为以文本形式显示日期的DOM对象,则效果良好:
2013年3月26日
var month=$('p').text().match(/[^\/]*/)[0];
风险值月份={
三月三日
};
警报(月[month].toString());
对于以日期为文本的元素,您应该使用CSS类,并且只对这些元素使用CSS类,这样您就知道您在选择什么。我对您的代码做了一些轻微的改进,没有出现任何错误:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Test the script</title>
<script type="text/javascript" src="jquery-1.9.0.js"></script>
<script>
$(document).ready(function(){
$("div").each(function() {
// convert month abbreviation to numerical representation
var orgStr=$(this).text().trim().match(/[^\/]*/)[0];
var monthStr = orgStr.toUpperCase().substr(0,3);
console.log("monthStr is:", monthStr);
var months = {
JAN: 1,
FEB: 2,
MAR: 3,
APR: 4,
MAY: 5,
JUN: 6,
JUL: 7,
AUG: 8,
SEP: 9,
OCT: 10,
NOV: 11,
DEC: 12
};
if(months[monthStr]!==undefined){
var month = months[monthStr].toString();
var date = $(this).text().replace(orgStr, month);
$(this).text(date);
}
});
});
</script>
</head>
<body>
<div>JAN/22/2012</div>
<div>
JAN/22/2012</div>
<div>nope/22/2012</div>
<div>Feb/22/2012</div>
<div>dec/22/2012</div>
<div>jul/22/2012</div>
<div>
october/22/2012</div>
</body>
</html>
测试脚本
$(文档).ready(函数(){
$(“div”)。每个(函数(){
//将月份缩写转换为数字表示形式
var orgStr=$(this.text().trim().match(/[^\/]*/)[0];
var monthStr=orgStr.toUpperCase().substr(0,3);
log(“monthStr为:”,monthStr);
风险值月份={
1月1日,
二月二号,,
三月三日,
四月四日,
五月五日,
六月六号,,
七月七日,
八月八日,
九月九日,
10月10日,
11月11日,
十二月十二日
};
如果(月[月]!==未定义){
var month=月[monthStr].toString();
var date=$(this).text().replace(orgStr,month);
$(此).文本(日期);
}
});
});
2012年1月22日
2012年1月22日
否/22/2012
2012年2月22日
2012年12月22日
2012年7月22日
2012年10月22日
我对您的代码做了一些轻微的改进,没有出现任何错误:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>Test the script</title>
<script type="text/javascript" src="jquery-1.9.0.js"></script>
<script>
$(document).ready(function(){
$("div").each(function() {
// convert month abbreviation to numerical representation
var orgStr=$(this).text().trim().match(/[^\/]*/)[0];
var monthStr = orgStr.toUpperCase().substr(0,3);
console.log("monthStr is:", monthStr);
var months = {
JAN: 1,
FEB: 2,
MAR: 3,
APR: 4,
MAY: 5,
JUN: 6,
JUL: 7,
AUG: 8,
SEP: 9,
OCT: 10,
NOV: 11,
DEC: 12
};
if(months[monthStr]!==undefined){
var month = months[monthStr].toString();
var date = $(this).text().replace(orgStr, month);
$(this).text(date);
}
});
});
</script>
</head>
<body>
<div>JAN/22/2012</div>
<div>
JAN/22/2012</div>
<div>nope/22/2012</div>
<div>Feb/22/2012</div>
<div>dec/22/2012</div>
<div>jul/22/2012</div>
<div>
october/22/2012</div>
</body>
</html>
测试脚本
$(文档).ready(函数(){
$(“div”)。每个(函数(){
//将月份缩写转换为数字表示形式
var orgStr=$(this.text().trim().match(/[^\/]*/)[0];
var monthStr=orgStr.toUpperCase().substr(0,3);
log(“monthStr为:”,monthStr);
风险值月份={
1月1日,
二月二号,,
三月三日,
四月四日,
五月五日,
六月六号,,
七月七日,
八月八日,
九月九日,
10月10日,
11月11日,
十二月十二日
};
如果(月[月]!==未定义){
var month=月[monthStr].toString();
var date=$(this).text().replace(orgStr,month);
$(此).文本(日期);
var month = (months[monthStr]) ? months[monthStr].toString() : monthStr
$("div").each(function() {
// convert month abbreviation to numerical representation
var el = $(this);
var monthStr = el.text().match(/[^\/]*/)[0].trim();
var months = {
JAN: 1,
FEB: 2,
MAR: 3,
APR: 4,
MAY: 5,
JUN: 6,
JUL: 7,
AUG: 8,
SEP: 9,
OCT: 10,
NOV: 11,
DEC: 12
};
var month = (months[monthStr]) ? months[monthStr].toString() : monthStr;
el.text(el.text().replace(monthStr, month));
});