问题总结: http200被Aborted

本文深入探讨了IE内核浏览器处理<a>标签时的异常行为,导致页面链接点击事件中断的原因及解决方案。通过分析不同浏览器的兼容性问题,提出在<a>标签的onclick事件上加入return false,使用#或javascript:void(0)替代常规href属性,以及引入event.preventDefault()等方法来优化用户体验。此外,文章还详细解释了这些方法在网络条件不佳时的局限性,旨在为开发者提供全面的解决策略。
部署运行你感兴趣的模型镜像

问题描述:

<a href="javascript:void(0);" class="rankItem"></a>
1. a标签的href="javascript:void(0);"
2.a标签点击事件主要js
$('.rankItem').bind('click',function(){
    ……
    $('').html('<img src="'+_data.picture+'"  class="itemImg'+inId+'">');
    ……
});

问题表现:
Fiddler抓包结果:  aborted  http://XXX/M00/CD/24/tz0M9VSSyHAAAAAAAABejGfCxMY531.jpg(资源链接) 200
Http请求虽然返回200,但当前页面发出的http请求还未返回的就被客户端主动断开链接(Aborted),导致响应资源不能被完全加载到页面,例如出现图片等资源没法加载的问题。

本质原因:
YY客户端的浏览器是IE内核, IE内核的浏览器,识别<a>标签的时,先去找  href  属性,并且先执行href中的链接或者函数,如果不识别就不做任何反应[IE最新版已经修改这个问题了]。IE内核有时候会不认href="javascript:void(0);" 因而触发不了事件函数,导致点击没有任何反应,有时候错误的认为页面刷新或者重定向,并且中断了当前所有连接,导致请求被客户端主动断开链接(Aborted)。 

临时解决方案:
延迟(100ms)执行页面资源的加载;
$('.rankItem').bind('click',function(){
    ……
     setTimeout(function(){
         $('').html('<img src="'+_data.picture+'"  class="itemImg'+inId+'">');
     },100);
    ……
});

临时解决方案原理和缺陷:
a标签的点击事件延迟100ms,页面的刷新或重定向在100ms内完成,100ms之后再对页面进行渲染,加载资源。
在网络条件比较好的情况下,这是没有问题的,但,如果所处的网络环境不好,在一定程度上是没办法保证该页面在100ms内可以返回,一旦100ms无法返回,就会执行a标签的 href="javascript:void(0);" ,从而把当前的页面进行重定向,而又当前页面发出的http请求(加载资源)但还未返回的就会被浏览器abort掉,因此这种方案在网络不好的时候会失效。

解决方案:
1、  onclick上加return false阻止浏览器执行 href="javascript:void(0);"  
<a href="javascript:void(0);" class="rankItem" onclick="return false;"></a>

2、  不用href="javascript:void(0);" 属性,相当于span标签,当然div或者span替换a标签也行,链接的手势可以通过样式style=“cursor:pointer;”。

番外方案:
event.preventDefault()。
该方法 用于取消事件的默认行为 ,存在浏览器兼容问题。
event.preventDefault()方法不被ie支持,在ie下需要用window.event.returnValue = false; 来实现。

function stopDefault( e ) { 
     if ( e && e.preventDefault ){ 
        e.preventDefault();
     } else { 
        window.event.returnValue = false;
     } 
}

问题拓展1:
链接的onclick事件<a>标签的写法通常有如下三种:
1.<a href="链接地址" ></a>
2.<a href="#" onclick="触发一个事件的函数"></a>
3.<a href="javascript:void(0);" onclick="触发一个事件的函数"></a>
     或<a href="javascript:;" onclick="触发一个事件的函数"></a>

不同浏览器中<a>标签的兼容性
 对于非IE内核浏览器 而言,3种写法都是可以的,基本没有什么区别。 对于IE浏览器或者IE内核的浏览器而言则不同:这不同主要体现在第2和3这二种写法上。  第3种IE内核有时候会不认  href="javascript:void(0);" 因而触发不了事件函数,导致点击没有任何反应。

第2、3种的区别:
"#"包含了一个位置信息,默认的锚点是#top 也就是网页的上端。 javascript:void(0) 仅仅表示一个死链接, 这就是为什么有的时候页面很长浏览链接明明是#可是跳动到了页首。 而javascript:void(0) 则不是如此,所以调用脚本的时候最好用void(0),或者<span onclick> <div onclick>等, 采用这个方式 javascript:void(0) 实现点击事件时, 运行起来,如果页面内容很多,有滚动条时,页面不会乱跳,用户体验更好。

问题拓展2
尽量不要用javascript:协议做为a的href属性,这样不仅会导致不必要的触发window.onbeforeunload事件,在IE里面更会使gif动画图片停止播放。

问题拓展3
event.preventDefault() 可以处理ie firefox下图片拖动的问题。
document.onmousemove = function(ev) {  
        var oEvent = ev || event;
        if (oEvent.preventDefault) {
            oEvent.preventDefault();
        } else {
            oEvent.returnValue = false;
        }
}

附件:
     





您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 解决方案 `urllib3.exceptions.ProtocolError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))` 是一种常见的网络通信错误,通常发生在客户端与服务器之间的连接意外终止时。以下是可能的原因以及对应的解决方案: #### 可能原因分析 1. **网络不稳定** 客户端与服务器之间可能存在短暂的网络波动或中断,导致连接被强制关闭[^1]。 2. **目标服务器负载过高** 如果目标服务器的压力过大或者资源不足,可能会主动断开部分连接以减轻负担[^2]。 3. **防火墙或代理干扰** 中间设备(如公司内部的防火墙、路由器或其他安全机制)可能导致数据包丢失或阻止正常通信[^4]。 4. **DNS解析失败** URL中的域名未能成功解析成IP地址,从而引发后续的一系列问题[^5]。 --- #### 针对性解决方案 ##### 方法一:增加重试次数和超时时间 通过设置 `requests` 或 `urllib3` 的参数来增强请求的鲁棒性。可以配置更高的超时时间和更多的重试机会。 ```python import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session = requests.Session() retry_strategy = Retry( total=5, backoff_factor=1, status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["HEAD", "GET", "OPTIONS"] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) url = "https://example.com" try: response = session.get(url, timeout=(10, 30)) print(response.text) except Exception as e: print(f"Request failed with exception: {e}") ``` 上述代码中设置了最大重试次数为5次,并定义了特定状态码下的自动重试逻辑。 --- ##### 方法二:检查本地环境配置 如果是在开发环境中遇到该问题,则需排查是否存在以下情况: - **中间件冲突** 如引用[5]所示,在Django项目中某些中间件(例如 CSRF 防护)可能会影响正常的HTTP请求行为。可以通过临时禁用这些中间件来进行测试。 - **依赖库版本不匹配** 使用较旧版本的 `requests` 或 `urllib3` 库也可能触发此类异常。建议升级到最新稳定版: ```bash pip install --upgrade requests urllib3 ``` --- ##### 方法三:验证目标服务可用性 确认目标网站是否能够正常访问。可借助命令行工具 ping 测试连通性和延迟状况;另外利用 curl 命令模拟 GET 请求查看返回结果。 ```bash ping example.com curl -v https://example.com ``` 假如发现对方站点频繁宕机或者拒绝外部链接,则需要联系其管理员寻求进一步解释说明[^3]。 --- ##### 方法四:捕获并处理具体异常 针对不同类型的异常分别编写针对性强的日志记录语句以便于定位根本原因所在位置。 ```python import requests from requests.packages.urllib3.exceptions import ProtocolError url = "https://example.com" for attempt in range(3): # 尝试三次 try: response = requests.get(url) if response.status_code == 200: break elif attempt < 2: continue else: raise ValueError("Maximum retries exceeded.") except ProtocolError as pe: print(f"Protocol Error occurred on attempt #{attempt}: ", str(pe)) except ConnectionError as ce: print(f"Connection Error encountered during retry cycle: ", repr(ce)) finally: pass ``` 此脚本片段展示了如何优雅地应对各种潜在风险因素的同时保持良好的用户体验流畅度. --- ### 总结 综上所述,解决 `urllib3 ProtocolError Connection aborted RemoteDisconnected` 错误可以从优化代码设计、调整运行环境两方面入手。务必结合实际场景灵活运用以上提到的技术手段直至彻底消除故障现象为止。 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值