笔者在ECSHOP二次开发时,发现IE购物车结算时选择红包时AJAX回调函数不执行,而FF却是正常。最终虽然修改OK,但具体原因还是未知。请大写一起讨论讨论。
上述代码很简单,相信熟悉JQuery的朋友一定非常熟悉。但笔者一直不明白为什么原来的代码IE6会有问题,请大家踊跃赐教吧
原版的ecshop是没有这一问题的,但笔者使用了JQuery,才出现这一问题,具体JQuery是如何引用的,参见笔者的另一篇博文:ecshop jquery冲突解决方法。
废话不说,详情如下:
原始ECSHOP红包选择时的JS代码:shopping_flow.js
/* *
* 改变红包
*/
function changeBonus(val)
{
/* if (selectedBonus == val) // modify by zjm
{
return;
}
else
{
selectedBonus = val;
}*/
Ajax.call('flow.php?step=change_bonus', 'bonus=' + val, changeBonusResponse, 'GET', 'JSON');
}
/* *
* 改变红包的回调函数
*/
function changeBonusResponse(obj)
{
if (obj.error)
{
alert(obj.error);
try
{
document.getElementById('ECS_BONUS').value = '0';
}
catch (ex) { }
}
else
{
orderSelectedResponse(obj.content);
}
}
AJAX调用代码在changeBonus函数内,IE6中死活不执行回调函数changeBonusResponse,调试时在Ajax.call函数前后加上alert代码,alert代码均正常显示,说明JS代码正常执行,如果有错误的话JS代码会终止,或者说至少后一个alertr代码不会执行。而FF一切正常。
若在changeBonusResponse函数内第一行加上alert代码,IE也不执行。
以上两个问题说明IE中回调函数未执行,但JS也未报错,笔者一直不明白原因。但解决问题还是有办法的,就是不用ECSHOP自身的AJAX调用,改用JQuery的调用:
/* *
* 改变红包
*/
function changeBonus(val)
{
/* if (selectedBonus == val) // modify by zjm
{
return;
}
else
{
selectedBonus = val;
}*/
//Ajax.call('flow.php?step=change_bonus', 'bonus=' + val, changeBonusResponse, 'GET', 'JSON');
$.get('flow.php?step=change_bonus&bonus=' + val, changeBonusResponse);
}
/* *
* 改变红包的回调函数
*/
function changeBonusResponse(obj)
{ obj = eval('(' + obj + ')');
if (obj.error)
{
alert(obj.error);
try
{
document.getElementById('ECS_BONUS').value = '0';
}
catch (ex) { }
}
else
{
orderSelectedResponse(obj.content);
}
}
上述代码很简单,相信熟悉JQuery的朋友一定非常熟悉。但笔者一直不明白为什么原来的代码IE6会有问题,请大家踊跃赐教吧