Javascript jQuery提示和技巧 语法 公鸡酸 公鸡酸 内森·朗 公鸡酸 公鸡酸 公鸡酸 公鸡酸 奥利 尼克夫 公鸡酸 数据存储 由TenebrousX 公鸡酸 菲利普·杜帕诺维奇 优化 公鸡酸 卢佩斯惨败 内森·朗 安德烈亚斯·格雷奇 混杂的 红场 按TM 肯 不择手段 江山 公鸡酸 本 按颜色混合 哈里约特 简·齐奇 作者:克里斯S 奥涅德 公鸡酸
我真的不喜欢Javascript jQuery提示和技巧 语法 公鸡酸 公鸡酸 内森·朗 公鸡酸 公鸡酸 公鸡酸 公鸡酸 奥利 尼克夫 公鸡酸 数据存储 由TenebrousX 公鸡酸 菲利普·杜帕诺维奇 优化 公鸡酸 卢佩斯惨败 内森·朗 安德烈亚斯·格雷奇 混杂的 红场 按TM 肯 不择手段 江山 公鸡酸 本 按颜色混合 哈里约特 简·齐奇 作者:克里斯S 奥涅德 公鸡酸,javascript,jquery,Javascript,Jquery,我真的不喜欢$(document.ready(fn)快捷方式。当然,它减少了代码,但也减少了代码的可读性。当您看到$(document).ready(…)时,您知道自己在看什么$(…)被用在了太多其他方式上,无法立即发挥作用 如果您有多个框架,那么可以使用jQuery.noConflict()如您所说,但您也可以为其分配不同的变量,如下所示: var $j = jQuery.noConflict(); $j("#myDiv").hide(); (function($) { $('..
$(document.ready(fn)
快捷方式。当然,它减少了代码,但也减少了代码的可读性。当您看到$(document).ready(…)
时,您知道自己在看什么<代码>$(…)被用在了太多其他方式上,无法立即发挥作用
如果您有多个框架,那么可以使用jQuery.noConflict()代码>如您所说,但您也可以为其分配不同的变量,如下所示:
var $j = jQuery.noConflict();
$j("#myDiv").hide();
(function($) {
$('...').etc() // whatever jQuery code you want
})(jQuery);
如果您有几个框架可以归结为$x(…)
-风格的调用,那么这非常有用。明智地使用第三方jQuery脚本,例如表单字段验证或url解析。值得一看是关于什么的,这样你就可以知道下次遇到JavaScript需求的时候了。我喜欢在匿名函数的开头声明一个$this
变量,这样我知道我可以引用一个jthis变量
像这样:
$('a').each(function() {
var $this = $(this);
// Other code
});
不仅仅是jQuery,我还为jQuery和MS AJAX搭建了一座很好的桥梁:
Sys.UI.Control.prototype.j = function Sys$UI$Control$j(){
return $('#' + this.get_id());
}
如果你正在做很多ASP.NET AJAX,那就太好了,因为微软现在支持jQuery。有一个漂亮的桥接器意味着jQuery操作非常容易:
$get('#myControl').j().hide();
因此,上面的示例不是很好,但是如果您正在编写ASP.NET AJAX服务器控件,则可以很容易地在客户端控件实现中使用jQuery。它允许您在不修改DOM的情况下将数据绑定到DOM元素。我总是将jQuery代码包装在一个闭包中,而不是为jQuery对象使用不同的别名(使用noConflict时)。这可以在document.ready函数中完成:
var $ = someOtherFunction(); // from a different library
jQuery(function($) {
if ($ instanceOf jQuery) {
alert("$ is the jQuery object!");
}
});
或者,您可以这样做:
var $j = jQuery.noConflict();
$j("#myDiv").hide();
(function($) {
$('...').etc() // whatever jQuery code you want
})(jQuery);
我觉得这是最方便携带的。我一直在一个同时使用Prototype和jQuery的网站上工作,这些技术避免了所有冲突。创建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");
});
嵌套过滤器
您可以嵌套过滤器(如所示)
将jQuery对象保存在变量中以供重用
将jQuery对象保存到变量中可以重用它,而无需通过DOM进行搜索
(正如@Louis所建议的,我现在使用$表示变量包含jQuery对象。)
作为一个更复杂的例子,假设您在商店中有一个食品列表,您只想显示符合用户标准的食品。您有一个带有复选框的表单,每个复选框都包含一个条件。复选框的名称有有机
和低脂
,产品有相应的类别-。有机
,等等
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();
});
检查索引
jQuery有.index,但使用起来很麻烦,因为您需要元素列表,并传入您想要索引的元素:
var index = e.g $('#ul>li').index( liDomObject );
以下几点要简单得多:
如果您想知道无序列表中集合(例如列表项)中元素的索引:
$("ul > li").click(function () {
var index = $(this).prevAll().length;
});
在核心jQuery函数上,除了选择器参数之外,还指定上下文参数。指定上下文参数允许jQuery从DOM中更深的分支开始,而不是从DOM根开始。给定足够大的DOM,指定上下文参数应该转化为性能提升
示例:在文档的第一个表单中查找radio类型的所有输入
$("input:radio", document.forms[0]);
参考资料:哦,别忘了!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>
jQuery('*[class=validation]')。每个(函数(){
var metadata=$(this.metadata();
//等等。
});
语法速记糖东西--缓存对象集合并在一行上执行命令:
而不是:
var jQueryCollection = $("");
jQueryCollection.command().command();
var jQueryCollection = $("").command().command();
$('your_selector').forEach( function() {} );
我有:
var jQueryCollection = $("");
jQueryCollection.command().command();
var jQueryCollection = $("").command().command();
$('your_selector').forEach( function() {} );
有点“真实”的用例可以是这样的:
var cache = $("#container div.usehovereffect").mouseover(function ()
{
cache.removeClass("hover").filter(this).addClass("hover");
});
用命名函数替换匿名函数。这确实取代了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 );
实时事件处理程序
为与选择器匹配的任何元素设置事件处理程序,即使它在初始页面加载后被添加到DOM中:
$('button.someClass').live('click', someFunction);
这就允许了y
<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());
});
var subset = $("");
$("input[value^='']", subset);
var functions = [];
var someArray = [1, 2, 3];
for (var i = 0; i < someArray.length; i++) {
functions.push(function() { alert(someArray[i]) });
}
var functions = [];
var someArray = [1, 2, 3];
$.each(someArray, function(item) {
functions.push(function() { alert(item) });
});
<script type='text/javascript' src='http://getfirebug.com/releases/lite/1.2/firebug-lite-compressed.js'></script>
<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.time('create list');
for (i = 0; i < 1000; i++) {
var myList = $('.myList');
myList.append('This is list item ' + i);
}
console.timeEnd('create list');
var e = $("<a />", { href: "#", class: "a-class another-class", title: "..." });
$("<a />", {
...
css: {
color: "#FF0000",
display: "block"
}
});
$(document).ready(function ()
{
// ...
});
$(function ()
{
// ...
});
$("a").hide().addClass().fadeIn().hide();
$("a")
.hide()
.addClass()
.fadeIn()
.hide();
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");
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() {} );
$('your_selector').forEach( function() {}, 1000 );
$('your_selector').forEach( function() {}, 500 );
// next lines of code will run before above code is complete
$("#someElement").hover(function(){
$("div.desc", this).stop(true,true).fadeIn();
},function(){
$("div.desc", this).fadeOut();
});
$("<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();
}()));
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");
}
}
$('selector').toggleClass('name_of_the_class', true/false);
$('.class:first')
$('.class').eq(0)
<p data-xyz = '{"str": "hi there", "int": 2, "obj": { "arr": [1, 2, 3] } }' />
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!