Поради та рекомендації 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

22
Крім того, якщо це допоможе, ви можете реально зробити $ ("<div />") і досягти того ж, що і $ ("<div> </div>")
Hugoware

4
Я люблю нову селекторну частину, не знав про це.
Пім Джагер

5
Оскільки я ще не можу редагувати вікі-файли спільноти: Поєднайте перевірку призначення та існування зif ((var someDiv = $("#someDiv")).length) { /* do stuff with someDiv... */ }
Бен Бланк

4
@Ben: Причиною я уникаю подібних ідіомів в JavaScript, тому що я не хочу створювати ілюзію того, що я someDivпотрапив у ifзаяву, тому що це не так; JavaScript підтримує лише область функцій
Andreas Grech

111

data()Метод jQuery корисний і недостатньо відомий. Це дозволяє прив'язувати дані до елементів DOM без зміни DOM.


4
Дані () справді дуже допомагають.
Пім Джагер

3
Я помітив, що він не працює з елементами без встановленого ідентифікатора.
Мислитель

20
@Thinker: Так, так і є.
Алекс Барретт

Використовуйте дані () замість оголошення глобальних js змінних, imo.
Йоган


80

Я дійсно не шанувальник $(document).ready(fn)ярлика. Звичайно, він скорочує код, але він також скорочує читабельність коду. Коли бачиш $(document).ready(...), ти знаєш, на що дивишся. $(...)використовується в занадто багатьох інших способах, щоб негайно мати сенс.

Якщо у вас є декілька фреймворків, ви можете використовувати їх, jQuery.noConflict();як ви говорите, але ви також можете призначити іншу змінну так:

var $j = jQuery.noConflict();

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

Дуже корисно, якщо у вас є декілька фреймворків, які можна звести до $x(...)стилю дзвінків.


1
@Oli: Про готовий стенограма документа; ти маєш рацію. Але ніколи менше: це порада / хитрість. Той, який я використовую у всьому своєму коді виключно, тому що я думаю, що він "виглядає" краще. Я думаю, що це стосується особистих уподобань :)
cllpse

Щодня я пробираюсь через безглузді XML / XLS / XLST, сайти, написані з занадто великою кількістю шарів абстракції, складні системи відмов на сайтах, які ніколи не переростуть найскромніших серверів ... і все одно люди скаржаться на різницю між $ ( <string>) & $ (<функція>). Змушує мене хотіти плакати :)
JoeBloggs

Коли я бачу $ (function () {...}), я знаю, що відбувається. Більш звичні речі повинні бути коротшими. Ось чому ми перетворюємо часто називаються фрагменти коду у функції.
luikore

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 роблять це менше проблемою; триває дискусія щодо приведення атрибута даних html5 у відповідність із функцією jquery's data (): forum.jquery.com/topic/…
Оскар Аустегард

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. Для версій jQuery 1.4.2+ перед 1.7 використовувати delegate()та undelegate(). live()Приклад ( $('button.someClass').live('click', someFunction);) можна переписати , використовуючи delegate()так: $(document).delegate('button.someClass', 'click', someFunction);.


1
Так, я люблю нові живі речі. Зауважте, що він працює лише починаючи з jQuery 1.3.
Носредна

4
+ 1 .. ти врятував мене від болю в серці. Я випадково прочитав твій запис, і поки я робив перерву - усунення проблем, чому моя подія не стріляла. Спасибі
Luke101

2
для будь-яких інших учасників цієї статті, можливо, ви також хочете подивитися на delegate (): api.jquery.com/delegate Схожий на життя, але більш ефективний.
Оскар Аустегард

2
Просто пам’ятайте. Живі бульбашки до тіла, щоб можна було випустити пов'язану подію. Якщо щось по дорозі скасує цю подію, подія в прямому ефірі не запуститься.
nickytonline

1
live () і die () - застарілі методи, оскільки jQuery 1.7 вийшов 3 листопада. Замінено на (), api.jquery.com/on та off (), api.jquery.com/off
Йоган

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, ви не можете отримати "належне" OO без використання вкладених файлів. Я зазвичай йду на компроміс:$('div').click( function(e) { return self.onClick(e) } );
Бен Бланк

3
Вибачте, Бен, але я не розумію, як ваш коментар має відношення до моєї публікації. Чи можете ви докладно? Ви все ще можете використовувати "self" (або будь-яку іншу змінну), використовуючи мою пропозицію; це взагалі нічого не змінить.
кен

Так, Бен, що саме ти маєш на увазі !?
Джеймс

2
Треба зазначити: завжди змінна хутро і функції в просторі імен, а не в корені !!
jmav

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, і ці методи уникають усіх конфліктів.


Другий приклад є приємним для очей :)
cllpse

25
Однак є різниця, перший приклад буде чекати, коли подія document.ready () запуститься, а другий - не.
СамБеран

1
@SamBeran: Правда, другий приклад запуститься негайно; однак, якщо ви загортаєте об'єкт-літерал, ви можете використовувати $ (document) .ready (...) всередині об’єкта-літерал, що означає, що ви можете вказати, коли ви хочете запустити кожен фрагмент коду.
Віль Мур III

4
instanceOfне буде працювати, тільки instanceof. І це все одно не буде працювати, тому що jQuery instanceof jQueryповернеться false. $ == jQueryце правильний спосіб зробити це.
nyuszika7h

@ Nyuszika7H: Так, ти маєш рацію, але це не насправді сенс прикладу коду.
нікфф

39

Перевірте індекс

jQuery має .index, але це біль для використання, як вам потрібен список елементів, і передавання в елементі, який потрібно індексу:

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

Це набагато простіше:

Якщо ви хочете знати індекс елемента в наборі (наприклад, елементи списку) у списку, що не має упорядкованості:

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

Що не так з методом core index ()? Він був в ядрі не менше 1,2. docs.jquery.com/Core/index
ken

Гаразд, так, я дещо грав у захисника диявола, тому що, переглядаючи індекс jQuery (), я зрозумів, що це був біль у попці. Дякуємо за роз’яснення!
кен

4
Це круто, але важливо знати, що він не працює цілком правильно, якщо у вас були попередні брати та сестри, які не були частиною відбору.
ТМ.

2
Я майже впевнений, що з jQuery 1.4 ви можете просто використовувати index()та отримати індекс від його батьківського.
алекс

@alex - звичайно, але зауважте дату цієї публікації - до випуску 1.4 було 5 місяців!
redsquare

23

Стенограма готового заходу

Явний і багатослівний спосіб:

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

Стенограма:

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

22

В основній функції jQuery вкажіть параметр контексту на додаток до параметра селектора. Визначення параметра контексту дозволяє jQuery починати з більш глибокої гілки DOM, а не з кореня DOM. Враховуючи достатньо великий DOM, вказавши контекстний параметр, слід перевести на підвищення продуктивності.

Приклад: Знаходить усі входи типу радіо в першій формі в документі.

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

Довідка: http://docs.jquery.com/Core/jQuery#expressioncontext


10
Примітка: $(document.forms[0]).find('input:radio')робить те саме. Якщо ви подивитесь на джерело jQuery, то побачите: якщо ви передасте другий параметр $, він фактично зателефонує .find().
nyuszika7h

Як щодо ... $('form:first input:radio')?
daGrevis

Пол Ірланд зазначив у paulirish.com/2009/perf (починаючи з слайду 17), що це робиться "назад" з точки зору читабельності. Як зазначав @ Nyuszika7H, він використовує внутрішньо .find (), а $ (document.forms [0]). Find ('input: radio') читається дуже просто, порівняно з тим, щоб поставити контекст у початковий селектор.
LocalPCGuy

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 спосіб пошуку контролю за оригінальним ідентифікатором, який ви призначили (у коді позаду)
Chris S

this.get_id () поверне вам ідентифікатор елемента управління в області клієнта. Вказаний на сервері ідентифікатор не має значення, оскільки ідентифікатор клієнта генерується залежно від ієрахії батьківського котеджу
Аарон Пауелл,

20

Оптимізація продуктивності складних селекторів

Запит на підмножину DOM при використанні складних селекторів значно покращує продуктивність:

var subset = $("");

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

7
Тільки якщо це підмножина є кешованим / збереженим
Дікам

6
Це не сильно відрізняється від $ (""). Find ("input [value ^ = '']")
Чад Моран

1
@Dykam: що це, у випадку мого прикладу-коду. Але ваша думка все-таки справедлива.
cllpse

4
@Chad, це насправді ідентично і відображає функцію, яку ви написали
Майк Робінсон

19

Якщо говорити про поради та підказки, а також деякі підручники. Я знайшов, що ці серії навчальних посібників ( "Серія відеозаписів jQuery для абсолютних початківців") від Джеффірі Вейя ДУЖЕ ДОПОМОГІ.

Він націлений на тих розробників, які не знайомі з jQuery. Він показує, як створити багато цікавих речей за допомогою jQuery, таких як анімація, створення та видалення елементів та багато іншого ...

Я багато чому навчився з цього. Він показує, як легко користуватися jQuery. Тепер я люблю це, і я можу читати та розуміти будь-який сценарій jQuery, навіть якщо він складний.

Ось один приклад, який мені подобається " Змінення розміру тексту "

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 Styling ...

<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

Асинхронна кожна () функція

Якщо у вас є справді складні документи, де функція jquery every () блокує браузер під час ітерації, та / або Internet Explorer спливає повідомлення " чи хочете ви продовжувати запуск цього сценарію ", це рішення допоможе заощадити день.

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
};


Перший спосіб використовувати його - це як і кожен ():

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

Необов'язковий другий параметр дозволяє задати швидкість / затримку між ітераціями , які можуть бути корисні для анімації ( наступний приклад буде чекати 1 секунду між ними ітераціями ):

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

Пам'ятайте, що оскільки це працює асинхронно, ви не можете розраховувати на завершення ітерацій перед наступним рядком коду, наприклад:

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


Я написав це для внутрішнього проекту, і хоча я впевнений, що його можна вдосконалити, він працював на те, що нам потрібно, тож сподіваюся, що деякі з вас вважають це корисним. Дякую -


18

Синтаксична скорочена річ з цукром - кеш-збірка об'єктів та виконання команд в одному рядку:

Замість:

var jQueryCollection = $("");

jQueryCollection.command().command();

Я згоден:

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

Дещо "реальний" випадок використання може бути чимось таким чином:

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

4
краще покласти $ (це) посилання в локальну змінну, тому що ви візьмете тут незначну ефективність, тому що це займе трохи більше часу ...
Sander Versluys

4
У цьому випадку (каламбур не призначений) я використовую лише "це" один раз. Не потрібно кешувати.
cllpse

1
Невеликий наконечник. Хоча це може не мати значення в цьому випадку, завжди погана ідея вносити додаткові зміни в DOM. Скажімо, наприклад, що елемент, на якому ви наближаєтесь, вже мав клас "наближення". Ви видалили б цей клас і повторно додали його. З цим можна обійтись $(this).siblings().removeClass("hover"). Я знаю, це звучить як така маленька річ, але щоразу, коли ви міняєте DOM на іншу переробку веб-переглядача, може бути спровоковано. До інших можливостей відносяться події, приєднані до DOMAttrModified або класи, що змінюють висоту елемента, які можуть запускати інших "зміни розміру" слухачів подій.
gradbot

1
Якщо ви хочете використовувати кеш і мінімізувати зміни DOM, ви можете це зробити. cache.not(this).removeClass("hover")
gradbot

@gradbot: я не розумію ваших двох останніх коментарів. Чи можете ви розширитись?
Randomblue

15

Мені подобається оголошувати $thisзмінну на початку анонімних функцій, тому я знаю, що можу посилатися на jQueried це.

Так:

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

    // Other code
});

12
Я використовую натомість "що" :)
cllpse

2
ROA: Так, це буде кислота :) Ви також можете використовувати argument.callee, щоб дозволити анонімній функції посилатися на себе
JoeBloggs

5
Джо - лише нахиливши голову вгору, калле відійде з ECMAScript 5 і суворим режимом. Дивіться: ejohn.org/blog/ecmascript-5-strict-mode-json-and-more
Майк Робінсон,

@Joe Ви можете назвати це ім'я, будьте обережні до примх IE .
alex

Чудовий приклад також використання $ на початку імені змінної для позначення змінної об'єкта jQuery порівняно зі стандартною змінною. Додавши, що до початку будь-якої змінної, яка кешує об’єкт jQuery, ви відразу розумієте, подивившись, що ви можете виконувати функції jQuery на змінній. Робить код набагато легше для читання.
LocalPCGuy

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 = ...
Луї

6
@Lavinski - Я думаю, ідея полягає в тому, що $вказує, що це об’єкт jQuery, який полегшить візуальну диференціацію від інших змінних.
Натан Лонг

@Louis - з тих пір я прийняв вашу конвенцію і відповідно оновлюю свою відповідь. :)
Натан Лонг

11

Здається, що більшість цікавих та важливих порад уже згадувались, тому цей лише невелике доповнення.

Маленька порада - це функція jQuery.each (об'єкт, зворотний виклик) . Напевно, всі використовують функцію jQuery.each (зворотний виклик) для ітерації над самим об’єктом jQuery, оскільки це природно. Функція утиліти jQuery.each (об'єкт, зворотний виклик) перебирає об'єкти та масиви. Тривалий час я якось не бачив, що це може бути, крім іншого синтаксису (я не проти написати всі модні петлі), і мені трохи соромно, що я зрозумів його основну силу лише нещодавно.

Вся справа в тому, що оскільки тіло циклу в jQuery.each (об'єкт, зворотний виклик) є функцією , ви отримуєте нову область застосування щоразу в циклі, що особливо зручно, коли ви створюєте закриття в циклі.

Іншими словами, типова поширена помилка - робити щось на кшталт:

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

Тепер, коли ви будете викликати функції в functionsмасиві, ви отримаєте три рази попередження із вмістом, undefinedякий, швидше за все, не є тим, що ви хотіли. Проблема в тому, що існує лише одна змінна i, і всі три закриття посилаються на неї. Коли цикл закінчується, кінцеве значення 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, як очікувалося.

Взагалі, це нічого, чого ви не могли б зробити самі, але приємно мати.


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.
ТМ.

1
Дякую :) ... Це базовий JavaScript; так. Але я б заперечував, що jQuery - це JavaScript. Я не стверджую, що це jQuery.
cllpse

7
У цьому конкретному випадку ви хочете користуватися, $('selector').toggleClass('name_of_the_class', b);хоча.
ThiefMaster

9

Оновлення:

Просто включіть цей скрипт на сайт, і ви отримаєте консоль Firebug, яка з'явиться для налагодження в будь-якому браузері. Не настільки повноцінний, але це все ще дуже корисно! Не забудьте видалити його, коли закінчите.

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

Перевірте це посилання:

З фокусів CSS

Оновлення: я знайшов щось нове; це гаряча скринька JQuery.

JQuery Hotbox

Google розміщує кілька бібліотек JavaScript в коді Google. Завантаження його звідти економить пропускну здатність, і він швидко завантажує, тому що він уже був кешований.

<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');  
});

"Console.info" firebug, який можна використовувати для скидання повідомлень та змінних на екран, не використовуючи поля попередження. "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. насправді Google має обмеження іранців на доступ до коду google. так -1
Аліреза Еліадерані

Щойно я дізнався, що ви можете використовувати firebug в будь-якому браузері. Це круто.
Тебо

9

Коли можливо, використовуйте методи фільтрації через псевдоселектори, щоб jQuery міг використовувати querySelectorAll (що набагато швидше, ніж шипля). Розглянемо цей вибір:

$('.class:first')

Цей же вибір можна зробити, використовуючи:

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

Що потрібно швидше, оскільки початковий вибір ".class" сумісний із QSA


@ Nyuszika7H Я думаю, ви пропустите точку. Справа в тому, що QSA не може оптимізувати більшість псевдоселекторів, тому $ ('. Class: eq (0)') буде повільніше, ніж $ ('. Class'). Eq (0).
Ральф Хольцман

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. У цьому випадку: всі елементи лі, що не містять тексту "Один" або "Два", будуть видалені.


Хіба не простіше просто використовувати "кожне" та перемістити зміну поля всередині вимикача?
НезадоволенняGoat

Оновлено мою відповідь. Будь ласка, дайте мені знати, якщо я даю зрозуміти (ер)
cllpse

Це дійсно ВИДАЛЯЄТЬСЯ елементи лі? Здається, це насторожує з відфільтрованим списком елементів.
Cheeso

1
Функція фільтра видаляє елементи з колекції всередині об’єкта jQuery. Це не впливає на DOM.
cllpse

6
У своїй функції фільтра можна просто написати: return !! $ (this) .text (). Match (/ One | Two /); ;)
Вінсент

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

Розумне використання сторонніх сценаріїв jQuery, таких як перевірка поля форми або розбір URL-адреси. Варто ознайомитись із тим, що стосується, щоб ви дізналися, коли наступного разу зіткнетеся з вимогою 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 * . І як би цього було недостатньо; вони примусово подають функцію передачі даних за допомогою стероїдів, а це означає, що ви можете зберігати складні об'єкти у формі 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!
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.