Javascript jQuery attr方法可以设置单击处理程序和内部文本

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:',

阅读jQueryUI对话框代码,我发现jQuery方法有一些未记录的行为:

<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()来处理事件,而不是像这样逐个对象地设置它。