使用jQuery在Javascript事件处理程序中保持此数据的最佳方法是什么

时间:2009-03-10 06:56:55

标签: javascript jquery

我的代码旨在用动态代码取代单选按钮,并允许单击标签和新动态单选按钮以切换隐藏状态与CSS单选框。

我需要向questions.checkAnswer()三个参数发送,这些参数在这些启动循环中定义。但是,一旦循环完成迭代,我总是得到最后的值。在过去,我创建了虚拟元素和其他不适合存储“临时”贵重物品的东西,以充当Javascript的信息钩子。

这是我到目前为止所拥有的

init: function() {
        // set up handlers

       moduleIndex = $('input[name=module]').val();

       $('#questions-form ul').each(function() {

            questionIndex = $('fieldset').index($(this).parents('fieldset'));

            $('li', this).each(function() {

                answerIndex = $('li', $(this).parent()).index(this);

                prettyRadio = $('<span class="pretty-radio">' + (answerIndex + 1) + '</span>');

                radio = $('input[type=radio]', this);

                radio.after(prettyRadio);

                $(radio).bind('change', function() {
                    $('.pretty-radio', $(this).parent().parent()).removeClass('selected');

                    $(this).next('.pretty-radio').addClass('selected');

                    questions.checkAnswer(moduleIndex, questionIndex, answerIndex);

                });

                prettyRadio.bind('click', function() {

                    $('.pretty-radio', $(this).parent().parent()).removeClass('selected');

                    $(this).addClass('selected').prev('input').attr({checked: true});


                });

                $('label', this).bind('click', function() { 


                    $(radio).trigger('change');
                    questions.checkAnswer(moduleIndex, questionIndex, answerIndex);

                    $(this).prev('input').attr({checked: true});

                });



            });


       });
  • 使用Javascript添加假装属性是不好的,例如,<li module="1" question="0" answer="6">
  • 我应该将信息存储在rel属性中并将其与连字符连接起来,并在需要时将其展开?
  • 你是怎么解决这个问题的?
  • 我愿意接受任何让我的Javascript代码更好的想法。

谢谢大家的时间。

3 个答案:

答案 0 :(得分:2)

添加自定义属性不是世界末日。事实上,在许多情况下,这是最不好的方法。但是,如果我必须这样做,我会在属性前添加“data-”,以便它符合HTML5 specs for custom attributes的前向兼容性。这样,当您想要符合HTML5标准时,您不必担心升级。

答案 1 :(得分:1)

你需要说'var questionIndex'等,否则你的'变量'是窗口的属性并具有全局范围......

关于自定义属性,我在过去确实做到了这一点,如果可以,我会尽量避免它。如果你使用像textareas和输入标签这样的交互式元素来执行此操作,某些CMS和主题系统偶尔会感到不快,并且可能会将它们剥离出来。

最后$(a,b)与$(b).find(a)相同..有些人更喜欢第二种形式,因为它更清楚你正在做什么。

答案 2 :(得分:1)

如果自定义属性的分配完全是客户端的,则必须使用jQuery数据解决此问题,如下所示:

$(“#yourLiID”)。data({module:1,question:0,answer:6});

有关完整文档,请参阅here