【问题标题】:Jquery once clicked loop two timesjquery一次点击循环两次
【发布时间】:2016-04-24 05:33:15
【问题描述】:

在我的 meteorjs 应用程序中,我遇到了问题。我制作了手风琴,点击后可以快速打开和关闭。我做了控制台日志,看到一键激活功能两次。这是我的代码:

<div class="rounded">
    <ul>
        {{#each tasksToDo}}
            {{>task}}
        {{/each}}
    </ul>
</div>


<template name="task">
<li class="list_item">
    <divs class="editable-text-trigger">
      <span>{{> editableText collection="tasks" field="title" wysiwyg=true}}</span>
    </divs>
    <div class="editBt">
        <button class="completed">Completed</button><button class="edit">Edit</button><button class="delete">Delete</button>
    </div>
</li>

Template.task.onRendered(function(){
    $('.list_item').click(function(){
        $('.editBt-active').children('.editBt').hide(400);

        if(!$(this).hasClass('editBt-active')){
            if($('.list_item').hasClass('editBt-active')){
                $('.list_item').removeClass('editBt-active');
            }

            $(this).addClass('editBt-active').children('.editBt').show(400);
        }else{
            $(this).removeClass('editBt-active');
        }
    });
});

编辑:试过这个不起作用

'click .list_item':function(click,task){
        $('.list_item').click(function(){
            $('.editBt-active').children('.editBt').hide(400);

            if(!$(this).hasClass('editBt-active')){
                if($('.list_item').hasClass('editBt-active')){
                    $('.list_item').removeClass('editBt-active');
                }

                $(this).addClass('editBt-active').children('.editBt').show(400);
            }else{
                $(this).removeClass('editBt-active');
            }
        });
    },  still the same

第二次编辑:

Template.task.events({

    'click .delete': function(){
        Meteor.call("deleteTask",this._id);
    },

    'click .list_item':function(click,task) {
        $(task.find('.editBt')).hide('.editBt');
    },

    'click .editable-text-trigger': function(click, task){
            $(task.find('.editable-text-trigger')).addClass('test');
        },

    'click .edit': function(click,task){
            $(task.find('.test')).trigger('click');
         },

    'blur .editable-text-trigger': function(blur, task){
        $(task.find('.editBt')).hide('.editBt');
    }
});

【问题讨论】:

    标签: javascript jquery meteor meteor-blaze


    【解决方案1】:

    在呈现新的task 模板实例时,您向所有现有的.list_item 元素(包括来自task 模板的其他实例的元素)再添加一个事件处理程序。

    在 Meteor 中,定义事件处理程序的“官方”方式是这样的:(http://docs.meteor.com/#/full/template_events)

    Template.task.events({
      'click .list_item': function(event, template){
            // here the handler logic
        }
    });
    

    它只会为一个.list_item 元素注册一个事件处理程序。

    【讨论】:

    • 'click .list_item':function(click,task){ $('.list_item').click(function(){ $('.editBt-active').children('.editBt ').hide(400); if(!$(this).hasClass('editBt-active')){ if($('.list_item').hasClass('editBt-active')){ $('. list_item').removeClass('editBt-active'); } $(this).addClass('editBt-active').children('.editBt').show(400); }else{ $(this).removeClass ('editBt-active'); } }); },还是一样
    • 您不再将$('.list_item').click() 放入函数中,因为 Paweł 显示的代码已经为 .list_item 元素注册了点击处理程序。在函数内部,您只需放置显示/隐藏元素的逻辑。还要小心使用$('.list_item')$('.editBt-active') 进行搜索,因为如果执行全局(整个文档)搜索而不是本地搜索(相对于呈现的模板)。
    • 就像 Rafael 说的那样 - 删除 $('.list_item').click() 并在处理程序逻辑中使用 $('.list_item')(或 $('.editBt-active'))而不是 $(template.find('.list_item'))(和 $(template.find('.editBt-active')) - 这样你'只会修改模板中的元素。
    • 我不知道template.find()这个把戏,太聪明了!
    • @MichelFloyd template.find(selector) 是使用Template.instance().$('selector') 的另一种方式;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多