jQuery常见问题Q&A

标签:JavaScript, jQuery

jQuery中文社区也逛了2个多月了,算是解答了数百道问题,所以整理一下比较常见的吧。

  1. jQuery是什么,有什么用?
    jQuery是一个开源的JavaScript库(可使用与开源或私有、盈利项目),它使用较为统一的接口,并做到了跨浏览器的支持,有助于JavaScript程序员书写更为优美和简短的代码。
    jQuery的主要作用有:选择元素,DOM操作(包括更改元素属性、样式、父子关系、复制删除等),处理事件,动画特效,AJAX等。
    jQuery的基本思路是用选择器选择元素,然后再对这些元素进行处理,所以选择器是基础。

  2. jQuery强大在哪里?
    我个人认为jQuery最强大的是选择器,文档里约有1/3是关于选择器的,其中不乏很多高级的选择器,例如[attribute=value]、:checked、:nth-child等,以及find()、end()之类的函数,最好多翻翻文档学习下。

  3. 学习jQuery需要什么前置知识啊?
    首先需要比较系统地了解JavaScript的语法,特别是this对象、匿名函数、JSON。
    其次要熟悉DOM接口,并找到相应的jQuery方法。
    最后要熟悉CSS和XHTML;如果需要使用AJAX,则还需要了解至少一门服务器端语言。

  4. 我不懂英文,看不懂jQuery的文档怎么办?
    这里有中文文档:jQueryAPI参考文档中文版翻译

  5. 为什么官网说jQuery不到20k,但我下载下来有50k啊?
    因为那是gzip压缩过的,如果服务器开启了gzip压缩,浏览器只会下载20k的数据,并自动解压成50k的实际代码。

  6. jQuery有几个版本,那个min和pack是什么啊?
    原版是带注释和缩进的,适合阅读和调试。
    min是gzip版,如果服务器开启了gzip压缩,就用这个版本。
    pack是用Dean Edwards写的Packer压缩的,但性能和效果不如min版。

  7. 我的服务器启用了gzip压缩,可不可以用pack版啊?
    你用任何版本都是可以的,如果启用了gzip,再用pack版并不推荐,因为2次压缩没有实质性的效果,反而造成客户端解压时间变长。
    因此推荐min版。

  8. jQuery太占服务器流量了,怎么办?
    可以使用Google的AJAX库托管服务

  9. XXX可以用jQuery来做吗?XXX怎么用jQuery来做?
    jQuery本质上是纯JavaScript实现的,所以jQuery能做到的都是JavaScript本身就支持的功能。
    如果要转成jQuery风格,请查阅文档是否有这些方法。

  10. 为什么我选择出来的元素不能访问value、innerHTML等属性?
    因为jQuery的选择器选择出来的是jQuery对象,它将DOM元素进行了封装,所以没有value、innerHTML等属性。
    如果需要可以用val()和html()方法取代;或者用get()方法、下标操作符[]获取DOM元素,再访问其属性。(我推荐前者)

  11. 我有个DOM元素,我怎么把它转换成jQuery对象啊?
    用$(dom元素)就行了。
    转换回去的话见上一问。

  12. 我知道DOM元素的id,但这个id是动态的,我怎么获取这个元素啊?
    假设变量id是你要获取的DOM的id:$('#' + id)。

  13. 我的页面上有很多个DOM元素的id是一样的,但是用jQuery只能获取1个,为什么?
    因为W3C标准规定了,1个页面里不能有2个以上元素具有相同的id属性(无id除外)。
    需要相同的话,请改用name属性,并用$('[name=xxx]')来获取。

  14. 为什么我用最新版的jQuery 1.3.2,$('[@name=xxx]')取不到对象啊?
    因为你用的是1.2.x的语法,在1.3.x里属性选择器是不需要@前缀的,去掉即可。

  15. 如果选择器里有些属性使用了[]、.等特殊字符怎么获取?
    我建议最好是不要用这些字符,如果非要使用,请用\\来进行转义,例如:$('#ooxx\\[1\\]')。

  16. $(...).xxx()和$.xxx()有什么区别啊?
    $(...)是一个选择器,它返回一个包装了DOM元素的jQuery对象,这个对象的xxx()方法一般是操作对象自身用的。
    $是jQuery这个变量的别名,它的xxx()方法一般是操作其他对象用的,所以一般需要将被操作对象作为参数来调用。

  17. jQuery有没有插件啊?
    jQuery有数以千计的插件,绝大部分都是开源的,你可以在这找到:jQuery Plugins
    其中最强大的是jQuery UI

  18. 我可以自己开发插件么?
    当然可以,jQuery提供了2个接口来扩充:
    jQuery.fn.extend:这个扩充的是$(...).xxx()这种类型的方法。
    jQuery.extend:这个扩充的是$.xxx()这种类型的方法。
    详细使用方法请参考文档。

  19. 我的网页上还有其他的变量/库使用了$,怎么能不与jQuery冲突呢?
    $只是jQuery这个变量的别名,所以只要jQuery这个变量名没被占用,你就可以用jQuery。
    方法是调用jQuery.noConflict(),然后用jQuery取代$。
    如果觉得太长了,也可以用var $j = jQuery;。此外,jQuery.noConflict()也会返回jQuery本身,所以这样也是合法的:var $j = jQuery.noConflict();。

  20. $('a, b')和$('a', 'b')有什么区别?
    $('a, b')使用的是CSS选择器,表示a和b的并集,是或的关系,相当于$('a').add('b')。
    $('a', 'b')使用的是上下文选择器,表示在b这个上下文里寻找a,是包含关系,相当于$('a').find('b')。

  21. 我选择出了很多个元素,我想对它们都调用一个方法,怎么弄?
    用each方法:
    $(...).each(function(n) {...})
    其中n是代表是第几个元素。

  22. 我不想继续执行each了,怎么办?
    在函数里return false即可。

  23. $(...).each和$.each有什么区别?
    请参考“$(...).xxx()和$.xxx()有什么区别”。

  24. 我用$('div').click对div绑定了鼠标点击事件,为什么没有效果啊?
    绑定对象时,只有当前存在的对象才会被绑定,如果是在绑定之后创建的对象,则不会绑定。
    一般来说都是在$(documnet).ready()或DOM结尾时获取元素并绑定。

  25. 为什么我用AJAX方法新生成的DOM元素不会绑定事件啊?
    原因同上。
    如果需要,请在AJAX执行成功后再次手动绑定,或使用live函数、Live Query插件

  26. 我不想让事件向上(父元素)传播怎么办?
    绑定事件时的函数对象有个event参数,调用这个参数的stopPropagation()方法就可以停止传播了。
    此外,它的preventDefault()方法可以阻止浏览器默认事件,return false则相当于调用上面2个方法。

  27. 我有没有办法知道事件最初的触发目标?
    上述的event对象有个target属性,这就是最初的触发目标。
    你可以和this进行比较,就知道当前对象是不是触发目标了。

  28. this对象究竟是什么?
    一般你只会在绑定事件时用到,它就是处理这个事件的函数所属的对象。你可以用$(this)将其转换为jQuery对象。

  29. 为什么animate函数不支持color和backgroundColor?
    请使用color插件或jQuery UI。

  30. 我想让动画不断执行怎么办?
    animate有个callback参数,在这个参数里再次调用函数自身就行了。

  31. $(documnet).ready(function(){...})和$(function(){...})有什么区别?
    没区别。后者是前者的缩写,执行时会被转换成前者。

  32. 为什么我的AJAX出现乱码?
    这是编码不一致造成的,请在客户端、服务器和数据库使用相同的编码,推荐UTF-8。
    如果没法相同,可以在客户端使用encodeURIComponent()和decodeURIComponent()处理。

  33. 我的AJAX失败了怎么办?
    使用$.ajax()函数可以进行错误和超时处理。将error的参数输出,就知道出错原因了。
    常见的原因有:服务器端未设置正确的content-type头,跨域导致权限不够。

  34. AJAX如何跨域?
    最方便的是使用JSONP,请参考《使用JSONP来取代AJAX进行跨域》

2条评论 你不来一发么↓ 顺序排列 倒序排列

    向下滚动可载入更多评论,或者点这里禁止自动加载

    想说点什么呢?