【问题标题】:Jquery cloning and radio buttons : strange behaviorJquery 克隆和单选按钮:奇怪的行为
【发布时间】:2012-04-18 10:36:05
【问题描述】:

在 Jsfiddle 上:http://jsfiddle.net/jhzux/

我在这个简单的脚本上浪费了很多时间。我想做的是启用在 jQuery 中克隆表单,然后让它们正常工作。

首先,当我在 JsFiddle 上运行此代码时,它不起作用,但在我的浏览器中却可以……奇怪……-.-

其次,$(this).next(".persianaops").slideToggle(300); 部分甚至不起作用,没有任何反应,只有 .persianaver 部分出现

当 persianaver 部分出现时,单选按钮并不总是有效,在第一个单元格中它可以正常工作,但后来在其他克隆中,单选按钮的行为就像每个单选按钮属于同一组一样,因此只能应用两次:在第一部分而不是在其中一个克隆中..(我希望你能在 Js fiddle 中看到这一点,因为我的解释有点令人困惑..)

那么有没有更好的方法来克隆带有工作单选按钮的 JQ 表并修复 .persianaops 部分?

HTML:

<ul id="listing" style="list-style:none;">
    <li>
        <table class="pedido">
            <tr>
                <td><select name="product[]">
                    <option value="0">
                        Perfil:
                    </option>
                    <option value=
                    "68mm 5 Cámaras AD rendszer egyenes szárny, ütköző tömítéssel">
                    68mm 5 Cámaras 7001AD, con dos juntas
                    </option>
                    <option value=
                    "68mm 7 K AD rendszer íves szárny, ütköző tömítéssel">
                        68mm 7 Cámaras 7001AD con dos juntas
                    </option>
                    <option value=
                    "80 mm 6 K Tok + 7 K íves szárny AD rendszer, ütköző tömítéssel">
                    80 mm Marco 6 Cámaras + Hoja de 7 Cámaras 7001AD con
                    dos juntas
                    </option>
                    <option value=
                    "68mm 7 K MD rendszer ütköző és középtömítéses, íves szárny">
                    68mm 7 Cámaras 7001MD con tres juntas
                    </option>
                    <option value=
                    "80 mm 8 K MD rendszer ütköző és középtömítéses, íves szárny">
                    80 mm 8 Cámaras 7001MD con tres juntas
                    </option>
                </select></td>
            </tr>
            <tr>
                <td><input class="comment" name="h[]" value="Horizontal"> x
                <input class="comment" name="v[]" value="Vertical"> uds:
                <input name="uds[]" style="width:60px;"></td>
            </tr>
            <tr>
                <td>
                    <select>
                        <option>
                            Color
                        </option>
                    </select> Persiana <input class="persiana" name=
                    "persiana[]" type="checkbox">
                    <div class="persianaver" style=
                    "float:right; display:none">
                        Con motor<input name="f[]" type="radio" value=
                        "auto"> Manual<input name="f[]" type="radio" value=
                        "manual">
                    </div>
                </td>
            </tr>
            <tr>
                <td></td>
            </tr>
            <tr>
                <td style="width:435px;">
                    <div class="persianaops" style=
                    "float:right; display:none">
                        IMPORTANTE: En caso de haber seleccionado la opción
                        persiana usted tiene que especificar el tamaño de
                        la tapa del cajón (Lugar donde se sitúa la caja de
                        persiana) Puede especificarlo en el campo
                        comentario <a href="images/demo.jpg" id="pregunta"
                        name="pregunta"><img alt="pregunta" height="15"
                        src="images/ask.jpg" width="15"></a>
                    </div>
                </td>
            </tr>
            <tr>
                <td>
                <textarea class="comment" cols="59" name="comment[]" rows=
                "5">Comentario</textarea></td>
            </tr>
        </table>
    </li>
</ul><button id="clonar" name="colnar">Cloneme</button><br>
<br>
<h3>Datos personales:</h3><br>
<table>
    <tr>
        <td>Nombre y apellido:</td>
        <td><input name="name" type="text"></td>
    </tr>
    <tr>
        <td>Email:</td>
        <td><input name="mail" type="text"></td>
    </tr>
    <tr>
        <td>Teléfono:</td>
        <td><input name="telefono" type="text"></td>
    </tr>
</table>

JQ

$(document).ready(function() {
    var $orig = $(".pedido").clone();
    $("#clonar").live('click', function(e) {
        e.preventDefault();
        $("#listing").append($orig.clone());
        $(".persiana").click(function() {
            $(this).next(".persianaver").slideToggle(300);
            $(this).next(".persianaops").slideToggle(300);
        });
        $(".comment").focus(function() {
            if (this.value === this.defaultValue) {
                this.value = '';
            }
        }).blur(function() {
            if (this.value === '') {
                this.value = this.defaultValue;
            }
        });
    });
});​

【问题讨论】:

  • 您的小提琴不起作用,因为至少在您发布的链接中,您从未通过从下拉列表中选择它来加载 jQuery。您使用的是什么版本的 jQuery?我看到您使用了已弃用的live。从 jQuery 1.7 开始,您应该使用 ondelegate

标签: jquery html forms radio-button


【解决方案1】:

我会完全重组它。见例子。通过在live 语句中添加click 事件,您是双重绑定事件。

这里我改用on。我监控身体水平,但您应该将其收紧到表单容器或表单以提高性能。只需使用 on 声明一次事件处理程序。

然后clone这个clone就只有一行了。您不必阻止按钮的默认设置,因为默认设置无论如何都不会做任何事情。

单选按钮是克隆的,因此它们具有相同的名称。这意味着一次只能激活一个单选按钮。我添加了一些代码来重命名它们。

http://jsfiddle.net/jhzux/3/

$(document).ready(function() {
    var $orig = $(".pedido").clone();
    var counter = 0;

    $("body").on('click', '.persiana', function() {
        $(this).next(".persianaver").slideToggle(300);
        $(this).next(".persianaops").slideToggle(300);
    });

    $("body").on('focus', '.comment', function() {
        if (this.value === this.defaultValue) {
            this.value = '';
        }
    }).on('blur', '.comment', function() {
        if (this.value === '') {
            this.value = this.defaultValue;
        }
    });

    $("#clonar").click(function(e) {
        //have to change radio button names to be unique
        counter++;
        $orig.find(':radio').each( function() {
            $(this).prop('name', $(this).prop('name') + counter);
        });

        //append clone
        $("#listing").append($orig.clone());
    });
});​

【讨论】:

  • 但是单选按钮问题仍然发生。如果你克隆它 3 次,然后你选择第二个作为自动,然后选择第三个作为手动,只有手动将被选择..
  • 我明白了,修改了我的答案。问题是克隆的单选按钮都具有相同的名称属性。所以它们只能单独选择。您需要重命名它们。我选择在名称后附加一个数字。 jsfiddle.net/jhzux/3
  • 我仍然坚持这个.. 因为现在我无法在 php 中得到结果.. 我仍然无法想象 .persianaops 部分.. 这是因为 .next() 但我没有没有找到替代方案.. 有什么新想法吗??
  • 你有足够的代表来讨论这个吗?在 cmets 上做这件事需要很长时间。 chat.stackoverflow.com/rooms/9783/a-little-help
【解决方案2】:

我为你修好了你的小提琴:http://jsfiddle.net/8v6CP/1/

您缺少一些结尾 }) 并且您的 HTML 缺少 &lt;/tr&gt;。我建议你缩进你的代码以避免这种问题。

关于".persiana" 复选框,您可以在"#clonar" 事件处理程序中附加click 事件。您应该使用live 将其附加到外部:

$(document).ready(function(){
    var $orig = $(".pedido").clone();

    $(".persiana").live("click", function () {
        $(this).next(".persianaver").slideToggle(300);
        $(this).next(".persianaops").slideToggle(300);
    });

    $("#clonar").live('click', function (e) {
        e.preventDefault();
        $("#listing").append($orig.clone());

        $(".comment")
            .focus(function() {
                if (this.value === this.defaultValue) {
                    this.value = '';
                }
            })
            .blur(function() {
                if (this.value === '') {
                    this.value = this.defaultValue;
                }
            });
    });
});

【讨论】:

    【解决方案3】:

    至于它在 JsFiddle 上不起作用;它可能不起作用,因为您将其设置为使用 MooTools 而不是 jQuery。

    至于克隆逻辑;看来它应该可以工作;虽然我觉得奇怪的是你在“#clonar”点击事件之后“克隆”了变量,而不是使用变量来执行克隆事件并重新检索内容。

    我会改成这样:

    $(document).ready(function()
    {
            var $orig = $(".pedido").clone();
    
            $("#clonar").live('click' , function(e){
                e.preventDefault();
                $("#listing").append($orig); 
                // or the non variable instance: 
                // $("#listing").append( $("#pedido").clone(); )
            });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2013-09-24
      • 2017-04-30
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多