当前位置:  开发笔记 > 编程语言 > 正文

jQuery提示和技巧

如何解决《jQuery提示和技巧》经验,为你挑选了31个好方法。

创建HTML元素并保留引用

var newDiv = $("
"); 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认同)

另外,如果它有任何帮助,你实际上可以做$("

")并实现与$("
")相同的功能 (22认同)

因为我还不能编辑社区wiki:将赋值和存在性检查与`if((var someDiv = $("#someDiv")).length){/*用someDiv做的东西...*/}结合起来 (5认同)

我喜欢新的选择器部分,不知道这一点. (4认同)

@Ben:我在JavaScript中避免使用这些习语的原因是因为我不想在`if`语句中给出`someDiv`作为范围的错觉,因为它不是; JavaScript仅支持函数范围 (4认同)

添加选择器:太棒了!希望我早就知道了! (2认同)


clawr.. 111

jQuery的data()方法很有用,但并不为人所知.它允许您在不修改DOM的情况下将数据绑定到DOM元素.



1> Andreas Grec..:

创建HTML元素并保留引用

var newDiv = $("
"); 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");
});


编写自己的选择器非常灵活
另外,如果它有任何帮助,你实际上可以做$("
")并实现与$("
")相同的功能
因为我还不能编辑社区wiki:将赋值和存在性检查与`if((var someDiv = $("#someDiv")).length){/*用someDiv做的东西...*/}结合起来
我喜欢新的选择器部分,不知道这一点.
@Ben:我在JavaScript中避免使用这些习语的原因是因为我不想在`if`语句中给出`someDiv`作为范围的错觉,因为它不是; JavaScript仅支持函数范围
添加选择器:太棒了!希望我早就知道了!

2> clawr..:

jQuery的data()方法很有用,但并不为人所知.它允许您在不修改DOM的情况下将数据绑定到DOM元素.


@Thinker:是的,确实如此.
data()确实有很大的帮助.
我注意到它不适用于没有设置ID的元素.

3> Nathan Long..:

嵌套过滤器

你可以嵌套过滤器(如此处所示的nickf).

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


虽然小心这个......:已经进行了全深度搜索,所以它可能会变得相当昂贵.
这更像是"如何不使用jQuery ......"的例子 - 非常非常慢......

4> Oli..:

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

如果你有多个框架可以jQuery.noConflict();按照你的说法使用,但你也可以为它分配一个不同的变量:

var $j = jQuery.noConflict();

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

如果您有几个可以简化为$x(...)-style调用的框架,那将非常有用.



5> Filip Dupano..:

哦,我们不要忘记jQuery元数据!data()函数很棒,但必须通过jQuery调用填充.

而不是违反W3C对自定义元素属性的遵从性,例如:

 

改为使用元数据:





@Oskar - 是的,这已经在jQuery 1.4.3中实现 - `data-*`属性可以通过调用`.data()自动获得.
这是一种不合时宜的做法.停止传播不良做法.
html5数据属性使这不是一个问题; 有讨论将HTML5数据与jQuery的数据内嵌属性()函数在进行中:http://forum.jquery.com/topic/patch-feedback-requested-html5-data-attrs-transcend-into-the-fn-data -API

6> TM...:

现场活动处理程序

为与选择器匹配的任何元素设置事件处理程序,即使它在初始页面加载后被添加到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 ..你救了我很多心痛......我刚刚读了你的参赛作品,而我正在休息时间 - 为什么我的活动没有开火.谢谢
对于本文的任何其他后来者,您可能还需要查看delegate():http://api.jquery.com/delegate/类似于live,但更高效.
只需记住.live冒泡到身体,以便可以触发绑定的直播事件.如果沿途有什么东西取消该事件,则直播活动不会触发.

7> ken..:

用命名函数替换匿名函数.这真的取代了jQuery上下文,但是由于它依赖于回调函数,它在使用jQuery时似乎更加发挥作用.我使用内联匿名函数的问题是它们更难调试(更容易查看具有明确命名函数的callstack,而不是6级"匿名"),以及同一个内部的多个匿名函数这一事实jQuery链可能变得难以阅读和/或维护.另外,匿名函数通常不会被重用; 另一方面,声明命名函数鼓励我编写更有可能被重用的代码.

插图; 代替:

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

我更喜欢:

function onState(){
    // do something
}

function offState(){
    // do something else
}

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


对不起Ben,但我没看到你的评论与我的帖子有什么关系.你能详细说说吗?你仍然可以使用我的建议使用'self'(或任何其他变量); 它根本不会改变任何一个.
我必须提一下:总是毛皮变量和命名空间中的函数而不是root!

8> cllpse..:

在元素创建时定义属性

在jQuery 1.4中,您可以使用对象文字在创建元素时定义属性:

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

...你甚至可以添加样式:

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

这是文档的链接.



9> nickf..:

而不是为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的网站,这些技术避免了所有冲突.


但是有一点不同,第一个例子将等待document.ready()事件触发,而第二个例子则不会.
`instanceOf`不起作用,只有`instanceof`.它无论如何都无法工作,因为`jQuery instanceof jQuery`会返回`false`.`$ == jQuery`是正确的方法.

10> redsquare..:

检查索引

jQuery有.index但是使用起来很痛苦,因为你需要元素列表,并传入你想要索引的元素:

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

以下更容易:

如果您想知道无序列表中集合中元素的索引(例如列表项):

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


这很酷,但重要的是要知道,如果您之前的兄弟姐妹不是选择的一部分,那么它不能正常工作.
见上面@ken!
我很确定自jQuery 1.4以来,你可以使用`index()`并从其父级获取索引.

11> cllpse..:

准备活动的简写

明确而冗长的方式:

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

简写:

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


就个人而言,我发现明确的方式更具可读性.

12> mshafrir..:

在核心jQuery函数上,除了selector参数之外还指定context参数.指定context参数允许jQuery从DOM中的更深层分支开始,而不是从DOM根开始.给定足够大的DOM,指定上下文参数应转换为性能增益.

示例:在文档的第一个表单中查找无线电类型的所有输入.

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

参考:http://docs.jquery.com/Core/jQuery#expressioncontext


注意:`$(document.forms [0]).find('input:radio')`做同样的事情.如果你看一下jQuery源代码,你会看到:如果你将第二个参数传递给`$`,它实际上会调用`.find()`.

13> Aaron Powell..:

不仅仅是jQuery,但我为jQuery和MS AJAX做了一个很好的小桥:

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

如果你正在做很多ASP.NET AJAX,这真的很好,因为MS支持jQuery现在有一个很好的桥接意味着它很容易做jQuery操作:

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

所以上面的例子不是很好,但是如果你正在编写ASP.NET AJAX服务器控件,那么就可以轻松地在客户端控件实现中使用jQuery.



14> cllpse..:

优化复杂选择器的性能

使用复杂选择器时,查询DOM的子集可以显着提高性能:

var subset = $("");

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


仅当缓存/保存该子集时.
这与$("")没什么不同.find("input [value ^ ='']")
@Chad,它实际上是相同的,并映射到你写的功能

15> egyamado..:

说到提示和技巧以及一些教程.我发现这些教程系列("jQuery的绝对初学者"视频系列)由杰弗里方式是非常有帮助的.

它针对那些不熟悉jQuery的开发人员.他展示了如何使用jQuery创建许多很酷的东西,比如动画,创建和删除元素等......

我从中学到了很多东西.他展示了如何使用jQuery很容易.现在我喜欢它,我可以阅读和理解任何jQuery脚本,即使它很复杂.

这是一个我喜欢" 调整文本大小 "的例子

1- jQuery ......


2- CSS造型......


2- HTML ...

Larger | Smaller

In today’s video tutorial, I’ll show you how to resize text every time an associated anchor tag is clicked. We’ll be examining the “slice”, “parseFloat”, and “CSS” Javascript/jQuery methods.

强烈推荐这些教程......

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



16> OneNerd..:

异步each()函数

如果你有非常复杂的文件运行jquery 每个()函数在迭代期间锁定浏览器,和/或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


我为一个内部项目编写了这个,虽然我确信它可以改进,但它适用于我们需要的东西,所以希望你们中的一些人觉得它很有用.谢谢 -



17> cllpse..:

Syntactic shorthand-sugar-thing - 在一行上缓存对象集合并执行命令:

代替:

var jQueryCollection = $("");

jQueryCollection.command().command();

我做:

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

一个有点"真实"的用例可能是这样的:

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


最好把$(this)引用放在一个局部变量中,因为你会在这里遇到一个小小的性能,因为它需要更长的时间......
在这种情况下(没有双关语)我只使用"这个"一次.无需缓存.

18> Ben Crouse..:

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

像这样:

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

    // Other code
});


我改用"那个":)
乔 - 只是一个抬头,被调用者将离开ECMAScript 5和严格模式.请参阅:http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
ROA:是的,这将是酸:)你也可以使用arguments.callee来启用匿名函数来引用自己

19> Nathan Long..:

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


我的命名惯例是在前面有一个`$`.例如`var $ allItems = ...`
@Lavinski - 我认为这个想法是`$`表示这是一个jQuery对象,这样可以更容易在视觉上区别于其他变量.

20> Jan Zich..:

似乎已经提到了大多数有趣且重要的提示,所以这只是一点补充.

小技巧是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,所有三个闭包都引用它.当循环结束时,最终值为i3,并且someArrary[3]undefined.您可以通过调用另一个为您创建闭包的函数来解决它.或者您使用jQuery实用程序,它基本上会为您执行此操作:

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

现在,当您调用这些函数时,您将获得三个警报,其中包含内容1,2和3.

一般来说,这是你自己无法做到的事情,但它很高兴.



21> cllpse..:

像访问数组一样访问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);


在这种特殊情况下,你真的想要使用`$('selector').toggleClass('name_of_the_class',b);`.
这很整洁,有一些有趣的用途,但它根本不是jQuery特有的......这只是你可以在任何JavaScript对象上做的事情.

22> cllpse..:

从集合中删除元素并保留可链接性

考虑以下:

  • One
  • Two
  • Three
  • Four
  • Five


$("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元素.


在你的过滤函数中,你可以简单地写:return !! $(this).text().match(/ One | Two /); ;)

23> Tebo..:

更新:

只需在网站上包含此脚本,您就可以在任何浏览器中弹出一个Firebug控制台进行调试.不完整的功能,但它仍然非常有用!记得在完成后将其删除.






















    
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有