Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IE抛出JavaScript类型错误,但不在chrome上_Javascript_Jquery_Internet Explorer_Magento_Prototypejs - Fatal编程技术网

IE抛出JavaScript类型错误,但不在chrome上

IE抛出JavaScript类型错误,但不在chrome上,javascript,jquery,internet-explorer,magento,prototypejs,Javascript,Jquery,Internet Explorer,Magento,Prototypejs,说明 在我们的Magento购物车上,当用户在任何Internet Explorer浏览器上单击“产品详细信息”页面上的“添加到购物篮”按钮时,浏览器中会弹出一个带有以下错误消息的弹出窗口: 异常:TypeError:无法获取未定义或空引用的属性“标记名” 起初我认为这个错误是由AJAX调用引起的,但在浏览器调试器中进一步调查后,我发现这是JavaScript试图修改DOM节点/HTML标记及其属性时引起的 我在\mdl\u ajax\u confirmdiv上的所有子树和属性修改上设置断点,调

说明 在我们的Magento购物车上,当用户在任何Internet Explorer浏览器上单击“产品详细信息”页面上的“添加到购物篮”按钮时,浏览器中会弹出一个带有以下错误消息的弹出窗口:

异常:TypeError:无法获取未定义或空引用的属性“标记名”

起初我认为这个错误是由AJAX调用引起的,但在浏览器调试器中进一步调查后,我发现这是JavaScript试图修改DOM节点/HTML标记及其属性时引起的

我在
\mdl\u ajax\u confirm
div
上的所有子树和属性修改上设置断点,调用堆栈是:

ajax_cart.js:87
ajax_cart.js:89
ajax_cart.js:91
ajax_cart.js:97
ajax_cart.js:99
ajax_cart.js:104
ajax_cart.js:110
ajax_cart.js:112
ajax_cart.js:113
在IE中,它在
ajax\u cart.js:104上中断,并转到
prototype:1617
处理异常

因此,有问题的代码似乎是ajax\u cart.js:104,即:

$$('.block-cart').each(function (el){
  el.replace(mini_cart_txt);
  //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });
});
在Chrome中,它返回HTML,但在IE中,它在控制台中返回与弹出窗口相同的错误:无法获取未定义或空引用的属性“tagName”

问题

我检查了IE控制台,在执行ajax\u cart.js:104之前,
mini\u cart\u txt
var
就在那里,我认为问题来自
el
?我不知道如何修复它,或者这段代码到底发生了什么

下面是代码的其余部分,请提前感谢:)

代码

ajax_cart.js

全部未定义

91:$$('.top-link-cart').each(function (el){el.innerHTML = link_cart_txt; });
99: $$('.mini-cart').each(function (el){ el.replace(mini_cart_txt); //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });});
在所有对象上返回[object Array][]

97: var mini_cart_txt = $('mdl-temp-div').down('.cart_side_ajax').innerHTML;
104: $$('.block-cart').each(function (el){ el.replace(mini_cart_txt); //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 }); });
全部未定义

91:$$('.top-link-cart').each(function (el){el.innerHTML = link_cart_txt; });
99: $$('.mini-cart').each(function (el){ el.replace(mini_cart_txt); //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });});
在所有对象上返回[object Array][]

97: var mini_cart_txt = $('mdl-temp-div').down('.cart_side_ajax').innerHTML;
104: $$('.block-cart').each(function (el){ el.replace(mini_cart_txt); //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 }); });
无法在IE上获取未定义或空引用的属性“tagName”
在所有CHROME上返回HTML请检查标题类型是否有效

header('X-UA-Compatible: IE=edge,chrome=1');

好的,下面是你的代码在做什么,为什么你可能会得到一个错误,以及如何防止

首先是抛出错误的代码块

//$$ is the Prototype CSS selector, it returns an array of DOM elements that match the 
//CSS selector
//.each() loops through those DOM elements, el is each DOM element
$$('.block-cart').each(function (el){
  //el.replace attempts to replace the original element with the HTML of mini_cart_text
  el.replace(mini_cart_txt);
  //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });
});
如果
mini\u-cart\u-txt
不存在或可能是无效的HTML,则浏览器可能无法将与class
block-cart
匹配的元素替换为
mini\u-cart\u-txt
。根据上面第97行的结果,它看起来像是未定义的
,所以这可能是问题所在

尝试将替换循环包装到if语句中

if(mini_cart_txt != undefined)
{
    $$('.block-cart').each(function (el){
        el.replace(mini_cart_txt);
        //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });
    });
}
这可能会解决错误,但会禁用部分代码,因此另一个故障排除选项是

$$('.block-cart').each(function (el){
    //change the replace method with
    //el.replace(mini_cart_txt);
    //the update method which replaces the content of the element, instead of replacing the element
    el.update(mini_cart_txt);
    //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });
});

这可能会揭示更多有关问题的信息,并可能引导您找到解决方案。好的,经过多次尝试和错误,我发现了问题所在,并能够解决它

代码打断了ajax_cart.js的第104行,其中包含以下代码块:

$$('.block-cart').each(function (el){
  el.replace(mini_cart_txt);
  //new Effect.Opacity(el, { from: 0, to: 1, duration: 1.5 });
});
这段prototype.js正在DOM中搜索
.block cart
div,以替换为它的
mini\u cart\u txt
变量中设置的HTML。它使用该方法搜索DOM并使用
.block car
t类返回所有元素,然后使用
mini\u cart\u txt
变量替换它们的内容

问题是我们主题的HTML被修改了,现在包含了两个带有
.block cart
div的div

<div class="f-right block-cart span5">
    <div class="f-left block-cart header_cart margin-left20">[OMITTED CODE FOR BREVITY]</div>
    <div class="f-right checkout-button">[OMITTED CODE FOR BREVITY]</div>    
</div>
这就是IE中出现异常的原因,而不是Chrome。我不确定为什么Chrome跳过了这个异常。也许Chrome替换了第一个
.block cart
div,然后没有继续替换第二个
.block cart
div,后者是第一个的子级,而IE则陷入了一种导致异常的循环

无论如何,我能够通过从第一个block cart div的子div中删除
block cart
类名来解决这个问题

<div class="f-right block-cart span5">
    <div class="f-left header_cart margin-left20">[OMITTED CODE FOR BREVITY]</div>
    <div class="f-right checkout-button">[OMITTED CODE FOR BREVITY]</div>    
</div>

[为简洁起见省略了代码]
[为简洁起见省略了代码]

有时使用$$而不是$。这有特殊原因吗?不应该总是美元吗?然后,您也可以只使用$。@progsource代替jQuery,这一点很好。这不是我的剧本,它来自我们的Magento主题。我会检查一下只使用一美元是否会有所不同。Thanks@progsource当我将$$更改为$时,会出现另一个错误
无法获取未定义或空引用的属性“each”
。我不认为$$是一个问题,因为它在IE脚本的其他部分工作。。。我明白了-你里面不仅有jQuery-还有原型JavaScript框架(版本1.7)@progsource$$是@Emimpro,这到底是做什么的?它是否将IE的渲染引擎更改为chrome?网站正在使用
currently@Empiro,我尝试通过使用
修改HTML
将其更改为标题('X-UA-Compatible:IE=edge,chrome=1'),但没有成功:(@CreedBratton It不会将渲染引擎更改为chrome。以前有一个名为IE的插件,它在IE上运行类似chrome的引擎,以利用Google V8渲染引擎的增强功能和其他功能支持。不幸的是,它不再受支持,所以我可能不鼓励使用它因为这不再是一个可行的解决方案了。嗯,谢谢你的回答,这在早些时候会很有帮助,但我发现了问题并在下面回答了。谢谢你的帮助