记得05年做项目遇到过这种情况,发现客户端关掉kv300和瑞星的网页监控选项能够解决问题,因为是集团和供应商之间的系统,没有深究原因,而是要求用户关闭杀毒软件的网页监控选项
不久前的项目又遇到这个情况,卡巴会拦截ajax调用请求。将http header的connection设置为close可以解决问题:xmlHttp.setRequestHeader('Connection', 'close');。
两次发生这种情况时都不是使用第三方js库,而是直接用xmlhttp实现。使用jQuery和Prototype的时候好像没有遇到过,查了一下jQuery里面的ajax没有对Connection进行设置,而Prototype则给出了一段,说针对老板本Mozilla的一个bug而将Connection设为close。http1.1的Connection默认为persistent connection,既然jQuery和Prototype不会出问题,则说明卡巴的拦截规则为:connection要么为close;如果使用persistent connection,则其它某些header必须符合要求,否则一律拦截。
2. IE Operation aborted
参考Dealing with IE Operation Aborted
<html>
<head>
<script type="text/javascript">
function appendToBody() {
var div = document.createElement('div');
div.innerHTML = "Operation aborted!";
document.body.appendChild(div);
}
</script>
</head>
<body>
<form>
<script type="text/javascript">
appendToBody();
</script>
</form>
</body>
</html>
IE打开这个文档就会出现"Operation aborted"错误信息,解决方法1.为script标签加上defer属性,2.让script标签属于body的直接子节点。defer属性只针对IE有效,并且导致在IE中script的执行被延迟,而其它浏览器下则不会,因此需要注意多浏览器下的副作用<head>
<script type="text/javascript">
function appendToBody() {
var div = document.createElement('div');
div.innerHTML = "Operation aborted!";
document.body.appendChild(div);
}
</script>
</head>
<body>
<form>
<script type="text/javascript">
appendToBody();
</script>
</form>
</body>
</html>
3. jQuery的selector,文档中有可能同一id出现多个地方时,一定要指定context,即$(selector, context)
因为很多地方都需要弹出窗口选择用户、选择组织结构等类似功能,没有使用window.open,而是用jQuery做了一个div弹窗的封装,外层div包装了弹出窗口的标题栏、按钮、3D边框效果、drag/drop、ajax调用、统一的使用接口等,里面有个id为dataArea的div,用ajax调用具体的查询页面将html填入其中。问题发生在同一个页面需要多个这样的弹出窗口,导致dataArea这个id存在多个对象,selector中不使用context时,多次弹出时竟然循环交替的获取到各个dataArea对象
javascript组件用的多而复杂时,相关的一些问题跟线程安全一样重要而复杂