代码之家  ›  专栏  ›  技术社区  ›  Johannes Gorset

javascript类和jquery事件侦听器

  •  1
  • Johannes Gorset  · 技术社区  · 14 年前

    我正在编写一个类,该类需要将事件监听器附加到各个部分中的对象上(本例中为1和2),但我在从类传递变量以设置jquery事件监听器时遇到问题。

    <script type="text/javascript">
    
        function myClass(id) {
    
            this.id = id;
    
            $(document).ready(function(){
    
                $(this.id + ' .filter').click(function(){ alert("You clicked a filter"); });
    
            });
    
        }
    
        one     = new myClass('#one');
        two     = new myClass('#two');
    
    </script>
    

    <div id="one">
        <a href="javascript://" class="filter">I am link one</a>
    </div>
    
    <div id="two">
        <a href="javascript://" class="filter">I am link two</a>
    </div>
    

    ……不幸的是,变量范围与我不一致; this.id 无法从内部访问 $(document).ready() 所以事件监听器不会开火。如何访问它?

    3 回复  |  直到 14 年前
        1
  •  1
  •   Dark Falcon    14 年前

    这是因为“this”是一个关键字,它引用调用当前函数的对象。对于jquery事件处理程序,此对象是注册事件处理程序的dom元素(在本例中为document)。请使用其他变量名存储对象:

    <script type="text/javascript">
        function myClass(id) {
                var me = this;
                this.id = id;
    
                $(document).ready(function(){
                        $(me.id + ' .filter').click(function(){ alert("You clicked a filter"); });
                });
        }
        one             = new myClass('#one');
        two             = new myClass('#two');
    </script>
    
        2
  •  0
  •   Luca Matteis    14 年前

    你需要做一个 local 复印件 this 要在内部功能中使用它:

    function myClass(id) { 
        this.id = id;
        var that = this;
        $(document).ready(function(){
    
            $(that.id + ' .filter').click(function(){ alert("You clicked a filter"); });
    
        });
    }
    
        3
  •  0
  •   Doug Neiner    14 年前

    在这种情况下,您根本不需要在另一个变量中声明它,只需换出 id 对于 this.id 在你的 document.ready 功能:

    function myClass(id) {
        $(document).ready(function(){
            $(id + ' .filter').click(function(){ alert("You clicked a filter"); });
        });
    }
    

    但是,如果对其进行了一些处理,则可以始终使用别名 this 在另一个变量中:

    function myClass(id) {
        var base = this;
        base.id = id;
        // Other items set on base.value
    
        $(document).ready(function(){
    
            $(base.id + ' .filter').click(function(){ alert("You clicked a filter"); });
    
        });
    
    }