【问题标题】:Is there an easier way to reference the source element for an event?是否有更简单的方法来引用事件的源元素?
【发布时间】:2010-11-17 02:26:31
【问题描述】:

我是整个 JavaScript 和 jQuery 编码的新手,但我目前正在做的是我的 HTML:

<a id="tog_table0" 
  href="javascript:toggle_table('#tog_table0', '#hideable_table0');">show</a>

然后我有一些稍微笨重的代码来调整元素:

function toggle_table(button_id, table_id) {
         // Find the elements we need
         var table = $(table_id);
         var button = $(button_id);
         // Toggle the table
         table.slideToggle("slow", function () {
         if ($(this).is(":hidden"))
     {
    button.text("show");
     } else {
       button.text("hide");
     }
    });
}

我主要想知道是否有一种更简洁的方法来引用源元素,而不必将两个 ID 传递给我的函数?

【问题讨论】:

    标签: javascript jquery html events dom


    【解决方案1】:

    你可以这样做:

    <a href="" name="#hideable_table0" class="tableHider">show</a>
    

    并将您的 javascript 更改为:

    $('a.tableHider').click(function() {
        var table = $(this.name); // this refers to the link which was clicked
        var button = $(this);
    
        table.slideToggle("slow", function() {
            if ($(this).is(':hidden')) { // this refers to the element being animated
                button.html('show');
            }
            else {
                button.html('hide');
            }
        });
    
        return false;
    });
    

    编辑:更改脚本以使用 name 属性,并向点击处理程序添加 return false。

    【讨论】:

    • 嗯,我似乎无法让它工作。更深入地看,href 原来是一个完整的链接(例如cgi-bin/myscript.pl#hideable_table0"),我想知道它可能无法确保 table 是正确的元素?此外,点击尝试将页面移动到页面上的内部“#thideable_table0”点。
    • 糟糕,对不起。已更新脚本以改用名称属性。此外,该函数现在返回 false 以防止页面滚动。如果有帮助,请告诉我。
    【解决方案2】:

    我确定这不能回答您的问题,但是有一个用于扩展表格行的漂亮插件,可能对检查它有用:

    http://www.jankoatwarpspeed.com/post/2009/07/20/Expand-table-rows-with-jQuery-jExpand-plugin.aspx

    【讨论】:

      【解决方案3】:

      在事件中使用“this”。通常在 jQuery 中 this 指的是调用处理程序的元素。

      同时尽量避免在标签中使用内联脚本事件处理程序。最好将这些事件连接到准备好的文档中。

      NB 下面的代码假定调用处理程序的元素(链接)在表内,因此它可以使用最接近的方式遍历它。情况可能并非如此,您可能需要使用其他遍历选项之一,具体取决于您的标记。

      $(function(){ 
         $('#tog_table0').click( toggle_table )
      });
      
      function toggle_table() {
         //this refers to the element clicked
         var $el = $(this);
         // get the table - assuming the element is inside the table
         var $table = $el.closest('table');
         // Toggle the table
         $table.slideToggle("slow", function () {
             $el.is(":hidden") ? $el.text("show") : $el.text("hide");
         }
      }
      

      【讨论】:

      • 在我的情况下,表格位于包含链接的标题下方。我想我会使用一些版本的 find()?
      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 2018-03-03
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 2014-05-12
      相关资源
      最近更新 更多