jQuery技巧和窍门


507

句法

数据存储

优化

Answers:


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'Dec 23'08

22
另外,如果有帮助,您可以实际执行$(“ <div />”)并实现与$(“ <div> </ div>”)相同的功能
Hugoware

4
我喜欢新的选择器部分,对此一无所知。
Pim Jager

5
由于我还不能编辑社区Wiki,请使用:if ((var someDiv = $("#someDiv")).length) { /* do stuff with someDiv... */ }
本人的

4
@Ben:之所以避免在JavaScript中使用这样的习惯用法,是因为我不想给人someDiv以在if语句中作用域的幻想,因为它不是。JavaScript仅支持函数作用域
Andreas Grech,2010年

111

jQuery的data()方法很有用,但并不为人所知。它允许您将数据绑定到DOM元素,而无需修改DOM。


4
data()确实有很大帮助。
Pim Jager

3
我注意到,没有设置ID的元素将无法使用它。
思想家

20
@Thinker:是的,确实如此。
Alex Barrett

使用data()而不是声明全局js变量imo。
约翰(Johan)2012年

95

嵌套过滤器

您可以嵌套过滤器(如nickf所示)。

.filter(":not(:has(.selected))")

3
尽管要小心...:已经执行了全面的搜索,所以它可能会变得很昂贵。
哈波

80

我真的不喜欢$(document).ready(fn)捷径。当然,它减少了代码的编写,但同时也减少了代码的可读性。当您看到时$(document).ready(...),便知道您在看什么。$(...)太多其他方式用于立即有意义。

如果您有多个框架,则可以按需使用jQuery.noConflict();,但是也可以像这样为它分配一个不同的变量:

var $j = jQuery.noConflict();

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

如果您有几个可以归结为$x(...)-style调用的框架,则非常有用。


1
@Oli:关于文档的速记速记;你有一定道理。但绝不少:这是一个提示/技巧。我之所以在所有代码中使用它,纯粹是因为我认为它“看起来”更好。我个人偏爱:)
cllpse

每天我都会经历毫无意义的XML / XLS / XLST,使用太多抽象层编写的站点,站点上复杂的故障转移系统,这些站点永远都不会超越最卑鄙的服务器...而人们仍然抱怨$( <string>)&$(<function>)。让我想哭:)
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的数据()函数: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文档

UPDATE: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

4
+1 ..您为我省了很多心痛。.我刚读完您的条目,而我正在休息一下-排解为什么我的活动未触发的问题。谢谢
Luke101

2
对于本文的所有其他后来者,您可能还需要查看一下委托():api.jquery.com/delegate 与live类似,但效率更高。
Oskar Austegard

2
只需记住.live气泡向上到达身体,以便可以触发绑定的live事件。如果沿途发生的事件取消了该事件,则实时事件将不会触发。
nickytonline 2011年

1
自jQuery 1.7 11月3日发布以来,live()和die()是已弃用的方法。取而代之的是on(),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
对不起,本,对不起,但是我看不到您的评论与我的帖子有何关联。你能详细说明吗?根据我的建议,您仍然可以使用“自我”(或任何其他变量);它根本不会改变任何事情。

是的,本,你到底是什么意思!?
詹姆斯

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

我发现这是最便携的。我一直在同时使用Prototype和jQuery的网站上工作,这些技术避免了所有冲突。


第二个例子对眼睛好:)
cllpse

25
虽然有所不同,但第一个示例将等待document.ready()事件触发,而第二个示例则不会。
SamBeran 2009年

1
@SamBeran:是的,第二个示例将立即运行;但是,如果要包装一个对象字面量,则可以在对象字面量内使用$(document).ready(...),这意味着您可以指定何时运行每段代码。
Wil Moore III

4
instanceOf只会起作用instanceof。而且它还是不管用,因为jQuery instanceof jQuery它将返回false$ == jQuery是正确的方法。
nyuszika7h 2011年

@ Nyuszika7H:是的,您是对的,但这并不是代码示例的重点。
尼克

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

好的,是的,我在某种程度上扮演了恶魔的拥护者的角色,因为当我审阅jQuery的index()时,我意识到对屁股有点痛苦。感谢您的澄清!

4
这很酷,但是很重要的一点是要知道,如果以前的兄弟姐妹不在选择范围之内,那将是不正确的。
TM。

2
我很确定自jQuery 1.4起,您就可以使用它index()并从其父级获取索引。
Alex

@alex-当然可以,但是请注意这篇文章的日期-它是1.4版本发布前的5个月!
redsquare

23

准备活动的简写

显式和冗长的方式:

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

速记:

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

22

在核心jQuery函数上,除了选择器参数外,还要指定上下文参数。指定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源,您将看到:如果将第二个参数传递给$,它将实际上调用.find()
nyuszika7h 2011年

那... $('form:first input:radio')呢?
daGrevis 2011年

保罗·爱尔兰(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,2009年

this.get_id()将在客户端范围内返回控件的ID。服务器指定的ID是irrelivant作为取决于母体cotrol层次结构中产生的客户端ID
亚伦鲍威尔

20

优化复杂选择器的性能

使用复杂的选择器大幅提高性能时,查询DOM的子集:

var subset = $("");

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

7
仅当该子集被缓存/保存时。
Dykam

6
与$(“”)。find(“ input [value ^ =”]“)没什么不同
Chad Moran 2010年

1
@Dykam:就我的示例代码而言,就是这样。但是您的观点仍然有效。
cllpse 2011年

4
@Chad,它实际上是相同的,并且映射到您编写的函数
Mike Robinson

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样式...

<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弹出“ 您想继续运行此脚本 ”消息,那么此解决方案将节省您的时间。

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() {} );

一个可选的第二参数,可以指定在迭代之间的速度/延迟其可以是用于动画有用(下面的例子将等待在迭代之间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
最好将$(this)引用放在局部变量中,因为您会受到轻微的影响,因为这将花费更长的时间...
Sander Versluys

4
在这种情况下(无双关语),我只使用过一次“ this”。无需缓存。
cllpse

1
一个小技巧。尽管在这种情况下可能无关紧要,但对DOM进行额外更改始终是一个坏主意。举例来说,您要悬停的元素已经具有“悬停”类。您将删除该类并重新添加它。您可以使用解决此问题$(this).siblings().removeClass("hover")。我知道这听起来是一件很小的事情,但是每次您更改DOM时,都会触发另一个浏览器重绘。其他可能性包括附加到DOMAttrModified的事件或更改元素高度的类,这些类可能引发其他“调整大小”事件侦听器。
gradbot

1
如果要使用缓存并最小化DOM更改,可以执行此操作。cache.not(this).removeClass("hover")
gradbot

@gradbot:我不明白您的最后两条评论。你能扩大吗?
Randomblue 2011年

15

我喜欢$this在匿名函数的开头声明一个变量,所以我知道可以引用jQueried这个变量。

像这样:

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

    // Other code
});

12
我改用“ that” :)
cllpse

2
ROA:是的,这很
麻烦

5
乔-抬起头来,被呼叫者将不再使用ECMAScript 5和严格模式。请参阅:ejohn.org/blog/ecmascript-5-strict-mode-json-and-more
Mike Robinson,2009年

@Joe您可以给它起个名字,只是要警惕IE的怪癖
alex

一个很好的例子,与标准变量相比,在变量名的开头使用$表示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...

举一个更复杂的示例,假设您在商店中有一份食物清单,并且只想显示符合用户条件的食物。您有一个带有复选框的表单,每个复选框都包含一个条件。复选框的名称类似于organiclowfat,产品具有相应的类- .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)2010年

6
@Lavinski-我认为想法是$表示这是一个jQuery对象,这将使其在视觉上与其他变量区分开来更加容易。
内森·朗

@Louis-从那以后我就采用了您的约定,并将相应地更新我的答案。:)
内森·朗

11

似乎已经提到了大多数有趣且重要的提示,因此该提示只是一些补充。

小技巧是jQuery.each(object,callback)函数。每个人都可能使用jQuery.each(callback)函数来迭代jQuery对象本身,因为它很自然。jQuery.each(object,callback)实用程序函数遍历对象和数组。很长一段时间以来,除了某种不同的语法(我不介意编写所有老式的循环)之外,我不知为何看不到它的意义,而让我感到realized愧的是,我直到最近才意识到它的主要优势。

事实是,由于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数组中的函数时,您将收到三次警报,提示中的内容undefined很可能不是您想要的。问题在于,只有一个变量i,并且所有三个闭包均引用该变量。循环结束后,的最终值为i3,并且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对象上执行的操作。
TM。

1
谢谢:) ...这是基本的JavaScript;是的 但是我认为jQuery是JavaScript。我并不是说这是特定于jQuery的。
cllpse 2010年

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 Hotbox。

jQuery Hotbox

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的网页。实际上,谷歌已经限制伊朗人访问谷歌代码。所以-1
Alireza Eliaderani 09年

我刚刚发现您可以在任何浏览器中使用firebug。棒极了。
Tebo

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对象中删除元素。在这种情况下:将删除所有不包含文本“一个”或“两个”的锂元素。


仅使用“ each”并在开关内移动边距更改是否更简单?
DisgruntledGoat

更新了我的答案。请让我知道我是否在说清楚自己(er)
cllpse

这真的删除了li元素吗?似乎用过滤后的元素列表发出警报。
Cheeso,

1
filter函数从jQuery对象内部的集合中删除元素。它不影响DOM。
cllpse

6
在过滤器函数中,您可以简单地编写:return !! $(this).text()。match(/ One | Two /); ;)
Vincent 2010年

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 2011年

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!
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.