innerHTML和jqueries .html()...... GOTCHA!任何适当的工作?

时间:2014-03-20 14:02:50

标签: javascript jquery html innerhtml

innerHTML和jqueries .html()... GOTCHA!

我刚刚为我的javascript创建了一个小模板html标签,以获取副本并推入表格......看起来像这样:

<div id="TimesheetEntryRow">
            <tr id="row{RowID}">
               <td></td>
            </tr>
</div >

所以在jquery我想,很酷让我们抓住它:

timesheetTemplateHtml = $( "#TimesheetEntryRow" ).html();

然后我将它附加到我真棒的桌子上:

$( "#TimesheetTable" ).append( timesheetTemplateHtml );

它不起作用?

它剥离了<tr><td> s并留下了真正的标签,就像我里面的<input />一样。

所以我想,哦,你顽皮的小动物,我会使用innerHTML,这样我就不必担心jquery聪明了:

timesheetTemplateHtml = document.getElementById( "TimesheetEntryRow" ).innerHTML;
document.getElementById( "TimesheetTable" ).innerHTML += timesheetTemplateHtml;

仍然无法使用?它仍然剥离了我模板的所有标签......

我把它从地狱中剔除了,偶然发现了这两篇文章:

FIREFOX:https://developer.mozilla.org/en-US/docs/Web/API/element.innerHTML?redirectlocale=en-US&redirectslug=DOM%2Felement.innerHTML

IE:http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx

太棒了,所以我一生都用过的功能一直都是LIE我告诉你。事实上,它唯一可用的浏览器是Chrome(我认为它们忽略了标准或什么?)。

我设法弄清楚,如果你将整个标签放在它周围,似乎可以复制它好......这非常烦人但是在这个场合保存了我的培根。

<div id="TimesheetEntryRow">
            <table>
                <tr id="row{RowID}">
                   <td></td>
                </tr>
            </table>
</div>

现在上面的内容很有道理,但是我真的不知道innerHTML也会进行html解析来检查你是不是很傻......你们有没有想到另一种不必放置整个标签的方法在我的模板中设置?

疯狂疯狂疯狂!

相关帖子:


我的完整示例模板是:

<div id="TimesheetEntryRow" style="display:none;">
    <table>
        <tbody>
            <tr id="row{RowID}">
                <td>blah</td>
                <td class="timeSpent"><input name="timeMon[]" type="text" class="form-control inputTimeSpent timeSpent timeMon" placeholder="0" /></td>
                <td class="timeSpent"><input name="timeTue[]" type="text" class="form-control inputTimeSpent timeSpent timeTue" placeholder="0" /></td>
                <td class="timeSpent"><input name="timeWed[]" type="text" class="form-control inputTimeSpent timeSpent timeWed" placeholder="0" /></td>
                <td class="timeSpent"><input name="timeThur[]" type="text" class="form-control inputTimeSpent timeSpent timeThur" placeholder="0" /></td>
                <td class="timeSpent"><input name="timeFri[]" type="text" class="form-control inputTimeSpent timeSpent timeFri" placeholder="0" /></td>
                <td class="timeSpent timeSpentWeekend"><input name="timeSat[]" type="text" class="form-control inputTimeSpent timeSpent timeSat" placeholder="0" /></td>
                <td class="timeSpent timeSpentWeekend"><input name="timeSun[]" type="text" class="form-control inputTimeSpent timeSpent timeSun" placeholder="0" /></td>
                <td class="timeSpent"><input disabled type="text" class="form-control timeSpent allocated" /></td>
                <td class="timeSpent"><input disabled type="text" class="form-control timeSpent total" value="0" /></td>
                <td><textarea name="note[]" class="form-control inputNotes" placeholder="Enter notes"></textarea></td>
            </tr>
        </tbody>
    </table>
</div>

注意每个人:如果您使用克隆,请不要忘记在css样式上显示:block。

无论如何,即使使用克隆,上面的例子也不会达到预期的效果(如果您认为这样做,实际上会检查元素,它会剥夺整个负载)

4 个答案:

答案 0 :(得分:1)

您遇到的问题是由于模板不是有效的HTML。 <tr>元素必须位于<table><tbody><thead><tfoot>内,并且可能是我忘记的其他内容。当浏览器在无效位置看到<tr>个元素时,它只会删除它们并继续前进,将内容保留在原来的位置。 (<td>中的<tr>不同于<table>。因此,您可以做的是将模板元素设为<table id="TimesheetEntryRow" style="display:none"> <tr> <td>blah</td> </tr> </table>

<script type="text/template">

请参阅此处的工作示例:http://jsfiddle.net/6GSJ4/2/

我知道一些框架,例如AngularJS(我使用的一个)允许您将模板放在.innerHTML元素中,因为HTML解析器不会将这些模板作为DOM元素处理,因此您的所有元素都将保留完整。如果你需要它可能是一个选项(虽然{{1}}显然不会工作)。

答案 1 :(得分:0)

您当然可以立即将html添加回模板标签。不是最佳的,但会完成工作

timesheetTemplateHtml = $("#TimesheetEntryRow").html();

$("#TimesheetEntryRow").html(timesheetTemplateHtml);

答案 2 :(得分:0)

我会这样做。只需将表格用于模板而不显示它:

<table id="TimesheetEntryRow" style="display: none;">
  <tr>
    <td>aaa</td>
  </tr>
</table>

而不仅仅是在文档就绪时选择模板和目标。需要时,克隆模板并将其附加到目标:

$(function(){

  var $table = $( "#TimesheetTable" );
  var $row = $( "#TimesheetEntryRow tr" );

  $('#button').on('click', function(){
    $table.append($row.clone());
  });

});

请参阅此处的工作示例:http://codepen.io/timbuethe/pen/czJla/

答案 3 :(得分:0)

你可以&#34;误用&#34;脚本标签如下:

<script type="text/template" id="TimesheetEntryRow">
    <tr id="row{RowID}">
        <td></td>
    </tr>
</script>

某些JavaScript模板脚本使用此功能,例如: Underscore.js