【问题标题】:Exclude Element from .html()从 .html() 中排除元素
【发布时间】:2012-10-24 14:32:32
【问题描述】:

我必须从 jquery 的 .html() 中删除特定元素(带有#add_phone 的按钮)。

所以事情就是这样。一开始有field(phone number) + select(phone type) + button(#add_phone),三者都作为容器封装在div中。当我单击按钮时,它将通过 .html() 重新创建。 JS如下:

$('#add_phone').click(function() {
    $('div.multiple_number:last').after('<div id="phone_div_id' + phone_div_id + '" class="multiple_number">'+ $('div.multiple_number').html() +'</div>');
    ...
    //append a remove [-] button, etc...     
});

这是html:

<div class="multiple_number" id="phone_div_id0">
    <label>Phone Number(s):</label>
    <input name="phone" id="phone[]" placeholder="Phone Number"/>
    <select name="phone_type[]" id="phone_type">
        <option value="1">Mobile</option>
        <option value="2">Home</option>
        <option Value="3">Office</option>
        <option Value="3">Fax</option>          
    </select>
    <input type="button" name="add_phone" class="add_phone_class" id="add_phone" value="ADD MORE" />
</div>

实际上,我正在为一个表单创建多个电话号码。但是,这就是问题所在。里面是一个输入类型=“按钮”(#add_phone 按钮)。我想从 .html() 中排除它。

我试过了:

$('div.multiple_number:not(#add_phone)').html()
$('div.multiple_number:not(input#add_phone)').html()
$('div.multiple_number:not(#add_phone)').not(#add_phone).html()
$('div.multiple_number:not(#add_phone)').not(input#add_phone).html()

与类名对应,而不是使用id名。出于美学原因,我也不想将#add_phone 按钮放在 div 之外。

【问题讨论】:

    标签: javascript jquery html api


    【解决方案1】:

    试试这个:

    var innerHTML = $("div.multiple_number").html()
                    .replace($("div.multiple_number input#add_phone").html(), "");
    

    祝你好运

    【讨论】:

    • 谢谢。这似乎是一个很好的解决方法......我认为它会起作用,但它没有。结果还是一样,#add_phone 按钮仍然包含在后续的 div.multiple_number 中
    • 这行不通,因为.html() 只序列化匹配元素的children。由于&lt;input /&gt; 元素上没有子元素,因此对.html() 的调用将返回一个空字符串。
    【解决方案2】:

    我有点不清楚您要查找的内容,但我假设当单击 #add_phone 按钮时,您希望将表单复制并添加到其下方,#add_phone 除外按钮本身。

    根据这个假设,以下应该可行

    $('#add_phone').click(function() {
        var numberForms = $('div.multiple_number');
        var newNumberForm = numberForms.eq(0).clone(true);
        newNumberForm.find('#add_phone').remove();
        newNumberForm.attr('id', 'phone_div_id' + numberForms.length);
        numberForms.last().after(newNumberForm);
    });
    

    这是一个 live jsfiddle demo 来证明它的工作原理。

    由于某些原因,您最初的尝试没有奏效。主要的是:not() 选择器和.not() 方法只对被选择的元素进行操作。它不会根据子元素进行过滤。只有当您选择的元素 &lt;div class="multiple_number" /&gt; 也具有 ID add_phone 时,这些方法才有效。

    另外,不推荐使用.html()作为克隆方式。使用字符串操作作为直接 DOM 操作的替代方法可能会在以后导致问题。使用.html() 将迫使您必须将事件处理程序重新绑定到新创建的 DOM 元素。我在上面提供的策略应该更加面向未来,因为它还将为任何被复制的元素克隆事件处理程序。在某些情况下,某些浏览器在调用 .html() 时不会完全复制原始元素,这是避免它的另一个原因,除非您有特定原因将 DOM 元素序列化为字符串。

    【讨论】:

    • 你是个天才。您必须回答为什么 not 在我的情况下不起作用,而且您有更好的解决方案。更不用说,你的更具可读性。哦……这就是为什么我必须为我的 .html() 创建的那些使用 .on() 或 .live() 的原因,因为 .click() 找不到新创建的 DOM?如果我在每个新创建的电话输入上放置一个按钮,我现在可以使用你的 .click() 来查找 #remove_phone 按钮?谢谢。
    • @Fred 你是对的,这就是你必须使用.on().live() 的原因(尽管.on() 是首选方法)。只要您使用.clone(true),您就应该可以使用.click()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    相关资源
    最近更新 更多