为什么这个脚本返回“'空'不是一个对象'?

问题描述:

请问您为什么这个脚本正在返回正确的方向指向我'null' is not an object为什么这个脚本返回“'空'不是一个对象'?

<script> 
var pageDetailsSecond = "aaaaa"; 
if(pageDetailsSecond.match("&center=(.*)&zoom=").length) { 
    var mapSrc = pageDetailsSecond.match("&center=(.*)&zoom="); 
    var mapSrc = mapSrc.split(","); 
    var card_Latitude = mapSrc[0]; 
    var card_Longitude = mapSrc[1]; 
} 
else { 
    var card_Latitude = ''; 
    var card_Longitude = ''; 
} 
</script> 

感谢您的任何帮助。

+1

'pageDetailsS​​econd.match(“&center =(。*)&zoom =”)'评估为null,然后尝试使用null.length。请参阅http://jsfiddle.net/9wLkbnch/ – 2014-09-26 23:46:29

+0

哪个浏览器? - – 2014-09-26 23:47:23

+0

@Felix Kling:Safari。 – roberto 2014-09-26 23:48:04

"aaaaa".match("&center=(.*)&zoom=")为空因此,您的.length调用将失败。

试着改变你的代码是这样的:

<script> 
var pageDetailsSecond = "aaaaa"; 
var matches = pageDetailsSecond.match("&center=(.*)&zoom="); 
if(matches != null && matches.length > 1) { 
    var mapSrc = matches[matches.length - 1]; 
    var mapSrc = mapSrc.split(","); 
    if(mapSrc.length == 2) { 
     var card_Latitude = mapSrc[0]; 
     var card_Longitude = mapSrc[1]; 
    } 
} 
else { 
    var card_Latitude = ''; 
    var card_Longitude = ''; 
} 
</script> 
+0

该测试可以是“如果(匹配)”。为什么长度必须大于1? – RobG 2014-09-27 00:01:57

+0

@RobG只是彻底,因为在下一行有索引访问。 (信任和验证原则。) – Candide 2014-09-27 00:09:28

+0

如果没有匹配,*匹配*将为空。如果有任何匹配,其长度将至少为1.上述内容将跳过只有一个匹配的情况(即长度为1)。 – RobG 2014-09-27 07:36:02

您的pageDetailsSecond.match("&center=(.*)&zoom=")null所以它没有length属性。因此,当您尝试检查它时发生错误length

试试这个:

if(pageDetailsSecond.match("&center=(.*)&zoom=") !== null) { 

match将返回null如果没有匹配的,你可以不写null.length。实际上,Chrome报告TypeError:无法读取空值为的属性“长度”。

这里有一个解决方案,正则表达式修复沿:

var pageDetailsSecond = "aaaaa"; 
var mapSrc = pageDetailsSecond.match("&center=(.+?),(.+?)&zoom="); 
if (mapSrc) { 
    var card_Latitude = mapSrc[1]; 
    var card_Longitude = mapSrc[2]; 
} else { 
    card_Latitude = ''; 
    card_Longitude = ''; 
} 

我修改了正则表达式,所以你不必split之后。

有两件事情你必须在这里解决。

首先,你的条件语句假定.length属性,但该.match()方法返回一个值null当它没有找到一个匹配(因此,没有.length属性)。有关.match()的详细信息,请查看this MDN page

其次,在您的正则表达式中,您已将匹配的lat,lng(.*)分组。这意味着.match()将返回数组与2场比赛 - 第一个将匹配整个表达式,第二个将匹配您的组:

["&center=34,-83&zoom=", "34,-83"] 

你感兴趣的第二场比赛。下面是一个工作示例:

<script> 
var pageDetailsSecond = "&center=34,-83&zoom=", 
    matches = pageDetailsSecond.match("&center=(.*)&zoom="); 

if(matches) { 
    var mapSrc = matches[1].split(","); 
    var card_Latitude = mapSrc[0]; 
    var card_Longitude = mapSrc[1]; 
} 
else { 
    var card_Latitude = ''; 
    var card_Longitude = ''; 
} 
</script>