Javascript jQuery attr方法可以设置单击处理程序和内部文本
阅读jQueryUI对话框代码,我发现jQuery方法有一些未记录的行为:Javascript jQuery attr方法可以设置单击处理程序和内部文本,javascript,jquery,jquery-ui,jquery-ui-dialog,Javascript,Jquery,Jquery Ui,Jquery Ui Dialog,阅读jQueryUI对话框代码,我发现jQuery方法有一些未记录的行为: <button id="btn1">1</button> <button id="btn2">2</button> $(function() { var props = { text: 'Click it!', click: function () { console.log('Clicked btn:',
<button id="btn1">1</button>
<button id="btn2">2</button>
$(function() {
var props = {
text: 'Click it!',
click: function () {
console.log('Clicked btn:', this);
}
};
$('#btn1').attr(props, true); // Changes #btn1 inner text to 'Click it!'
// and adds click handler
$('#btn2').attr(props); // Leaves #btn2 inner text as it is and fires
// click function on document ready
});
1
2.
$(函数(){
变量props={
文本:“单击它!”,
单击:函数(){
log('Clicked btn:',this);
}
};
$(“#btn1').attr(props,true);//将#btn1内部文本更改为“单击它!”
//并添加单击处理程序
$('#btn2').attr(props);//保持#btn2内部文本不变并激发
//单击“文档准备就绪”上的“功能”
});
- 你能解释一下它是怎么工作的吗?为什么要将
设置为后面的第二个参数 属性值对的映射true
- 我可以在项目中安全地使用此功能吗
- 我在这里略作猜测,因为我不熟悉jQuery源代码
jQuery.attr
调用jQuery.access
,jQuery.access函数上方的注释如下:
// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
进一步调查后,text()
函数还调用jQuery.access
:
attr: function( name, value ) {
return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
},
.........
text: function( value ) {
return jQuery.access( this, function( value ) {
......
},
您正在使用attr来设置文本和事件处理程序,而attr并不是用来设置文本和事件处理程序的。然而,它们似乎都在使用相同的函数来完成任务,因此使用未记录的参数只是顺便给您提供了预期的行为
我认为依赖无文件的行为来完成你在这里所做的事情是不可靠的,因为jQuery的任何未来升级都会破坏你的代码。
< p>查看jQuery 1.82.代码,<代码>真的< /C>参数最终到达变量<代码> PASS <代码>,上面写着:exec = pass === undefined && jQuery.isFunction( value );
如果设置了,则告诉jQuery检查属于键的值,如果是函数,则立即调用它。因此,click:function(…)
将调用该函数,而不是注册该函数
这似乎就是各种jQuery函数的.method(function(){…}
版本的工作方式,即,不传递属性的特定值,而是传递一个本身传递原始值的函数,其返回值被分配给相关属性
我可以在项目中安全地使用此功能吗
在它被记录之前,我不会这么做。这是一个有趣的问题。我不能假装告诉你/为什么/它会这样工作,我认为甚至有理由将其作为错误报告提交给jQuery,因为他们记录的行为并不像我预期的那样 在此页面上,下面的引号显示在底部: 注意:如果setter函数(即函数(index,attr){})中没有返回任何内容,或者如果返回了undefined,则当前值不会更改。只有在满足某些条件时才有选择地设置值,这很有用 这让我在JSFIDLE上做了一些尝试: 注意,与他们的文档相反,案例8和9返回null或nothing。看看Alnitak提到的内容,这似乎是有意义的,因为他们的测试/实际上/只是验证它/是一个函数/而不是该函数返回的内容(.isFunction应该只返回true/false,这不同于说返回的值为true/false)
然而,最后,我同意Alnitak和bcoughlan的观点,即这不是您应该依赖的功能,尽管我要补充的是,除了它不稳定,因为它可能会在未来的jQuery版本中更改之外,依赖于未记录的特性的黑客也是一种不好的做法,因为未来的代码开发人员可能会修改它你今天写(包括你,在2-4个月内!)可能很容易忘记它的存在,或者它为什么被设置成这样。最好是明确的,使用文档中的功能,这样你自己和其他人都清楚你的代码打算做什么。我建议使用
attr()
在JQuery中,创建点击处理程序是一种不受支持的方法。使用该框架可能会有很多问题,但如果未记录的不信任它们,它们可能会在未来的升级中中断。我已经看到JQuery开发团队在他们的支持中表达了同样的理念。原因是,我发布了这个问题,我不明白,为什么单击应用前激发的处理程序。请注意,如果您要使用未记录的功能,至少应该记录此用法,这比简单地使用单独的click()
method还有一点值得一提,像这样的绑定事件是否能与动态添加的DOM元素一起工作还不清楚,因此您可能会丢失对新对象的绑定。最好使用.on()来处理事件,而不是像这样逐个对象地设置它。