谈谈关于Jquery中html()方法设计不合理的地方技术
关于 JavaScript 的动态技术,最熟悉的莫过于 DOM 的 innerHTML 操作。这个是让网页动态的最重要最基础的功能。当我们做后台的时候,所以完全不用做 SEO,这样后台的代码尽量动态化和异步加载,异步加载一般不一定全部都是 JSON 格式,很多时候直接加载 HTML 网页也是非常常见的。这种动态加载过来的网页要嵌入到原网页中,如果不用 Jquery 提供的 html() 方法,只能使用原生的 innerHTML 操作了。
有点经验的人一定会遇到这样的问题,Ajax 技术加载过来的网页中包含 JavaScript 代码或者 SCRIPT 标签。这样的需求是很常见的,比如某个特效或者某个 JS 文件只服务与某个网页,就没有必要一开始就全部加载,而应该是按照需要加载,当用户触发了之后再加载那个 JS 文件。如果不使用 Jquery,你一定会遇到一个问题,就是 JavaScript 代码不会执行,Script 标签不会被解析加载。如果您是个前端工程师,并且你不知道这个问题,我觉得你一定很可悲,但是我敢确定,至少有 50% 的前端工程师不知道这个问题(在如今前端技术被各种框架占据的时代,大部分人都是不知道所以然的)。当然比较厉害并且不愿意使用 Jquery 的牛人也一定可以很容易的解决这个问题,那就是匹配内容中的 JavaScript 代码然后使用 eval 或者 evalScript 方法来执行它,这个也是和 Jquery 的 html() 方法的解决方案是一样的。
Jquery 框架的 html() 方法除了解决了上述的不执行的问题之外,还做了其他的一些事情,比如保证 Js 代码的依次执行。我觉得依次执行挺好的,特别是当项目中没有能够保证依次执行的代码库时。最近测试发现,当 Ajax 动态返回的 HTML 中含有 script 标签时,Jquery 的 html() 方法会自动将 script 标签中的 src 属性加上参数 _={timestamp}。针对这个自动加参数的事情,我个人认为是 Jquery 设计的败笔,加上参数后,浏览器每次都会去重新加载一次 JS 文件,如果是这样的结果,还不如直接将代码装载在 script 标签中。如果用户真的需要重新加载 JS,可以在返回的页面内容中手动加上参数,完全没有必要这样做。
如果想不被 Jquery 自动加参数的问题影响到,可以使用 script 标签装载代码块解决。但是这样每次返回的页面都比较大,比较浪费性能和速度。要解决这个问题,可以使用 LMLJS 框架的 loadJs 方法来加载,loadJs 能够控制是否重复加载问题。详细请搜索 LMLJS 框架。