【问题标题】:Passing Parameters into JavaScript object events using jQuery使用 jQuery 将参数传递给 JavaScript 对象事件
【发布时间】:2011-03-12 09:09:34
【问题描述】:

我知道有很多类似的问题,但我已经尝试了所有这些都无济于事......所以感谢您的帮助。

我想做什么: 我想在注册时将一对多参数传递给每个复选框的“点击”事件(见下文)。

工作原理: 我可以在没有任何参数的情况下注册事件,并且单击事件会引发...但我需要传入对包含 JavaScript 网格对象的引用(出于其他原因)。

什么失败 我尝试了各种形式的“this.MutuallyExclusiveCheckBoxHandler = function(grid){}”,但无济于事。

一个想法: 我“认为”currying 可能是答案,但我不太清楚如何做得足够好(还)。

此区域实例化网格并注册复选框

<script type="text/javascript">
<!--
    // CLASS
    function CommitImporterGrid() {
        // PROPERTIES
        this.Toaster = new Toaster();
        this.CheckBoxes = new Array();

        // METHODS
        this.RegisterMutuallyExclusiveCheckBox = function(clientId) {

            var checkBox = $j('input:checkbox#' + clientId);

            // HERE: "I need to pass a reference to the grid somehow"
            $j(checkBox).click(this.MutuallyExclusiveCheckBoxHandler);

            this.CheckBoxes.push(checkBox); // Append to array
        }
        this.MutuallyExclusiveCheckBoxHandler = function() {

            // The checkbox events break when I try to add a parameter.
            var myGrid = "I need to retreive the grid reference here somehow";

            if (!$j(this).is(':checked')) { // They clicked on the same checkbox
                this.checked = true;
                return;
            }

            // ...other code...
        }
    }

     // CLASS INSTANCE
     var myGrid = new CommitImporterGrid();

     // DOM EVENT: Document.Ready()
     $j(document).ready(function() {

         // DYNAMIC REGISTRATION
         myGrid.RegisterMutuallyExclusiveCheckBox('chkCommitImporter01');
         myGrid.RegisterMutuallyExclusiveCheckBox('chkCommitImporter02');
     });
-->
</script>

【问题讨论】:

    标签: javascript jquery events checkbox


    【解决方案1】:

    您需要添加一个匿名函数,该函数使用您的参数调用您的处理程序,如下所示:

    this.RegisterMutuallyExclusiveCheckBox = function(clientId) {
        var self = this;
    
        var checkBox = $j('input:checkbox#' + clientId);
    
        $j(checkBox).click(function() {
            self.MutuallyExclusiveCheckBoxHandler(parameters);
        });
    
        this.CheckBoxes.push(checkBox); // Append to array
    };
    

    在事件处理程序内部,this 指的是触发事件的元素。
    因此,我使用了一个单独的 self 变量。

    【讨论】:

      【解决方案2】:

      使用.bind() 并传递事件数据(假设您的网格是当前对象):

      // HERE: "I need to pass a reference to the grid somehow"
      checkBox.bind('click', {grid: this}, this.MutuallyExclusiveCheckBoxHandler);
      

      (你不需要将checkbox传递给jQuery,它已经是一个jQuery对象了)

      并将您的方法更改为:

       this.MutuallyExclusiveCheckBoxHandler = function(event) {
            var mygrid = event.data.grid;
            //...
       }
      

      (您可以通过event.data访问事件数据)

      【讨论】:

      • @SLaks:为什么?它应该,否则,this.MutuallyExclusiveCheckBoxHandler 也不起作用。
      • 在处理程序内部,this 将是 DOM 元素。
      • @SLaks:我认为在处理程序内部,this 应该引用 DOM 元素,否则,!$j(this).is(':checked') 将没有意义。
      • Felix 是正确的:在处理程序中“this”确实引用了 (checkbox) 元素。所以“被检查”的逻辑是有效的。至于 even.data 解决方案......它就像一个冠军。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      • 1970-01-01
      • 2011-04-16
      相关资源
      最近更新 更多