最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

升級(jí)到j(luò)Query?3.6.1遇見的一些坑以及應(yīng)對(duì)辦法

 更新時(shí)間:2023年06月10日 09:10:06   作者:musicwind  
Jquery低版本存在安全漏洞,所以需要升級(jí)版本,下面這篇文章主要給大家介紹了關(guān)于升級(jí)到j(luò)Query?3.6.1遇見的一些坑以及應(yīng)對(duì)辦法的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

項(xiàng)目因安全問題(jquery 早期版本存在XSS 漏洞),需要整體將 jQuery 從 1.7.2 升級(jí)到 3.6.1 。早前就因?yàn)?jQuery 的版本兼容性不佳,因此對(duì)于版本升級(jí)的事情,能拖則拖。但升級(jí)的事情,總歸是要做的,何況項(xiàng)目上因?yàn)榧追街匾暟踩?,?duì)于中等風(fēng)險(xiǎn)的安全也必須解決、規(guī)避,因此這回是硬著頭皮上了。

第一階段的問題,就是各種不兼容,各種不順。好在同事方法多,路子廣,找到了一個(gè) jquery-migrate-3.4.0.js 文件,專治新舊版本兼容的 包,解決了大多數(shù)的問題。UI 界面總算能跑起來,能看得著了。

但是接下來,陸續(xù)遇到了幾個(gè)問題:

問題一:curCSS 方法找不到問題

解決方法:

    jQuery.curCSS = function(element, prop, val) {
        return jQuery(element).css(prop, val);
    };

問題二:UI 布局錯(cuò)誤,多處動(dòng)態(tài)計(jì)算 div 占用的寬度、高度 進(jìn)行自適應(yīng)布局的頁(yè)面都拉跨了。

仔細(xì)分析后發(fā)現(xiàn),罪魁禍?zhǔn)壮霈F(xiàn)在  outerWidth 和 outerHeight 方法上。

這兩個(gè)方法,老版本 jquery (以 1.7.2 為例),例如調(diào)用 $("body").outerWidth() ,是可以返回整數(shù)值的。但是新版的方法,如果不帶參數(shù),則返回 元素的 jQuery 對(duì)象。 而由于程序?qū)⒅暈?int 參與計(jì)算,因此導(dǎo)致后續(xù)計(jì)算錯(cuò)誤,界面布局拉跨也就難免了。

另外,老版本 jQuery  對(duì)于查找器搜索不到的情況,比如 $("#不存在的id").outerWidth() 是會(huì)返回 0 的,因?yàn)閷⒁粋€(gè)不存在的元素的寬度視為0,也算是容錯(cuò)的,但是新版本在這種情況下,直接返回 undefined,這也會(huì)造成一些代碼上的問題。

OK,知道原因,就可以有解決方案,如下:

	var oldOuterWidth = jQuery.fn.outerWidth;
	
	jQuery.fn.outerWidth =function(  ) {
		
		if (arguments.length <= 0) {
			arguments[0] = false;
			arguments.length = 1;
		}
		
		var result = oldOuterWidth.apply( this, arguments ) ;
		return result === undefined ? 0 : result;
	};
 
	var oldOuterHeight = jQuery.fn.outerHeight;
	jQuery.fn.outerHeight =function(  ) {
		
		if (arguments.length <= 0) {
			arguments[0] = false;
			arguments.length = 1;
		}
		
		var result =  oldOuterHeight.apply( this, arguments );
		return result === undefined ? 0 : result;
	};	

問題三、添加 html 內(nèi)容 出錯(cuò),頁(yè)面元素 層次錯(cuò)亂。

比如,有以下代碼:

$("body").append('<div><i class="c1" /><span>ok</span></div>');

在舊版 jQuery 當(dāng)中,頁(yè)面內(nèi)容渲染得到:

<div><i class="c1"></i><span>ok</span></div>

但是在新版 jQuery 3.6.1 里得到的卻是:

<div><i class="c1"><span>hello</span></i></div>

兩者差別就是,針對(duì) <i /> 的寫法,渲染有不同。

造成這個(gè)差異的原因是什么呢?我們拋開 jQuery ,試試原生 JS 的效果:

document.children[0].children[1].innerHTML = '<div><i class="c1" /><span>ok</span>';

結(jié)果渲染得到的與 jQuery 3.6.1 是一致的。也就是針對(duì) <i /> 這種寫法,HTML 5 是不認(rèn)的,因?yàn)?<i> 本身不屬于 HTML5 非閉合標(biāo)簽 (所謂 非閉合標(biāo)簽,是類似 <meta> <br> 這種,數(shù)量有限),則 渲染引擎 將 <i /> 視為未閉合。實(shí)際上 <element /> 的寫法,屬于 XHTML ,而不是 HTML5 的規(guī)范。

奇怪的是,為啥舊版 jQuery 我們用著就沒有問題,難道它在 append 方法里做了什么特殊處理? 

排查了源碼,果不其然。如下:

// Convert html string into DOM nodes
			if ( typeof elem === "string" ) {
				if ( !rhtml.test( elem ) ) {
					elem = context.createTextNode( elem );
				} else {
					// Fix "XHTML"-style tags in all browsers
					elem = elem.replace(rxhtmlTag, "<$1></$2>");

注釋上明確說了 Fix "XHTML"-style tags in all browsers  。哎,我們這些一直誤用的人啊,被老版本 jQuery 保護(hù)的太好了!

OK,為了確保此前的UI代碼能繼續(xù)使用,我們還是要得來個(gè)解決方案:

	var oldAppend = jQuery.fn.append;
	
	jQuery.fn.append =function(  ) {
		
		/**
		 * 相關(guān)素材來自 jquery 1.7.2 
		 */
		var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig;
		
		if (arguments.length > 0 
			&& typeof(arguments[0]) == "string" ) {
			var elem = arguments[0];
			elem = elem.replace(rxhtmlTag, "<$1></$2>");
			arguments[0] = elem;
		}
		
		return oldAppend.apply( this, arguments );
	};

至此,遇到的不兼容問題基本都解決了。我們將包含前述問題的解決辦法,匯總到 以下 js 代碼里,需要的各位可以自取。

 
( function() { 
	
	/**
	 * 注意,以下代碼,應(yīng)確保 引用在 jquery 3.6.1, jquery-migrate-3.4.0.min.js,以及 jquery-ui-1.8.10.custom.min.js 等內(nèi)容之后,否則
	 * 相關(guān)的 代碼托管 可能會(huì)被取代 而 無效。   
	 */
	
	jQuery.curCSS = function(element, prop, val) {
	    return jQuery(element).css(prop, val);
	};
	
	/**
	 *  James add on 2022.11.24 , 相關(guān)代碼摘錄自 jquery 1.7.2
	 *  此 修復(fù)是為了 兼容 以下有關(guān)寫法,在 append 到 jquery 對(duì)象里時(shí),能適應(yīng) 老版本的渲染邏輯。
	 *     $.append("<div><i class='abc' /> <span>ttt</span></div>");
	 *   上述內(nèi)容,在 jquery 1.7.2 版本里,會(huì)被渲染為:
	 *     <div><i class='abc'></i><span>ttt</span></div>
	 *    
	 *    而在 jquery 3.6.1 里,則會(huì)被渲染為:
	 *    <div><i class='abc'><span>ttt</span></i></div>
	 *    
	 *    這是由于 在 舊版 jquery 里,針對(duì) 非閉合的標(biāo)簽有過特定處理,而在 jquery 3.6.1  里則移除了這個(gè)做法。
	 *    因此直接在 element 的 innterHtml 里面寫入 <div><i class='abc' /> <span>ttt</span></div> 這個(gè)內(nèi)容,
	 *    與 3.6.1 里面是一致的。
	 *    
	 *    所以根本上是不規(guī)范的 html 寫法,只是老版本 jquery 做了容錯(cuò),而新版本沒有容錯(cuò),因而導(dǎo)致問題。
	 *     
	 */
	var oldAppend = jQuery.fn.append;
	
	jQuery.fn.append =function(  ) {
		
		/**
		 * 相關(guān)素材來自 jquery 1.7.2 
		 */
		var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig;
		
		if (arguments.length > 0 
			&& typeof(arguments[0]) == "string" ) {
			var elem = arguments[0];
			elem = elem.replace(rxhtmlTag, "<$1></$2>");
			arguments[0] = elem;
		}
		
		return oldAppend.apply( this, arguments );
	};
	
	
	var oldOuterWidth = jQuery.fn.outerWidth;
	
	jQuery.fn.outerWidth =function(  ) {
		
		if (arguments.length <= 0) {
			arguments[0] = false;
			arguments.length = 1;
		}
		
		var result = oldOuterWidth.apply( this, arguments ) ;
		return result === undefined ? 0 : result;
	};
 
	var oldOuterHeight = jQuery.fn.outerHeight;
	jQuery.fn.outerHeight =function(  ) {
		
		if (arguments.length <= 0) {
			arguments[0] = false;
			arguments.length = 1;
		}
		
		var result =  oldOuterHeight.apply( this, arguments );
		return result === undefined ? 0 : result;
	};	
	
})();

注意,上述代碼在頁(yè)面中的引入,應(yīng)確保在 jquery 3.6.1, jquery-migrate-3.4.0.min.js,以及 jquery-ui-1.8.10.custom.min.js 等內(nèi)容之后,否則可能會(huì)被取代而無效。 

總結(jié)

到此這篇關(guān)于升級(jí)到j(luò)Query 3.6.1遇見的一些坑以及應(yīng)對(duì)辦法的文章就介紹到這了,更多相關(guān)升級(jí)jQuery 3.6.1的坑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • 在JavaScript的jQuery庫(kù)中操作AJAX的方法講解

    在JavaScript的jQuery庫(kù)中操作AJAX的方法講解

    這篇文章主要介紹了在JavaScript的jQuery庫(kù)中操作AJAX的方法講解,包括利用jQuery簡(jiǎn)化Ajax開發(fā)部分的內(nèi)容,需要的朋友可以參考下
    2015-08-08
  • jQuery事件 delegate()使用方法介紹

    jQuery事件 delegate()使用方法介紹

    delegate() 方法為指定的元素(屬于被選元素的子元素)添加一個(gè)或多個(gè)事件處理程序,并規(guī)定當(dāng)這些事件發(fā)生時(shí)運(yùn)行的函數(shù)
    2012-10-10
  • jQuery插件FusionCharts繪制的3D環(huán)餅圖效果示例【附demo源碼】

    jQuery插件FusionCharts繪制的3D環(huán)餅圖效果示例【附demo源碼】

    這篇文章主要介紹了jQuery插件FusionCharts繪制的3D環(huán)餅圖效果,結(jié)合完整實(shí)例形式分析了jQuery使用FusionCharts載入xml格式數(shù)據(jù)繪制圖形的操作步驟與相關(guān)實(shí)現(xiàn)技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下
    2017-04-04
  • 頁(yè)面元素綁定jquery toggle后元素隱藏的解決方法

    頁(yè)面元素綁定jquery toggle后元素隱藏的解決方法

    元素綁定jquery中的toggle后,元素隱藏,開始的時(shí)候 我怎么也沒想到是這里有問題,我找了半天才發(fā)現(xiàn)是因?yàn)榻壎藅oggle方法
    2014-03-03
  • jQuery插件formValidator實(shí)現(xiàn)表單驗(yàn)證

    jQuery插件formValidator實(shí)現(xiàn)表單驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了jQuery插件formValidator實(shí)現(xiàn)表單驗(yàn)證的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • js/jquery判斷瀏覽器類型的方法小結(jié)

    js/jquery判斷瀏覽器類型的方法小結(jié)

    有些時(shí)候需要根據(jù)瀏覽器來寫樣式,所以要判斷一下瀏覽器類型,百度了一下,才知道JQuery有個(gè)方法直接判斷,并附上原生的js的判斷方法,分享給大家,有需要的小伙伴可以參考下。
    2015-05-05
  • 基于jquery自定義圖片熱區(qū)效果

    基于jquery自定義圖片熱區(qū)效果

    前陣子接到個(gè)需求,聯(lián)通網(wǎng)上營(yíng)業(yè)廳經(jīng)常需要專題頁(yè)面做宣傳,但是由于專題頁(yè)面會(huì)有按鈕,以及各個(gè)圖片的鏈接,省分的人沒有html基礎(chǔ),沒人維護(hù),量又比較大,需要開發(fā)出一個(gè)可自定義圖片熱區(qū)鏈接的后臺(tái),于是就有了這個(gè)
    2012-07-07
  • jQuery實(shí)現(xiàn)導(dǎo)航回彈效果

    jQuery實(shí)現(xiàn)導(dǎo)航回彈效果

    本文主要介紹了jQuery實(shí)現(xiàn)導(dǎo)航回彈效果的實(shí)例,具有很好的參考價(jià)值,下面跟著小編一起來看下吧
    2017-02-02
  • 對(duì)于this和$(this)的個(gè)人理解

    對(duì)于this和$(this)的個(gè)人理解

    this指的是javascript對(duì)象而$(this)就是就jquery對(duì)象,不懂的朋友可以看看本文
    2013-09-09
  • 基于JQuery 選擇器使用說明介紹

    基于JQuery 選擇器使用說明介紹

    本篇文章小編為大家介紹,基于JQuery 選擇器使用說明介紹。需要的朋友參考下
    2013-04-04

最新評(píng)論

临清市| 河西区| 同仁县| 翁源县| 闸北区| 蒙阴县| 平武县| 六盘水市| 新民市| 长寿区| 榕江县| 景谷| 昌江| 莎车县| 新源县| 屏边| 灵台县| 台湾省| 神木县| 永靖县| 郧西县| 利川市| 合肥市| 秦皇岛市| 噶尔县| 遵义市| 九寨沟县| 嘉荫县| 庆阳市| 锡林郭勒盟| 新蔡县| 穆棱市| 乐陵市| 昂仁县| 买车| 西平县| 民乐县| 石林| 阿鲁科尔沁旗| 贺兰县| 华阴市|