我的网站上有很多帖子<table>
和新的响应式布局。
当在移动设备上打开大表元素(大量内容)时,即使使用 max-width:100%或其他CSS技巧,它们也会比屏幕更大。
解决方案是在 overflow:scroll <div>
中追加表格,但我无法编辑所有帖子内容,所以我想用纯Javascript来做。 jQuery不允许。
目标是:
<table>
#post
元素
<div class="table_div">
中的内容添加到<table>
所在的同一位置table
元素(不在.table_div
内的元素)我已经可以从表元素中获取所有内容并删除表,但所谓的代码部分应该在.table_div中附加表格内容不起作用。
到目前为止我的部分代码:
var post = document.getElementById('post'),
tables = post.getElementsByTagName('table');
for(var i=0; i<tables.length; i++) {
var table = tables[i];
var table_content = table.innerHTML,
table_div = document.createElement('div');
tables.remove();
table_div.appendChild(table);
table_div.className = 'table_div';
document.appendChild(table_div);
}
完整代码:http://jsfiddle.net/hmaesta/6mambr93/
请帮助纯粹的Javascript。谢谢。
答案 0 :(得分:2)
请参阅此updated fiddle:
procedure TAskYTSThread.MakeDDEConv;
begin
with TDDEClientConv.Create(Form1) do
begin
ConnectMode:=ddeManual;
ServiceApplication:='explorer.exe';
SetLink('Folders', 'AppProperties') ;
Form1.Memo1.Lines.Add('Openlink çağrılacak Gönderilecek.');
if OpenLink then
begin
Form1.Memo1.Lines.Add('Link Open Edildi.');
ExecuteMacro('[FindFolder(, C:\)]', False) ;
CloseLink;
end
else
begin
Form1.Memo1.Lines.Add('OLMADIIIIIII');
end;
Free;
end;
end;
procedure TAskYTSThread.Execute;
var
blnRunning : boolean ;
FYtsTopicName, strMacro : string ;
begin
inherited;
FDDE_BUSY.Enter ;
try
blnRunning := IsYTSRunning;
Synchronize(MakeDDEConv); // this is key point
finally
FDDE_BUSY.Leave ;
end;
end;
我使用replaceChild
方法首先用新创建的var post = document.getElementById('post'),
tables = post.getElementsByTagName('table');
for(var i=0; i<tables.length; i++) {
var table = tables[i];
var elem = document.createElement('div');
elem.className = 'table_div';
post.replaceChild(elem, table);
elem.appendChild(table);
}
替换table
元素。然后,我将原始的div
元素附加到table
。
答案 1 :(得分:2)
NodeList有两种模式; 静态或直播(参考When is NodeList live and when is it static?)。 Live 表示DOM中的更改会反映在NodeList中。来自getElementsByTagName
的NodeList是实时的。在您的代码中,每次删除tables
时,#post table
的长度都会递减。
有一些方法可以解决这个问题。
querySelectorAll
返回静态值。var ts = []; Array.prototype.push.apply(ts, tables);
执行此操作。在此之后,请使用ts
代替tables
。insertChild
代替appendChild
来保持订单并将<table>
保留在#post
。这是一个例子。
var tables = document.querySelectorAll('#post table');
for(var i = 0; i < tables.length; i++) {
var table = tables[i];
var table_div = document.createElement('div');
table.parentElement.insertBefore(table_div, table);
table_div.className = 'table_div';
table_div.appendChild(table);
}
https://jsfiddle.net/boy48ngs/2/
注意:在这种情况下,您无需手动删除<table>
。元素不能有多个父元素,appendChild
会从当前父元素中删除元素。