jQueryの秘密
jQueryの特徴は何ですか?動的特殊効果、AJAX、プラグインによる拡張、便利なツール - ブラウザのバージョン検出、プログレッシブ拡張、チェーンコール、マルチブラウザのサポート、Internet Explorer6.0+、Opera9.0+、Firefox2+、Safari2.0+のサポート, Chrome1.0+(Internet Explorer6,7,8のサポートは2.0.0で中止されました)。
なぜ jQuery は直接 $ 操作でき、ネイティブ JS よりも便利な DOM 操作ができ、必要なだけ直接操作をチェーンできるのかと時々疑問に思うことがあります
コア フレームワーク
10,000 行を超えるコード jQuery コア コードを公開:
(function(window, undefined) {function jQuery(selector){return new jQuery.fn.init(selector) } jQuery.fn = jQuery.prototype = { init: function () { } } jQuery.fn.init.prototype = jQuery.fn;window.jQuery = window.$ = jQuery; })(window)
クロージャ構造はパラメータウィンドウを渡します
ウィンドウへの各内部参照のクエリ時間を短縮します
コードの圧縮に便利です
クロージャ構造は実際のパラメータウィンドウを渡し、仮パラメータを使用して受け取ります仮パラメータ
unknown
以前のバージョンの IE を使用するブラウザは、値を unfined に正常に割り当てることができるため、未定義の純粋性を保証するために、実際のパラメータを使用せずに仮パラメータの位置を指定し、それが未定義でなければならないことを保証します
jQuery パラメーター セレクター
セレクターは、ID、クラス、子孫、子孫などのタグのペアであり、jQuery オブジェクトにすることができます。
jQuery プロトタイプ オブジェクトの割り当て
jQuery のプロトタイプ メソッドを便利に拡張します
return インスタンス化プロトタイプ メソッド init
実際には $ を使用するたびに、新しい $() は必要ありません。
なぜ jQuery は独自のプロトタイプ メソッドを新しくする必要があるのでしょうか。返すために新しい他の関数が必要なので、独自の
jQuery プロトタイプ オブジェクトを使用して jQuery プロトタイプ メソッドのプロトタイプ init に値を割り当ててみてはいかがでしょうか
メソッドが内部的に jQuery プロトタイプに拡張されるたびに、init もこのメソッドがあると便利ですね? init にそのような $() がある場合、$() から出てくる jQuery オブジェクトもそこにありますか?
ウィンドウに公開される 利用可能なメンバー jQuery が公開された後、$
ウィンドウに対して、jQueryと$が直接グローバルに使える理由は、もちろんjQuery()を毎回使うこともできるからです
王道のセレクタ-Sizzle
です。もちろん、Sizzle だけを使用することもできます
前述のように、$(selector) のパラメーター セレクターは、id、class、descendant、descendant など、jQuery オブジェクトにすることができます。毎回、ワンクリックで必要な jQuery オブジェクトを取得できますか? はい、Sizzle のおかげで、さまざまな DOM オブジェクトを取得するためのメソッドがカプセル化され、それらを jQuery オブジェクトにパッケージ化されます
。 Sizzle 内にオブジェクトがあり、サポート オブジェクトにはブラウザーの機能の定期的なテストの結果が保存されます
機能に問題があるセレクター (複雑な判定コード) にはユニバーサル互換性ソリューションを使用します
正規
jQuery では正規表現がよく使用されます。正規表現を使用すると、データ処理の効率が大幅に向上します。
判断
列が HTML タグである可能性がある場合は、セレクター タグの DOM オブジェクト パッケージを直接作成して、それを jQuery オブジェクトとして返します
。 ID名、クラス名、タグ名などを取得し、Sizzleを通じてDOMオブジェクトを直接取得し、jQueryオブジェクトにパッケージ化して返します
判断はinit内のセレクターの種類を決定することです
パッケージ化
パッケージ化については何度も話しました。はい、jQuery オブジェクトは実際には擬似配列です。これはその設計の工夫でもあります。配列を使用してデータを保存すると、$( などのより多くのデータ処理を実行しやすくなります。 "div").css("color": "red") とすると、jQuery が暗黙的に反復処理を自動的にサポートし、ページ上のすべての div に含まれるテキストの色を赤に設定します。これは単純で粗雑なコード行です。 Ape のお気に入り
外部拡張拡張子
jQuery のコア構造が処理された後は、基本的に外部で使用できますが、jQuery 独自のスケーラビリティを含め、jQuery に基づいたプラグインを実装できることがわかっています。二次開発を容易にするために外部へのインターフェースを提供する必要があるため、extend メソッドを用意しています
単純な拡張は、それを組み込むことです。例えば:
function extend(obj) { var k; for(k in obj) { this[k] = obj[k]; } } Baiya.extend = extend; Baiya.fn.extend = extend;
静的メソッドと$.each などの各メソッドのインスタンスメソッドを使用することもできます。 $("div").each を使用することもできます
その後、いくつかの jQuery メソッドは extend をベースに拡張されます。 もちろん、これを使用することもできます。 jQuery 拡張メソッド自体
DOM 操作
DOM 操作も jQuery の大きな特徴は、非常に使いやすいため、考えられるすべての使用シナリオをカバーし、一般的に使用される追加、削除、確認、変更のメソッドを完了することです。
html()/css()/val( ) などのクラスを取得および設定する jQuery のメソッド。これらのパラメーターは、値を取得するために渡されるのではなく、値を設定するために渡されます
##チェーン プログラミング
jQuery はチェーン プログラミングをサポートしています。必要に応じて、すべての関数を 1 行のコードで記述することができます。その方法は次のとおりです。プロトタイプ チェーンを変更するすべてのメソッドは、現在の this オブジェクトを独自の属性として保存します。そして、end メソッドを呼び出して上位レベルのチェーンを見つけて、チェーン操作を実行できるようにすることができます
イベント操作
jQuery イベント操作は通常、クリック クラス (mouseover/mouseleave など) などを通じて使用できます。ただし、 click クラスの実装では が呼び出されます
on的实现是对原生的onclick类的处理,因为相同的原生的事件在同一个DOM对象上只能被绑定一次,如果再次绑定会覆盖掉上一次的,所以jQuery帮我们封装了事件的存储,把相同的事件分成一个数组存储在一个对象里面,然后对数组进行遍历,依次调用数组里存储的每个方法
on实现之后会把所有的事件处理字符串处理一下用on来改造一下,如下:
Baiya.each(("onclick,onmousedown,onmouseenter,onmouseleave," + "onmousemove,onmouseout,onmouseover,onmouseup,onfocus," + "onmousewheel, onkeydown,onkeypress,onkeyup,onblur").split(","), function (i, v) { var event = v.slice(2); Baiya.fn[event] = function (callback) { return this.on(event, callback); } });
属性操作
jQuery也提供给了我们方便的属性操作,底层就是对原生方法的包装,处理兼容性问题,如果jQuery不对IE浏览器的兼容处理的话,那么它的代码量可能会缩一半,当然锅不能全部甩给IE,比如innerText方法火狐是不支持的,但是支持textContent方法,所以jQuery会尽可能的处理这种浏览器带来的差异
样式操作
基本思想如上
Ajax操作
Ajax可以说是前端的跨越性进步,毫不夸张的说如果没有Ajax的发展,那么今天的前端可能不叫前端,可能是美工……
Ajax是什么?
在我的理解来看Ajax就是一个方法,这个方法遵循着http协议的规范,我们可以使用这个方法来向服务器请求少量的数据,有了数据之后我们就可以操作DOM来达到局部更新网页的目的,这是一个非常酷的事情
jQuery的Ajax是基于XMLHttpRequest的封装,当然了他也有兼容性问题,具体的封装见我之前的文章 简单的ajax封装
具体就是区别get和post请求的区别,get请求的传参是直接拼接在url结尾,而post请求需要在send()里面传递,并且post请求还要设置请求头setRequestHeader("content-type", "application/x-www-form-urlencoded")
请求后对json或者text或者xml的数据进行处理就可以渲染到页面了
提到Ajax就不得不提到跨域了
跨域简单的来说限制了非同源(ip/域名/端口/协议)的数据交互,当然这肯定是极好的,因为如果不限制那么你的网页别人也可以操作是不是很恐怖
但是有些情况下我们需要调用别人的服务器数据,而且别人也愿意怎么办呢,程序员是很聪明的,html标签中img,script,link等一些带有src属性的标签是可以请求外部资源的,img和link得到的数据是不可用的,只有script标签请求的数据我们可以通过函数来接收,函数的参数传递可以是任何类型,所以创建一个函数,来接收,参数就是请求到的数据,而对方的数据也要用该函数来调用就可以实现跨域了
简单封装jsonp实现
// url是请求的接口// params是传递的参数// fn是回调函数function jsonp(url, params, fn){ // cbName实现给url加上哈希,防止同一个地址请求出现缓存 var cbName = `jsonp_${(Math.random() * Math.random()).toString().substr(2)}`; window[cbName] = function (data) { fn(data); // 获取数据后移除script标签 window.document.body.removeChild(scriptElement); }; // 组合最终请求的url地址 var querystring = ''; for (var key in params) { querystring += `${key}=${params[key]}&`; } // 告诉服务端我的回调叫什么 querystring += `callback=${cbName}`; url = `${url}?${querystring}`; // 创建一个script标签,并将src设置为url地址 var scriptElement = window.document.createElement('script'); scriptElement.src = url; // appendChild(执行) window.document.body.appendChild(scriptElement); }
Animate
封装的代码
// element设置动画的DOM对象// attrs设置动画的属性object// fn是回调函数function animate(element, attrs, fn) { //清除定时器 if(element.timerId) { clearInterval(element.timerId); } element.timerId = setInterval(function () { //设置开关 var stop = true; //遍历attrs对象,获取所有属性 for(var k in attrs) { //获取样式属性 对应的目标值 var target = parseInt(attrs[k]); var current = 0; var step = 0; //判断是否是要修改透明度的属性 if(k === "opacity") { current = parseFloat( getStyle(element, k)) * 100 || 0; target = target * 100; step = (target - current) / 10; step = step > 0 ? Math.ceil(step) : Math.floor(step); current += step; element.style[k] = current / 100; //兼容ie element.style["filter"] = "alpha(opacity="+ current +")"; }else if(k === "zIndex") { element.style[k] = target; } else { //获取任意样式属性的值,如果转换数字失败,返回为0 current = parseInt(getStyle(element, k)) || 0; step = (target - current) / 10; console.log("current:" + current + " step:" + step); step = step > 0 ? Math.ceil(step) : Math.floor(step); current += step; //设置任意样式属性的值 element.style[k] = current + "px"; } if(step !== 0) { //如果有一个属性的值没有到达target ,设置为false stop = false; } } //如果所有属性值都到达target 停止定时器 if(stop) { clearInterval(element.timerId); //动画执行完毕 回调函数 if(fn) { fn(); } } },30); } //获取计算后的样式的值 function getStyle(element, attr) { //能力检测 if(window.getComputedStyle) { return window.getComputedStyle(element, null)[attr]; }else{ return element.currentStyle[attr]; } }
以上讲述这么多来分析jQuery,我相信大家也一定对jQuery有了新的认识和认知,希望大家能有收获。
相关推荐:
以上がjQueryの秘密の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Canvas 属性の秘密を探るには、具体的なコード サンプルが必要です。Canvas は、HTML5 の非常に強力なグラフィック描画ツールです。これを使用すると、複雑なグラフィック、動的な効果、ゲームなどを Web ページに簡単に描画できます。ただし、これを使用するには、Canvas の関連するプロパティとメソッドを理解し、それらの使用方法をマスターする必要があります。この記事では、Canvas の主要なプロパティのいくつかを検討し、読者がこれらのプロパティをどのように使用するかをより深く理解できるように、具体的なコード例を示します。

matplotlib カラー テーブルの詳細な説明: 色の背後にある秘密を明らかにする はじめに: Python で最も一般的に使用されるデータ視覚化ツールの 1 つである matplotlib には、強力な描画機能と豊富なカラー テーブルがあります。この記事では、matplotlib のカラー テーブルを紹介し、色の背後にある秘密を探ります。 matplotlib で一般的に使用されるカラー テーブルを詳しく調べ、具体的なコード例を示します。 1. Matplotlib のカラー テーブルは、matplotlib の色を表します。

Realme携帯電話ブランドは、第一線の携帯電話ブランドとして、常に消費者の注目と関心を集めてきました。しかし、誰もが知っているように、成功したブランドの背後には知られざる旅路とストーリーがあります。この記事では、Realme携帯電話ブランドの背後にある秘密を明らかにし、ブランドの起源、開発プロセス、市場戦略に至るまで徹底的に議論します。本物の携帯電話ブランドは、中国の移動通信機器会社であるOPPO Electronics Corp.が発祥であり、「本物の携帯電話」のブランドコンセプトを堅持し、2018年に正式に発足しました。本当の自分ブランドのこだわり

Linux システムは、オープンソースのオペレーティング システムとして、その安定性と信頼性で常に知られており、サーバー、組み込みデバイス、その他の分野で広く使用されています。では、Linux システムはどのようにして強固な状態を維持できるのでしょうか?これにはどんな秘密が隠されているのでしょうか?この記事では、Linux システムの安定性の理由を明らかにし、具体的なコード例を通してその秘密を明らかにします。 1. オープン ソース コード Linux システムはオープン ソース プロジェクトであり、そのソース コードは公開されており、誰でも表示および変更できます。

Golang アイコンの背後にある秘密: それは犬ですか? Go 言語である Golang は、Google によって開発されたオープンソース プログラミング言語です。効率的な同時処理機能、簡潔な構文、高速なコンパイル速度を備えているため、広く注目され、使用されています。 Golangの公式ロゴも注目を集めており、シンプルかつレイヤードされた不思議な動物を思わせるデザインですが、このロゴには一体どのような秘密が隠されているのでしょうか?このロゴは実際には犬の絵であると推測する人もいます。

PHP は、学習が簡単で、強力で柔軟性が高い、非常に人気のあるプログラミング言語です。ただし、大量のデータや同時リクエストの処理が多い場合、PHP のパフォーマンスの問題がボトルネックとなり、アプリケーションのパフォーマンスを制限することがよくあります。この問題を解決するために、開発者は多くの場合、キャッシュ技術を使用して PHP アプリケーションのパフォーマンスとスケーラビリティを向上させます。キャッシュは、アプリケーションが再計算することなく、すでに計算された結果をすぐに取得できるように、データをメモリに保存する技術です。 PHP におけるキャッシュ技術

CSS 属性セレクターの秘密が明らかに CSS 属性セレクターは、属性値によって特定の要素を選択してスタイル設定できる、非常に便利で強力なツールです。これらの属性セレクターは、要素の属性値、属性値が表示される場所、および属性値内の特定の文字に基づいて照合および選択できます。この記事では、具体的なコード例を通じて CSS 属性セレクターの秘密を明らかにします。まず、基本的な CSS 属性セレクターについて学びましょう。最も一般的な属性セレクターは「[属性]」です。

タオバオは中国最大のオンライン ショッピング プラットフォームで、毎日何億人ものユーザーが商品を購入しています。このような巨大なプラットフォームの運用を支えるには、テクノロジーが重要な役割を果たします。近年、インターネット分野での Go 言語の人気に伴い、タオバオの成功は Go 言語に関連しているのではないかと推測する人もいます。この記事では技術的な観点から始めて、淘宝網における Go 言語の応用と、それが淘宝網の秘密兵器になる可能性がある理由を具体的に探っていきます。まず、淘宝網が直面している技術的な課題を分析してみましょう。巨大なものとして
