加入收藏 | 设为首页 | 会员中心 | 我要投稿 吕梁站长网 (https://www.0358zz.com/)- 行业物联网、运营、专有云、管理运维、大数据!
当前位置: 首页 > 教程 > 正文

jquery的load方法有哪些劣势

发布时间:2023-07-21 11:00:21 所属栏目:教程 来源:未知
导读:   本篇内容介绍了“jquery的load方法有哪些缺陷”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大
  本篇内容介绍了“jquery的load方法有哪些缺陷”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
 
  jquery load方法的缺陷:1、load方法会自动忽略掉head、body、script标签;2、动态加载后会出现滚动条偏移的问题,只需在load方法的回调函数里面加入“$(document).scrollTop(0);”即可解决;3、由于网络延迟等问题,先执行哪句代码并不确定;4、有缓存问题;5、会出现结构破坏问题。
 
  jquery load()方法可以帮我们把页面重复的文档部分,比如标题栏和底部信息部分。我们可以提取到一个模板html,然后通过load方法动态加载到每个页面。在使用的过程中遇到几个问题
 
  缺陷1:load方法会自动忽略掉head、body、script标签
 
  1、如果想加载head和body里面的文档内容,可以通过将内容包裹在一个div中,然后将其加载过来
 
  2、script部分我们可以通过load方法的回调函数动态创建加载进来
 
  3、不建议动态加载样式表,否则会出现页面闪现的问题,即页面刷新时,出现1秒钟没渲染样式的画面,然后再恢复正常画面(原因同下)
 
  缺陷2:动态加载后会出现滚动条偏移的问题
 
  刷新页面时。滚动条偏移。
 
  一般情况下,我们会把script文件放在文档body最后面,避免js阻塞浏览器渲染,这就导致我们会在页面渲染完后再执行我们的load方法,动态加载的页面也就是最后才加上去的,滚动条一开始就是固定在最上面的,动态加载header部分后,滚动条会偏下,并没有回到顶部
 
  解决
 
  在load方法的回调函数里面加入$(document).scrollTop(0);
 
  或者利用script标签的async属性,让js脚本异步加载,然后即可将script放在头部
 
  缺陷3: 异步加载问题
 
  由于load是异步触发的,以下方法中的2行代码都是同时并发执行的,由于网络延迟等问题,哪句先执行并不确定.
 
  而id为templateId的<div id="templateId">init</div>元素又是通过load加载进来的.
 
  如果是后面第3行的$("#templateId").html("hellow");先执行,那么由于$("#templateId")找不到(此时尚未加载完div),其实并不会执行html("hellow")操作.
 
  function load(targetId,templateName) {
 
      $("#"+targetId).load(contextPath+templateName);
 
      $("#templateId").html("hello");
 
  }
 
  缺陷4: 缓存问题
 
  由于很多浏览器为了降低请求服务器的负荷,做了同样的请求地址,从本地缓存取历史数据的优化.所以我们需要在地址后面添加一些动态后缀.
 
          function load(targetId,templateName) {
 
              var nowDate = new Date();
 
              var randomId = nowDate.getTime();//防缓存
 
              $("#"+targetId).load(contextPath+templateName+"?"+randomId);
 
          }
 
  缺陷5: 结构破坏问题
 
  在陷阱1(缓存问题)的基础上,可能还会遇到更深层次的问题,那就是当我们load加载得到的数据如果不符合<html>规范,那么就会破坏原有的dom结构,导致后续取dom和其它节点异常.
 
  比如原有
 
  <html>
 
   <head>
 
    <title>test</title>
 
   </head>
 
   <body>
 
      <textarea id="mytext"></textarea>
 
   </body>
 
  </html>
 
  如果load得到的数据为 <textarea><
 
  那么最终生成了为不规则的html闭包.下次再取dom时可能取不到了,因为破坏了原有的结构
 
  <html>
 
   <head>
 
    <title>test</title>
 
   </head>
 
   <body>
 
      <textarea id="mytext"><textarea><</textarea>
 
   </body>
 
  </html>
 
  此时我们可以改成
 
  function load(targetId,templateName) {
 
              var nowDate = new Date();
 
              var randomId = nowDate.getTime();//防缓存
 
              $("#"+targetId).load(contextPath+templateName+"?"+randomId,{},function (responseTxt){
 
                  $("#"+targetId).val(responseTxt);
 
              });
 
          }
 
  此时生成的html元素不会作为dom节点,而是作为文本域的原始文本插入,也就没有破坏原始dom.所以下次取值还是正常的
 
  <!doctype html>
 
  <html>
 
   <head>
 
    <title>test</title>
 
   </head>
 
   <body>
 
      <textarea id="mytext">"\<textarea\>\<"</textarea>
 
   </body>
 
  </html>
 

(编辑:吕梁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章