笔者在ECSHOP二次开发时,发现IE购物车结算时选择红包时AJAX回调函数不执行,而FF却是正常。最终虽然修改OK,但具体原因还是未知。请大写一起讨论讨论。
原版的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会有问题,请大家踊跃赐教吧