我一直在讨论这个问题,我通常是一个jQuery chap,但是我有一个使用原型的Magento扩展,并且在如何解决这个错误方面有点迷失:
我收到错误:Uncaught TypeError: Cannot read property 'innerHTML' of undefined
我猜是因为我需要检查相关页面中是否存在某些HTML(每个页面上都会出现javascript文件,因此每次都可能没有相关的html 。
最初我收到spConfig undefined
这就是我放入if ((typeof spConfig == 'undefined') || !spConfig) {
行的原因
原始代码是:
document.observe("dom:loaded", function() {
if(spConfig.config.dynamics == 1 && spConfig.config.showbottom == 1){
$$('.product-options-bottom')[0].insert({top: new Element('p', {id:'bottom-avail', class:'availability'}).update($$('p.availability')[0].innerHTML)});
if(spConfig.config.showship == 1){
$('bottom-avail').insert({after: new Element('p', {id:'bottom-shipsin', class:'shipsin'}).update($$('p.shipsin')[0].innerHTML)}); }
}
});
我尝试过改为
document.observe("dom:loaded", function() {
if ((typeof spConfig == 'undefined') || !spConfig) {
} else {
if(spConfig.config.dynamics == 1 && spConfig.config.showbottom == 1){
if($$('p.availability') != 'undefined' ){
$$('.product-options-bottom')[0].insert({top: new Element('p', {id:'bottom-avail', class:'availability'}).update($$('p.availability')[0].innerHTML)});
}
if(spConfig.config.showship == 1){
if($$('p.shipsin') != 'undefined'){
$('bottom-avail').insert({after: new Element('p', {id:'bottom-shipsin', class:'shipsin'}).update($$('p.shipsin')[0].innerHTML)});
}
}
}
}
});
但是我仍然收到错误Uncaught TypeError: Cannot read property 'innerHTML' of undefined
指向第$$('.product-options-bottom')[0].insert({top: new Element('p', {id:'bottom-avail', class:'availability'}).update($$('p.availability')[0].innerHTML)});
行
答案 0 :(得分:1)
因为$$()
方法返回与CSS选择器匹配的元素的列表(或数组),您无法检查它是否为undefined
- 但您可以检查列表中返回的元素数。 / p>
所以试试这个
if($$('p.availability').length != 0)
{
$$('.product-options-bottom')[0].insert(
{
top: new Element('p', {id:'bottom-avail', 'class':'availability'}).update(
$$('p.availability')[0].innerHTML
)});
}
class
中的new Element()
属性也应该在字符串中,因为class是某些浏览器中的关键字,也将成为ECMA 6中核心Javascript语言的一部分