[英]confusion over simple variable declaration jQuery “$variable” vs javascript “var”
我有这个简单的幽灵文本实现:
HTML 代码:
<div id="searchPanel">
<form method="get" id="searchBox" action="somePage.php">
<input class="ghText" type="text" name="query" value="search here"/>
</form>
</div>
jQuery 代码:
$(document).ready(function(){
$txtField = "#searchPanel form input.ghText";
var value = $($txtField).val();
$($txtField).focus(function(){
if($(this).val() == value)
$(this).val("").removeClass("ghText");
});
$($txtField).blur(function(){
if($(this).val()==""){
$(this).val(value).addClass("ghText");
}
});
});
上面的例子是行不通的。 当用户将 cursor 聚焦在搜索栏上时,class “ghText”不会因为某种原因被删除。
但是,现在如果我用“$value”更改“var value”(变量初始化)和“value”,如下所示:
$value = $($txtField).val();
$(this).val($value).removeClass("ghText");
$(this).val($value).addClass("ghText");
一切正常。
我可以只是 go 睡觉而不用太担心它..但我很好奇为什么会发生这样的事情?
是因为“this”没有引用正确的 object,还是因为我尝试将 jQuery object 存储在非 jQuery 变量中,或者是其他什么问题? 我一直认为“var x”和“$x”是一样的..?
您似乎对 JavaScript 变量感到困惑。 没有“jQuery 变量”和“非 jQuery 变量”之类的东西。 一些具体案例:
因此,您可以将其称为“值”而不是“$ 值”。
可能您删除“var”这一事实通过将其变为全局变量而改变了事情。
至于“这个”,是的,这是 JavaScript 的一个棘手方面,可能会导致您的问题。 内部“焦点”和“模糊”函数内部的“this”值可能与外部“this”的值不同。 我不确定事件处理程序中的“this”到底指的是什么,但它与 object 不同。 因此,您可能想要做的是将“this”分配给外部 function 中的变量,然后在内部引用该变量来代替“this”。
在变量中存储 jQuery 选择时,通常的做法是在变量名称前添加$
,如下所示:
var $banner = $('#banner');
不必包含美元符号 - var banner = $('#banner')
也可以。 但是,美元符号提醒您该变量包含 jQuery 选择,而不仅仅是数字或字符串等任何值。
@mgiuca 关于 Javascript 变量是完全正确的——它们前面的“$”只是一个命名约定,大多数用于标识jQuery 对象。 我添加这个是因为你说
因为我尝试将 jQuery object 存储在非 jQuery 变量中
但这是错误的。 $txtField
是您用于 select 和 object 的字符串。 如果你想存储 object 本身,你应该这样做$txtField = $(#searchPanel form input.ghText)
然后使用它$txtField.val()
。
话虽如此,您的代码对我来说没有改变。 我已经设置了一个可以在 Chrome 上运行的演示- 这是你代码的精简版吗?
所以 $x 毕竟是一个 jQuery 变量:)...好吧,无论如何,这是一个例子,当 $ 或不 $ 确实对我的代码产生很大影响时:
...加载(“whatever.php”,{par1:var1,par2:var2})
至少在 $(obj).attr() 分配中不起作用,除非使用了 $var1, $var2 。 这有效:
$(obj).attr("onClick",$("#wherever").load("whatever.php", {par1: $var1, par2: $var2})...
除了@mgiuca's answer here之外,还有一个更详细的方法来解决您的问题,它也显示了一些 jQuery 概念:
$(document).ready(function () {
// define two helper functions
var removeDefault = function () {
if( $(this).val() == $(this).data("defaultValue") ) {
$(this).val("").removeClass("ghText");
}
};
var setDefault = function () {
if( $(this).val() == "" ) {
$(this).val( $(this).data("defaultValue") ).addClass("ghText");
}
};
// the following works on all input elements
$("#searchPanel form input.ghText").each(function () {
$(this)
.data("defaultValue", $(this).val())
.focus(removeDefault)
.blur(setDefault);
});
});
笔记
.data()
将值与特定元素相关联。.each()
将相同的行为应用于任意数量的元素.focus()
和.blur()
- jQuery 将始终自行this
设置
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.