我正在开发一个使用jQuery的项目,我对Mootools更熟悉。
我先从我的代码开始。
var customNamespace = {
status: 'closed',
popup: $('#popup'),
showPopup: function() {
// ...
}
}
$(document).ready(function(){
console.log($('#popup'));
console.log(customNamespace.popup);
console.log($(customNamespace.popup));
$('#popup').fadeIn('slow');
(customNamespace.popup).fadeIn('slow');
$(customNamespace.popup).fadeIn('slow');
});
我的目标是每次想要使用#popup div执行某些操作时都不会让jQuery遍历DOM,所以我想将它保存到变量中以便在整个脚本中使用它。
当页面加载时,控制台会按照我的预期打印出对象3次,所以我认为对于每种方法,fadeIn都可以正常工作。但事实并非如此,只有
$('#popup').fadeIn('slow');
实际上在div中淡出。
即使我删除了我的命名空间哈希,只是将对象保存到全局变量,然后执行
var globalVariable = $('#popup');
.
.
.
globalVariable.fadeIn('slow');
也不像我想的那样工作。 jQuery可以做我想做的事吗?
答案 0 :(得分:4)
您在哪里分配全局变量?
如果它在document.ready声明之外,那么你可能正在为它分配一些尚未加载的内容。
试试这个:
$(document).ready(function(){
var customNamespace = {
status: 'closed',
popup: $('#popup'),
showPopup: function() {
// ...
}
}
console.log($('#popup'));
console.log(customNamespace.popup);
console.log($(customNamespace.popup));
$('#popup').fadeIn('slow');
(customNamespace.popup).fadeIn('slow');
$(customNamespace.popup).fadeIn('slow');
});
尝试输出.length
时会发生什么? :
console.log($('#popup').length);
console.log(customNamespace.popup.length);
console.log($(customNamespace.popup.length));
答案 1 :(得分:4)
在运行选择器并将其分配给变量之前,您需要小心实际加载DOM,否则您可以在变量中存储对DOM元素的引用而没有任何问题。
var globalVariable;
$(document).ready(function(){
globalVariable = $('#popup');
console.log($('#popup'));
console.log(globalVariable);
$('#popup').fadeIn('slow');
globalVariable.fadeIn('slow');
});
答案 2 :(得分:1)
当然,这很有效。提高绩效实际上是一件好事。
答案 3 :(得分:1)
从$()
返回的所有内容都将永远是一个对象。您的问题是,当分配customNamespace
并执行代码时,DOM元素#popup
尚不存在,因此,您将在该示例中得到零长度对象
要检查你是否在jQuery中找到了一个对象,你不检查结果为null,你检查它的长度。
为了确保在执行代码时存在DOM节点,请将其推迟到DOMReady:
$(document).ready(function() {
...
});
答案 4 :(得分:1)
使用数据方法并避免在DOM中存储数据。一些开发人员习惯将数据存储在HTML属性中,如fx。:
$('selector').attr('alt', 'data being stored');
//以后可以使用以下方法检索数据: $( '选择')ATTR( 'ALT');
HTML属性并不意味着存储类似的数据,而“alt”作为参数名称并不真正有意义。在大多数情况下,正确的选择是使用jQuery中的数据方法。它允许您将数据与页面上的元素相关联。
$('selector').data('paramtername', 'data being stored');
//然后稍后获取数据 $( '选择')数据( 'paramtername');
此方法允许您存储具有有意义名称的数据,并且它更灵活,因为您可以在页面上的任何元素上存储任意数量的数据。有关data()和removeData()的更多信息,请参阅此处jQuery internals这样做的一个经典用法是保存输入字段的默认值,因为您希望在焦点上清除它。
<form id="testform">
<input type="text" class="clear" value="Always cleared" />
<input type="text" class="clear once" value="Cleared only once" />
<input type="text" value="Normal text" />
</form>
$(function() {
//Go through every input field with clear class using each function
//(NB! "clear once" is two classes clear and once)
$('#testform input.clear').each(function(){
//use the data function to save the data
$(this).data( "txt", $.trim($(this).val()) );
}).focus(function(){
// On focus test for default saved value and if not the same clear it
if ( $.trim($(this).val()) === $(this).data("txt") ) {
$(this).val("");
}
}).blur(function(){
// Use blur event to reset default value in field that have class clear
// but ignore if class once is present
if ( $.trim($(this).val()) === "" && !$(this).hasClass("once") ) {
//Restore saved data
$(this).val( $(this).data("txt") );
}
});
});
在这里演示:link text
答案 5 :(得分:0)
我喜欢构建类似于此的脚本。对我而言,它将我的所有页面控件保持在一起 它还允许我为每个页面更轻松地维护我的脚本。
/* CONTROLS GLOBAL */
var Controls;
var Class = {
create: function () {
return function () {
this.initialize.apply(this, arguments);
}
}
}
//Set up page control objects
PageControls = Class.create();
PageControls.prototype = {
initialize: function () {
//Use jquery to initialize our controls,
//one should probably use more appropriate names other than ctrl1, ctrl2 ..
//but for demo purposes ...
this.ctrl1 = $($("#Control1"));
this.ctrl2 = $($("#Control2"));
this.ctrl3 = $($("#Control3"));
}
}
准备好了......
$(document).ready(function () {
/* Initialize our global page controls */
Controls = new PageControls();
//Now we can use our controls
Controls.ctrl1.val("Text for control 1");
Controls.ctrl2.val("Text for control 2");
Controls.ctrl3.val("Text for control 3");
});