【发布时间】:2017-07-23 00:16:56
【问题描述】:
我正在尝试制定一个时间表,我可以在其中单击任何“时间”行并向下拖动以跨越该行直到我“mouseup”的行。例如,如果我在上午 7:30 向下单击并向下拖动到 9:00,则表格数据元素将行跨越适当的行数,以便表格数据在该列中从 7:30 到 9:00 变成一个块(即星期一)。这是“添加约会”按钮的功能。
我的计划是在我单击时存储 tr 的索引值,然后从我悬停到的 tr 的索引中减去该值(当鼠标按下时)。例如,如果我在第 1 行向下单击,然后拖动到第 3 行然后鼠标向上,那么第一次单击的 td 应该将其 rowspan 属性设置为 2。
目前,我的函数将跨越多行,这取决于我悬停多远。所以它显然没有从点击中减去初始索引。我不确定为什么。有什么建议吗?
https://jsfiddle.net/Adam_M/fypw7jka/
这是我的时间表和按钮的 HTML:
<div class="row" id="control-panel">
<button onclick="addAppt()" id="add-appt" title="Add Appointment">+</button>
<p>= Add Appointment</p>
<button onclick="delAppt()" id="del-appt" title="Delete Appointment">-</button>
<p>= Delete Appointment</p>
</div>
<table>
<thead>
<tr class="days-of-the-week">
<th scope="col" class="time-col"></th>
<th scope="col">Sunday</th>
<th scope="col">Monday</th>
<th scope="col">Tuesday</th>
<th scope="col">Wednesday</th>
<th scope="col">Thursday</th>
<th scope="col">Friday</th>
<th scope="col">Saturday</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">7:30 AM</th>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
</tr>
<tr>
<th scope="row">8:00 AM</th>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
</tr>
<tr>
<th scope="row">8:30 AM</th>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
</tr>
<tr>
<th scope="row">9:00 AM</th>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
<td rowspan=""><textarea cols="20" rows="5" class="appt-text"></textarea></td>
</tr>
</tbody>
</table>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.1.0.min.js"></script>
<script type="text/javascript" src="scheduler.js"></script>
相关功能的Javascript:
function addAppt() {
$('td').css('cursor', 'cell');
$('textarea').css('cursor', 'cell');
$('td').mousedown(function(){
var initIndex = $(this).parent().index();
$('td').hover(function(){
var spanCount = $(this).parent().index();
var span = spanCount - initIndex;
$(this).attr( 'rowspan', span);
$(this).addClass('highlight');
});
});
$('td').mouseup(function(){
$('td').off('mouseenter mouseleave');
});
}
【问题讨论】:
-
你的小提琴不起作用 - 它缺少脚本
scheduler.js。 -
@KScandrett 当我点击它时它会起作用......我只是将脚本从 scheduler.js 复制并粘贴到 jsfiddle 的 javascript 部分。它应该在那里。
-
这是我在上面描述的尝试的更新小提琴。 jsfiddle.net/Adam_M/fypw7jka/5 这些行是根据我单击的行的索引来跨越的。所以变量 initIndex 并没有像我预期的那样被减去。当我拖动时,我还有一个意外的功能,即在表格的右侧添加了列。我不知道会发生这种情况。
-
右侧添加的列是因为在创建
rowspan时需要从跨越的行中删除现有的td -
@KScandrett 我通过右键单击在您的代码中添加了 removeCellSpan() 函数。整个编辑在您编写的函数内(本地到)。到目前为止,我从您的代码中学到了很多东西,并且进展顺利。但我试图弄清楚还有什么遗漏导致表格的其余部分无法识别新附加的元素。我试图让一切恢复到原来的状态。我注意到在删除跨度并添加元素后,$thisCell 之后的行实例无法再次突出显示。对于这些行,矩阵似乎变成了一列。有什么想法吗?
标签: javascript jquery html indexing html-table