JQuery .replaceWith()突然把新元素放在错误的地方?

时间:2013-02-19 18:49:20

标签: javascript jquery file input replacewith

这个让我很困惑。我正在使用replaceWith()来“清除”文件输入字段。但是,当它取代它时,它会把它放回错误的地方,我不知道为什么。我在标题中使用了“突然”这个词,因为更神秘的是,当我在周末停止工作时,替换工作完全符合预期。现在我重新开始工作,突然之间没有。

以下是调用replaceWith()之前的源HTML:

<label>Audio</label>
<i style="color:#888888;">MP3 or OGG format recommended</i>
<br>
<button id="clear_audio_input" style="display:none;">Clear</button>
<input type="file" value="" name="source_audio" style="width:300px;">
<br>
<div style="margin-top:15px;">
    <b>Current: </b>
    <i id="current_audio_source">1360954394_121RuleOfRosePianoEtudeI.mp3</i>
    <br>
    <input id="source_audio_value" class="required_media" type="hidden" value="1360954394_121RuleOfRosePianoEtudeI.mp3" name="source_audio">
    <span id="current_audio_info_a"><input type="checkbox" style="position:relative;top:3px;margin-left:0px;" value="yes" name="source_audio_delete">

删除当前音频?         当前的音频将被替换     

注意FILE输入字段的位置,名为“source_audio”。它紧跟在“清除”按钮之后。

现在,在我致电replaceWith()之后,HTML看起来像这样:

<label>Audio</label>
<i style="color:#888888;">MP3 or OGG format recommended</i>
<br>
<button id="clear_audio_input" style="display: none;">Clear</button>
<br>
<div style="margin-top:15px;">
    <b>Current: </b>
    <i id="current_audio_source">1360954394_121RuleOfRosePianoEtudeI.mp3</i>
    <br>
    <input type="file" value="" name="source_audio" style="width:300px;">
    <input id="source_audio_value" class="required_media" type="hidden" value="1360954394_121RuleOfRosePianoEtudeI.mp3" name="source_audio">
    <span id="current_audio_info_a" style="display: inline;"><input type="checkbox" style="position:relative;top:3px;margin-left:0px;" value="yes" name="source_audio_delete">

删除当前音频?         当前的音频将被替换     

请注意,它现在是几行并且在另一个DIV内。

以下是控制“清除”按钮操作的脚本:

$("#clear_audio_input").live("click", function() {
    $("input[name='source_audio']").replaceWith($("input[name='source_audio']").val('').clone(true));
    $("#source_audio_value").val($("#current_audio_source").text());
    $(this).hide();
    $("#current_audio_info_a").show();
    $("#current_audio_info_b").hide();
    checkRequiredMedia();
    return false;
});

这是基本的预期工作流程。加载时,隐藏清除按钮,因为没有任何内容可以清除。用户选择文件后,将出现清除按钮。单击该按钮将清除文件输入(通过替换它),然后按钮将再次隐藏,基本上将表单返回到加载时的状态。

出现这种奇怪现象的原因(特别是因为它几天前没有发生过,而且从那以后我没有改变任何东西)?

1 个答案:

答案 0 :(得分:4)

问题是因为您有两个名为source_audio的输入。要解决这个问题,您需要为两个输入字段指定一个id,或者更改名称。

例如:

$('#my_file_input').replaceWith('<input id="my_file_input" type="file" name="source_audio" />');
$('#my_hidden_file_input').val('');