jQueryのヒントとコツ


507

構文

データストレージ

最適化

雑多

回答:


252

HTML要素の作成と参照の維持

var newDiv = $("<div />");

newDiv.attr("id", "myNewDiv").appendTo("body");

/* Now whenever I want to append the new div I created, 
   I can just reference it from the "newDiv" variable */


要素が存在するかどうかの確認

if ($("#someDiv").length)
{
    // It exists...
}


独自のセレクターを作成する

$.extend($.expr[":"], {
    over100pixels: function (e)
    {
        return $(e).height() > 100;
    }
});

$(".box:over100pixels").click(function ()
{
    alert("The element you clicked is over 100 pixels height");
});

93
独自のセレクターを作成するのは非常に巧妙です
Hugoware 2008

22
また、助けになれば、実際に$( "<div />")を実行して、$( "<div> </ div>")と同じことを実行できます
Hugoware

4
私は新しいセレクター部分が好きです、それについて知りませんでした。
Pim Jager

5
私はまだコミュニティウィキを編集できないので:割り当てと存在チェックを組み合わせるif ((var someDiv = $("#someDiv")).length) { /* do stuff with someDiv... */ }
Ben Blank

4
@ベン:JavaScriptでそのようなイディオムを避ける理由someDivは、ifステートメント内でスコープされているという幻想を与えたくないからです。JavaScriptは関数スコープのみをサポートします
Andreas Grech

111

jQueryのdata()メソッドは便利で、あまり知られていません。DOMを変更せずにデータをDOM要素にバインドできます。


4
data()は確かに非常に役立ちます。
Pim Jager

3
セットIDのない要素では機能しないことに気づきました。
思想家

20
@Thinker:はい、あります。
Alex Barrett、

グローバルjs変数imoを宣言する代わりに、data()を使用してください。
Johan


80

私は本当に$(document).ready(fn)ショートカットのファンではありません。確かにコードを削減しますが、コードの可読性も大幅に削減します。を見ると$(document).ready(...)、何を見ているかわかります。$(...)他の多くの方法で使用されているため、すぐに意味がわかりません。

複数のフレームワークがあるjQuery.noConflict();場合は、言うように使用できますが、次のように異なる変数を割り当てることもできます。

var $j = jQuery.noConflict();

$j("#myDiv").hide();

$x(...)-style呼び出しに要約できるフレームワークがいくつかある場合に非常に役立ちます。


1
@オリ:ドキュメントの略記について あなたはポイントを持っています。しかし、それでもなお、それはヒント/トリックです。私がすべてのコードで使用しているものは、単に「見た目」が良いと思うからです。個人的な好みの問題だと思います:)
cllpse 2008年

毎日、無意味なXML / XLS / XLST、非常に多くの抽象化レイヤーで記述されたサイト、複雑なフェイルオーバーシステムがサイトの最貧層を超えないように書かれているサイト、そしてそれでも人々は$( <string>)&$(<function>)。泣きたくなる:)
JoeBloggs 2008

$(function(){...})を見ると、何が起こっているのかわかります。一般的なものは短くする必要があります。これが、頻繁に呼び出されるコードフラグメントを関数に変換する理由です。
luikore 2009

77

おお、jQueryメタデータをお忘れなく!data()関数はすばらしいですが、jQuery呼び出しを介して入力する必要があります。

次のようなカスタム要素属性でW3C準拠を壊す代わりに:

<input 
  name="email" 
  validation="required" 
  validate="email" 
  minLength="7" 
  maxLength="30"/> 

代わりにメタデータを使用してください:

<input 
  name="email" 
  class="validation {validate: email, minLength: 2, maxLength: 50}" />

<script>
    jQuery('*[class=validation]').each(function () {
        var metadata = $(this).metadata();
        // etc.
    });
</script>

7
html5データ属性により、これはそれほど問題になりません。議論はjQueryのデータ()関数でHTML5のデータ属性インラインをもたらす上で進行中があります:forum.jquery.com/topic/...
オスカーAustegard

10
@Oskar-はい、これはjQuery 1.4.3で実装されました- data-*属性は次の呼び出しを介して自動的に利用可能になります.data()
nickf

73

ライブイベントハンドラー

以下のためのイベントハンドラを設定する任意のそれは、最初のページのロード後にDOMに追加されていても、セレクタに一致する要素:

$('button.someClass').live('click', someFunction);

これにより、ajaxを介してコンテンツをロードしたり、JavaScriptを介してコンテンツを追加したり、これらの要素に対してイベントハンドラーを適切に自動的に設定したりできます。

同様に、ライブイベントの処理を停止するには:

$('button.someClass').die('click', someFunction);

これらのライブイベントハンドラーには、通常のイベントと比較していくつかの制限がありますが、ほとんどの場合にうまく機能します。

詳細については、jQueryのドキュメントを参照してください。

更新:live()およびdie()jQuery 1.7では非推奨です。同様の置換機能については、http://api.jquery.com/on/およびhttp://api.jquery.com/off/を参照してください

UPDATE2:live()jQuery 1.7より前でも、ずっと非推奨になっています。1.7より前のバージョンのjQuery 1.4.2+ではdelegate()、およびを使用しundelegate()ます。live()例は、( $('button.someClass').live('click', someFunction);)を使用して書き換えることができるdelegate()そのような:$(document).delegate('button.someClass', 'click', someFunction);


1
ええ、私は新しいライブが大好きです。jQuery 1.3以降でのみ機能することに注意してください。
Nosredna 2009年

4
+1 ..あなたは私に多くの心の痛みを救いました...私はたまたまあなたのエントリーを読んでいて、私が休憩を取っていたとき-私のイベントが発火しなかった理由のトラブルシューティング。ありがとう
Luke101 2009年

2
この記事の他の後発者については、delegate()も確認することをお勧めします。api.jquery.com / delegate ライブに似ていますが、より効率的です。
Oskar Austegard、

2
バインドされたライブイベントを発生させることができるように、.liveの泡を体まで覚えてください。途中で何かがそのイベントをキャンセルした場合、ライブイベントは発生しません。
nickytonline 2011年

1
jQuery 1.7が11月3日にリリースされて以来、live()とdie()は非推奨のメソッドです。on()、api.jquery.com/onおよびoff()、api.jquery.com/offに置き換え
Johan

46

無名関数を名前付き関数に置き換えます。これは本当にjQueryコンテキストに取って代わるものですが、コールバック関数に依存しているため、jQueryを使用するときのように機能します。インラインの無名関数で私が抱えている問題は、デバッグが難しいこと(明確に名前が付けられた関数ではなく、6レベルの「無名」のコールスタックを見る方がはるかに簡単)であり、同じ中に複数の無名関数が存在するという事実です。 jQueryチェーンは、読み取りや保守が困難になる可能性があります。さらに、匿名関数は通常再利用されません。一方、名前付き関数を宣言すると、再利用される可能性が高いコードを書くことができます。

イラスト; の代わりに:

$('div').toggle(
    function(){
        // do something
    },
    function(){
        // do something else
    }
);

私は好む:

function onState(){
    // do something
}

function offState(){
    // do something else
}

$('div').toggle( offState, onState );

残念ながら、jQueryはイベントターゲットを this、エンクロージャーを使用せずに「適切な」オブジェクト指向オブジェクトを取得することはできません。私は通常妥協します:$('div').click( function(e) { return self.onClick(e) } );
ベンブランク

3
申し訳ありませんが、あなたのコメントが私の投稿とどのように関連しているかはわかりません。詳しく説明できますか?私の提案を使用して、まだ 'self'(または他の変数)を使用できます。それはまったく変わりません。
ケン

ええ、ベン、正確にはどういう意味ですか!?
ジェームズ

2
私は言及しなければなりません:常に毛皮変数とルートではなく名前空間の関数!!
jmav 2009年

45

要素作成時のプロパティの定義

jQuery 1.4では、要素を作成するときにオブジェクトリテラルを使用してプロパティを定義できます。

var e = $("<a />", { href: "#", class: "a-class another-class", title: "..." });

...スタイルを追加することもできます。

$("<a />", {
    ...
    css: {
        color: "#FF0000",
        display: "block"
    }
});

ここにドキュメントへのリンクがあります


43

jQueryオブジェクトに別のエイリアスを使用する代わりに(noConflictを使用する場合)、常にすべてをクロージャーでラップしてjQueryコードを記述します。これはdocument.ready関数で行うことができます:

var $ = someOtherFunction(); // from a different library

jQuery(function($) {
    if ($ instanceOf jQuery) {
        alert("$ is the jQuery object!");
    }
});

あるいは、次のようにすることもできます。

(function($) {
    $('...').etc()    // whatever jQuery code you want
})(jQuery);

これが最もポータブルであることがわかります。私はプロトタイプとjQueryの両方を同時に使用しているサイトで作業しており、これらの技術はすべての競合を回避しています。


2番目の例は目に優しいです:)
cllpse

25
ただし、違いがあります。最初の例ではdocument.ready()イベントが発生するのを待機し、2番目の例では発生しません。
SamBeran 2009

1
@SamBeran:True、2番目の例はすぐに実行されます。ただし、オブジェクトリテラルをラップする場合は、オブジェクトリテラル内で$(document).ready(...)を使用できます。つまり、各コードを実行するタイミングを指定できます。
Wil Moore III、

4
instanceOf機能しませんinstanceofjQuery instanceof jQueryと戻りfalseますので、それはとにかく動作しません。$ == jQueryそれを行う正しい方法です。
nyuszika7h

@ Nyuszika7H:はい、そうですが、それは実際のコード例のポイントではありません。
nickf

39

インデックスをチェック

jQueryには.indexがありますが、要素のリストが必要であり、インデックスが必要な要素を渡すため、使用するのは面倒です。

var index = e.g $('#ul>li').index( liDomObject );

次の方がはるかに簡単です。

順序なしリスト内のセット(リストアイテムなど)内の要素のインデックスを知りたい場合:

$("ul > li").click(function () {
    var index = $(this).prevAll().length;
});

コアのindex()メソッドの何が問題になっていますか?少なくとも1.2以降はコアになっています。 docs.jquery.com/Core/index
ken

はい、そうです。jQueryのindex()を確認しているときに、お尻の痛みのようなものであることに気付いたので、私は悪魔の擁護者をやや演じていました。説明をありがとう!
ケン

4
これはかっこいいですが、以前の兄弟が選択に含まれていない場合は、正しく機能しないことを知っておくことが重要です。
TM。

2
jQuery 1.4以降、私はindex()その親からインデックスを使用して取得できると確信しています。
アレックス

@alex-確かですが、この投稿の日付に注意してください-1.4リリースの5か月前です!
redsquare 2010

23

準備完了イベントの省略形

明示的で冗長な方法:

$(document).ready(function ()
{
    // ...
});

略記:

$(function ()
{
    // ...
});

22

コアjQuery関数で、selectorパラメーターに加えてcontextパラメーターを指定します。contextパラメータを指定すると、jQueryはDOMルートからではなく、DOMのより深いブランチから開始できます。十分な大きさのDOMがある場合、コンテキストパラメータを指定すると、パフォーマンスが向上します。

例:ドキュメントの最初のフォーム内でradioタイプのすべての入力を検索します。

$("input:radio", document.forms[0]);

リファレンス:http : //docs.jquery.com/Core/jQuery#expressioncontext


10
注:$(document.forms[0]).find('input:radio')同じことを行います。jQueryソースを見ると、2番目のパラメーターをに渡すと、$実際にが呼び出されます.find()
nyuszika7h

どうですか... $('form:first input:radio')
daGrevis

Paul Irishは、paulirish.com / 2009 / perf(スライド17以降)で、これは読みやすさの観点から「逆向き」であると指摘しました。@ Nyuszika7Hが指摘したように、これは内部で.find()を使用し、$(document.forms [0])。find( 'input:radio')は、最初のセレクターにコンテキストを置くのに比べて非常に読みやすいです。
LocalPCGuy 2012年

21

本当にjQueryだけではありませんが、jQueryとMS AJAXの間に小さな橋をかけました。

Sys.UI.Control.prototype.j = function Sys$UI$Control$j(){
  return $('#' + this.get_id());
}

多くのASP.NET AJAXを実行している場合は、jQueryがMSによってサポートされているので、とても便利です。今では、素敵なブリッジがあれば、jQuery操作を簡単に実行できます。

$get('#myControl').j().hide();

したがって、上記の例は素晴らしいものではありませんが、ASP.NET AJAXサーバーコントロールを作成している場合は、クライアント側のコントロール実装内にjQueryを簡単に含めることができます。


Ajaxのクライアント側ライブラリは、(コードの後ろに)あなたが割り当てられた元Idでコントロールを見つける方法を提供しています
クリス・S

this.get_id()は、クライアントスコープ内のコントロールのIDを返します。親のコトロール階層に応じてクライアントIDが生成されるため、サーバー指定のIDは無関係です
Aaron Powell、

20

複雑なセレクターのパフォーマンスを最適化する

複雑なセレクターを使用するときにDOMのサブセットをクエリすると、パフォーマンスが大幅に向上します。

var subset = $("");

$("input[value^='']", subset);

7
そのサブセットがキャッシュ/保存されている場合のみ。
Dykam

6
それは$( "")。find( "input [value ^ = '']")とそれほど変わらない
Chad Moran

1
@Dykam:これは私の例のコードの場合です。しかし、あなたの主張はまだ有効です。
cllpse

4
@チャド、それは実際には同一であり、あなたが書いた関数にマッピングされます
マイクロビンソン

19

ヒントとコツ、そしていくつかのチュートリアルといえば。Jeffery Wayによるチュートリアルのシリーズ(「jQuery for Absolute Beginners」ビデオシリーズ)を見つけましたが非常に役立つことを発見しました。

jQueryを初めて使用する開発者を対象としています。彼はアニメーション、要素の作成と削除など、jQueryで多くのクールなものを作成する方法を示しています...

私はそれから多くを学びました。彼は、jQueryの使い方がいかに簡単かを示しています。今では私はそれを愛していて、たとえそれが複雑であっても、あらゆるjQueryスクリプトを読んで理解することができます。

ここで「のような1例Iでサイズ変更テキスト

1- jQuery ...

<script language="javascript" type="text/javascript">
    $(function() {
        $('a').click(function() {
            var originalSize = $('p').css('font-size'); // get the font size 
            var number = parseFloat(originalSize, 10); // that method will chop off any integer from the specified variable "originalSize"
            var unitOfMeasure = originalSize.slice(-2);// store the unit of measure, Pixle or Inch

            $('p').css('font-size', number / 1.2 + unitOfMeasure);
            if(this.id == 'larger'){$('p').css('font-size', number * 1.2 + unitOfMeasure);}// figure out which element is triggered
         });        
     });
</script>

2- CSSスタイリング...

<style type="text/css" >
body{ margin-left:300px;text-align:center; width:700px; background-color:#666666;}
.box {width:500px; text-align:justify; padding:5px; font-family:verdana; font-size:11px; color:#0033FF; background-color:#FFFFCC;}
</style>

2- HTML ...

<div class="box">
    <a href="#" id="larger">Larger</a> | 
    <a href="#" id="Smaller">Smaller</a>
    <p>
    In todays video tutorial, Ill show you how to resize text every time an associated anchor tag is clicked. Well be examining the slice”, parseFloat”, and CSS Javascript/jQuery methods. 
    </p>
</div>

これらのチュートリアルを強くお勧めします...

http://blog.themeforest.net/screencasts/jquery-for-absolute-beginners-video-series/


19

非同期each()関数

jquery each()関数を実行すると、反復中にブラウザーがロックされる本当に複雑なドキュメントがある場合、またはInternet Explorerが「このスクリプト実行を継続しますか?」というメッセージをポップアップする場合、このソリューションは1日を節約します。

jQuery.forEach = function (in_array, in_pause_ms, in_callback)
{
    if (!in_array.length) return; // make sure array was sent

    var i = 0; // starting index

    bgEach(); // call the function

    function bgEach()
    {
        if (in_callback.call(in_array[i], i, in_array[i]) !== false)
        {
            i++; // move to next item

            if (i < in_array.length) setTimeout(bgEach, in_pause_ms);
        }
    }

    return in_array; // returns array
};


jQuery.fn.forEach = function (in_callback, in_optional_pause_ms)
{
    if (!in_optional_pause_ms) in_optional_pause_ms = 10; // default

    return jQuery.forEach(this, in_optional_pause_ms, in_callback); // run it
};


最初に使用する方法は、each()と同じです。

$('your_selector').forEach( function() {} );

オプションの2番目のパラメータを使用すると、反復間での速度/遅延を指定できます(アニメーションのために有用である可能性がある次の例では、反復間で1秒を待機します):

$('your_selector').forEach( function() {}, 1000 );

これは非同期で機能するため、次のコード行の前に反復が完了しているとは限りません。

$('your_selector').forEach( function() {}, 500 );
// next lines of code will run before above code is complete


私はこれを社内プロジェクトのために書きましたが、改善できると確信していますが、私たちが必要とするものでうまくいきました。ありがとう-


18

シンタックスショートシュガーシング-オブジェクトコレクションをキャッシュし、コマンドを1行で実行します。

の代わりに:

var jQueryCollection = $("");

jQueryCollection.command().command();

私がやります:

var jQueryCollection = $("").command().command();

やや「実際の」ユースケースは、次のようなものです。

var cache = $("#container div.usehovereffect").mouseover(function ()
{
    cache.removeClass("hover").filter(this).addClass("hover");
});

4
あなたは、それは少し時間がかかりますので、マイナーなのもパフォーマンスが、ここでヒット取るウィルので、それはよりよい...、ローカル変数で$(この)の参照を置くために
サンダーVersluys

4
この場合(しゃれは意図されていません)、「これ」を1回だけ使用しています。キャッシングの必要はありません。
cllpse 2009

1
小さなヒント。この場合問題ではないかもしれませんが、DOMに追加の変更を加えることは常に悪い考えです。たとえば、ホバリングしている要素にすでにクラス「hover」があったとします。このクラスを削除して、再度追加します。あなたはでそれを回避することができます$(this).siblings().removeClass("hover")。これはとても小さなことのように聞こえますが、DOMを変更するたびに、別のブラウザの再描画がトリガーされることがあります。その他の可能性としては、DOMAttrModifiedにアタッチされたイベント、または要素の高さを変更するクラスがあり、他の「サイズ変更」イベントリスナーを起動する可能性があります。
gradbot 2011

1
キャッシュを使用してDOMの変更を最小限にしたい場合は、これを行うことができます。cache.not(this).removeClass("hover")
gradbot 2011

@gradbot:最後の2つのコメントがわかりません。拡張できますか?
Randomblue

15

宣言するのが好き $this無名関数の冒頭で変数をので、jQueriedを参照できることがわかります。

そのようです:

$('a').each(function() {
    var $this = $(this);

    // Other code
});

12
私は代わりに「それ」を使用します:)
cllpse '12年

2
ROA:ええ、それは酸になります:)また、arguments.calleeを使用して、匿名関数がそれ自体を参照できるようにすることもできます
JoeBloggs 2008年

5
Joe-ほんとうに、呼び出し先はECMAScript 5とストリクトモードを廃止します。参照:ejohn.org/blog/ecmascript-5-strict-mode-json-and-more
マイクロビンソン

@ジョーあなたはそれに名前を付けることができます、ちょうどIEの癖に注意してください。
アレックス、

また、変数名の先頭に$を使用して、標準変数と比較してjQueryオブジェクト変数を示す優れた例。jQueryオブジェクトをキャッシュしている変数の先頭にそれを追加することで、変数をjQuery関数で実行できることがわかります。コードをすぐに読みやすくします。
LocalPCGuy 2012年

14

jQueryオブジェクトを変数に保存して再利用

jQueryオブジェクトを変数に保存すると、DOMをさかのぼって検索することなく再利用できます。

(@Louisが示唆したように、今では$を使用して、変数がjQueryオブジェクトを保持していることを示しています。)

// Bad: searching the DOM multiple times for the same elements
$('div.foo').each...
$('div.foo').each...

// Better: saving that search for re-use
var $foos = $('div.foo');
$foos.each...
$foos.each...

より複雑な例として、店の食品のリストがあり、ユーザーの基準に一致するものだけを表示したいとします。チェックボックス付きのフォームがあり、それぞれに基準が含まれています。チェックボックスにはorganicおよびのような名前がありlowfat、製品には対応するクラスがあります- .organicなど。

var $allFoods, $matchingFoods;
$allFoods = $('div.food');

これで、jQueryオブジェクトを操作し続けることができます。チェックボックスがクリックされるたびに(チェックまたはチェック解除)、食品のマスターリストから開始し、チェックされたボックスに基づいてフィルタリングします。

// Whenever a checkbox in the form is clicked (to check or uncheck)...
$someForm.find('input:checkbox').click(function(){

  // Start out assuming all foods should be showing
  // (in case a checkbox was just unchecked)
  var $matchingFoods = $allFoods;

  // Go through all the checked boxes and keep only the foods with
  // a matching class 
  this.closest('form').find("input:checked").each(function() {  
     $matchingFoods = $matchingFoods.filter("." + $(this).attr("name")); 
  });

  // Hide any foods that don't match the criteria
  $allFoods.not($matchingFoods).hide();
});

8
私の命名規則は$前に置くことです。例var $allItems = ...
Louis

6
@Lavinski-考えは、$がこれがjQueryオブジェクトであることを示し、他の変数と視覚的に区別しやすくなるということだと思います。
ネイサンロング

@Louis-私はあなたの慣例を採用して以来、それに応じて私の答えを更新します。:)
Nathan Long

11

興味深い重要なヒントのほとんどはすでに言及されているようですので、これはほんの少しの追加です。

ちょっとしたヒントは、jQuery.each(object、callback)関数です。誰もがおそらくjQuery.each(callback)を使用しています関数をしてjQueryオブジェクト自体を反復処理しています。jQuery.each(object、callback)ユーティリティ関数は、オブジェクトと配列を反復処理します。長い間、私はどういうわけか、異なる構文を除いてそれが何であるかを知りませんでした(私はすべての昔ながらのループを書くことを気にしません)。

問題は、jQuery.each(object、callback)のループ本体が関数であるため、ループ内で毎回新しいスコープを取得することです。これは、ループ内でクロージャーを作成するときに特に便利です。

言い換えると、一般的な間違いは次のようなことです。

var functions = [];
var someArray = [1, 2, 3];
for (var i = 0; i < someArray.length; i++) {
    functions.push(function() { alert(someArray[i]) });
}

これで、functions配列内の関数を呼び出すと、3回警告が表示されundefinedます。これは、たいていは望んでいない内容です。問題は、変数が1つしかなくi、3つのクロージャすべてがそれを参照していることです。ループが終了すると、の最終値iは3で、someArrary[3]ですundefined。クロージャーを作成する別の関数を呼び出すことで、問題を回避できます。または、基本的にそれを行うjQueryユーティリティを使用します。

var functions = [];
var someArray = [1, 2, 3];
$.each(someArray, function(item) {
    functions.push(function() { alert(item) });
});

ここで、関数を呼び出すと、期待どおりにコンテンツ1、2、3の3つのアラートが表示されます。

一般的に、それはあなたが自分でできなかったことではありませんが、持っているのは素晴らしいことです。


11

配列と同じようにjQuery関数にアクセスする

ブール値に基づいてクラスを追加/削除...

function changeState(b)
{
    $("selector")[b ? "addClass" : "removeClass"]("name of the class");
}

の短いバージョンです...

function changeState(b)
{
    if (b)
    {
        $("selector").addClass("name of the class");
    }
    else
    {
        $("selector").removeClass("name of the class");
    }
}

このためのユースケースはそれほど多くありません。決して少なくない; きちんとしていると思います:)


更新

コメントの読み取りタイプではない場合に備えて、ThiefMasterはtoggleClassがブール値を受け入れることを指摘します。これは、クラスを追加するか削除するかを決定します。上記の私のコード例に関する限り、これは最良のアプローチです...

$('selector').toggleClass('name_of_the_class', true/false);

2
これは見事で、いくつかの興味深い用途がありますが、jQueryに固有のものではありません...これは、JavaScriptオブジェクトで実行できることです。
TM。

1
ありがとう:) ...これは基本的なJavaScriptです。ええ。しかし、jQueryはJavaScriptであると私は主張します。これがjQuery固有であるとは主張していません。
cllpse

7
この特定のケースでは、本当に使用したいのです$('selector').toggleClass('name_of_the_class', b);が。
ThiefMaster 2010年

9

更新:

サイトにこのスクリプトを含めるだけで、Firebugコンソールが表示され、任意のブラウザーでデバッグするためにポップアップ表示されます。それほど機能が充実していませんが、それでもかなり役に立ちます!完了したら、必ず削除してください。

<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>

このリンクをチェックしてください:

CSSトリックから

更新:新しいものを見つけました。そのjQuery Hotboxです。

jQueryホットボックス

Googleは、Google CodeでいくつかのJavaScriptライブラリをホストしています。そこからロードすると帯域幅が節約され、すでにキャッシュされているクイックcosがロードされます。

<script src="http://www.google.com/jsapi"></script>  
<script type="text/javascript">  

    // Load jQuery  
    google.load("jquery", "1.2.6");  

    google.setOnLoadCallback(function() {  
        // Your code goes here.  
    });  

</script>

または

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>

これを使用して、イメージが完全に読み込まれたことを通知することもできます。

$('#myImage').attr('src', 'image.jpg').load(function() {  
    alert('Image Loaded');  
});

警告ボックスを使用せずにメッセージと変数を画面にダンプするために使用できるfirebugの「console.info」。「console.time」を使用すると、タイマーを簡単に設定して一連のコードをラップし、所要時間を確認できます。

console.time('create list');

for (i = 0; i < 1000; i++) {
    var myList = $('.myList');
    myList.append('This is list item ' + i);
}

console.timeEnd('create list');

イランのPPLは、Google APIでロードされたWebページを見ることができません。実際、グーグルはイラン人がグーグルコードにアクセスすることを制限している。so -1
Alireza Eliaderani 2009年

私はあなたが任意のブラウザでfirebugを使用できることを知りました。それは素晴らしいです。
Tebo

9

jQueryがquerySelectorAllを使用できるように、可能であれば疑似セレクターでフィルタリングメソッドを使用します(sizzleよりはるかに高速です)。このセレクターを考えてみましょう:

$('.class:first')

同じ選択は、以下を使用して行うことができます。

$('.class').eq(0)

「.class」の最初の選択はQSA互換であるため、どちらがより高速でなければなりません。


@ Nyuszika7Hポイントを逃していると思います。ポイントは、QSAはほとんどの疑似セレクターを最適化できないため、$( '。class:eq(0)')は$( '。class')。eq(0)よりも遅くなるということです。
ラルフホルツマン、2011年

9

コレクションから要素を削除して連鎖性を維持する

以下を検討してください。

<ul>
    <li>One</li>
    <li>Two</li>
    <li>Three</li>
    <li>Four</li>
    <li>Five</li>
</ul>


$("li").filter(function()
{
    var text = $(this).text();

    // return true: keep current element in the collection
    if (text === "One" || text === "Two") return true;

    // return false: remove current element from the collection
    return false;
}).each(function ()
{
    // this will alert: "One" and "Two"       
    alert($(this).text());
});

このfilter()関数は、jQueryオブジェクトから要素を削除します。この場合:テキスト「One」または「Two」を含まないすべてのli要素は削除されます。


「each」を使用してマージン変更をスイッチ内に移動するだけの方が簡単ではないでしょうか。
DisgruntledGoat

私の答えを更新しました。私が自分を明確にしている場合はお知らせください
cllpse

これは本当にli要素を削除しますか?要素のフィルターされたリストで警告しているようです。
Cheeso

1
filter関数は、jQueryオブジェクト内のコレクションから要素を削除します。DOMには影響しません。
cllpse 2009

6
フィルター関数では、次のように簡単に記述できます。return !! $(this).text()。match(/ One | Two /); ;)
Vincent

8

入力要素のタイプを変更する

DOMに既にアタッチされている入力要素のタイプを変更しようとしたときに、この問題に遭遇しました。既存の要素を複製し、古い要素の前に挿入してから、古い要素を削除する必要があります。それ以外の場合は機能しません。

var oldButton = jQuery("#Submit");
var newButton = oldButton.clone();

newButton.attr("type", "button");
newButton.attr("id", "newSubmit");
newButton.insertBefore(oldButton);
oldButton.remove();
newButton.attr("id", "Submit");

7

フォームフィールドの検証やURL解析など、サードパーティのjQueryスクリプトの賢明な使用。次に何がJavaScriptの要件に遭遇したかがわかるように、内容を確認する価値があります。


7

改行と連鎖性

コレクションで複数の呼び出しをチェーンする場合...

$("a").hide().addClass().fadeIn().hide();

改行すると読みやすさが向上します。このような:

$("a")
.hide()
.addClass()
.fadeIn()
.hide();

4
この場合、最初の方が読みやすくなりますが、そうです、改行が読みやすくなる場合があります。
nyuszika7h

7

アニメーションをトリガーしてアニメーションが繰り返されないようにするには、.stop(true、true)を使用します。これは、ロールオーバーアニメーションで特に役立ちます。

$("#someElement").hover(function(){
    $("div.desc", this).stop(true,true).fadeIn();
},function(){
    $("div.desc", this).fadeOut();
});

7

.append()何かを繰り返すなどのメソッド呼び出しで、自己実行型の無名関数を使用する。IE:

$("<ul>").append((function ()
{
    var data = ["0", "1", "2", "3", "4", "5", "6"],
        output = $("<div>"),
        x = -1,
        y = data.length;

    while (++x < y) output.append("<li>" + info[x] + "</li>");

    return output.children();
}()));

私はこれを使用して、構築するためのチェーンから抜け出すには大きくて不快なものを繰り返し処理します。


5

ステロイドのHTML5データ属性のサポート!

データ機能前に言及されています。これにより、データをDOM要素に関連付けることができます。

最近、jQueryチームはHTML5カスタムdata- *属性のサポートを追加しました。そして、それで十分ではなかったかのように。データ関数にステロイドを強制的に供給しました。つまり、複雑なオブジェクトをJSONの形式でマークアップに直接保存できます。

HTML:

<p data-xyz = '{"str": "hi there", "int": 2, "obj": { "arr": [1, 2, 3] } }' />


JavaScript:

var data = $("p").data("xyz");

data.str // "hi there"
typeof data.str // "string"

data.int + 2 // 4
typeof data.int // "number"

data.obj.arr.join(" + ") + " = 6" // "1 + 2 + 3 = 6"
typeof data.obj.arr // "object" ... Gobbles! Errrghh!
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.