#javascript #html #jquery
#javascript #HTML #jquery
Вопрос:
Итак, я создал эту таблицу, которая открывает всплывающее окно, отображающее информацию, когда вы нажимаете td. Каждый td отображает различную информацию во всплывающем окне.
Что работает: когда я нажимаю на td, он скрывает любое открытое всплывающее окно и открывает новое всплывающее окно, соответствующее этому td.
Что не работает: я хочу сделать так, чтобы при а) нажатии на тд, всплывающее окно которого отображается, оно скрывало всплывающее окно (ну, делает его display == none), б) щелчок за пределами таблицы скрывал любое открытое всплывающее окно.
Вот моя попытка кода.
window.onload = function() {
$('#myTable').on('click', 'td', function() {
$('.spanClass').html('');
$('.spanClass').css("display", "none")
var $tr = $(this).parent('tr');
var firstCell = $tr.find("td:first").text();
var didIt = (this.innerText - firstCell);
//this is me attempting to close the popup if you click on the same td again, but open it if it's not currently open.
if ($(this).find(".spanClass").css("display") == 'block') {
$(this).find(".spanClass").css("display", "none");
} else {
$(this).find('.spanClass').html(didIt);
$(this).find(".spanClass").css("background-color", "#555");
$(this).find(".spanClass").css("display", "block");
}
//this is me attempting to close the popup when I click outside the table.
if (e.target.id != 'myTable') {
$(".spanClass").css("display", "none");
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="myTable">
<tr>
<th>Head Row</th>
<th>One</th>
<th>Two</th>
<th>Three</th>
<th>Four</th>
<th>Five</th>
</tr>
<tr>
<th>Title 1</th>
<td>10</td>
<td>9<span class="spanClass"></span></td>
<td>5<span class="spanClass"></span></td>
<td>3<span class="spanClass"></span></td>
<td>2<span class="spanClass"></span></td>
<td>1<span class="spanClass"></span></td>
</tr>
<tr>
<th>Title 2</th>
<td>25<span class="spanClass"></span></td>
<td>19<span class="spanClass"></span></td>
<td>16<span class="spanClass"></span></td>
<td>15<span class="spanClass"></span></td>
<td>10<span class="spanClass"></span></td>
<td>2<span class="spanClass"></span></td>
</tr>
<tr>
<th>Title 3</th>
<td>100</td>
<td>50<span class="spanClass"></span></td>
<td>25<span class="spanClass"></span></td>
<td>15<span class="spanClass"></span></td>
<td>10<span class="spanClass"></span></td>
<td>5<span class="spanClass"></span></td>
</tr>
</table>
Вот мой codepen:
Комментарии:
1. Две проблемы; 1. Переданная функция
on
должна приниматьe
в качестве аргумента. 2.e.target.id
почти всегда будет!= "myTable"
, потому что практически невозможно щелкнуть по элементу таблицы, не нажав сначала наtd
элемент илиth
илиtr
илиtbody
. Ваш обработчик события щелчка предназначен для#myTable
того, чтобы щелчок вне таблицы не вызывал этот обработчик. Добавьте другой обработчикbody
или что-тоe.target.closest('#myTable') == null
в этом роде, проверьте и скройте, если это правда.2. Хм, это все еще не работает.
3. Это то, что я пробовал:
window.onload = function() { if($(document).on("click")) { if (event.target.closest("myTable") == null) { $('.spanClass').css("display", "none") } }; }
4. Хорошо, я разобрался с одной проблемой. В основном обходной путь. Но мне все равно нужно, чтобы всплывающее окно закрывалось при повторном нажатии на тот же td. Любые мысли по этому поводу @HereticMonkey
Ответ №1:
window.onload = function() {
$('#myTable').on('click', 'td', function(e) {
e.stopPropagation();
$('.spanClass').html('');
$('.spanClass').css("display", "none")
var $tr = $(this).parent('tr');
var firstCell = $tr.find("td:first").text();
var didIt = (this.innerText - firstCell);
//this is me attempting to close the popup if you click on the same td again, but open it if it's not currently open.
if ($(this).find(".spanClass").css("display") == 'block') {
$(this).find(".spanClass").css("display", "none");
} else {
$(this).find('.spanClass').html(didIt);
$(this).find(".spanClass").css("background-color", "#555");
$(this).find(".spanClass").css("display", "block");
}
//this is me attempting to close the popup when I click outside the table.
});
$("body").click(function(e){
if (e.target.id != 'myTable') {
$(".spanClass").css("display", "none");
}
});
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="myTable">
<tr>
<th>Head Row</th>
<th>One</th>
<th>Two</th>
<th>Three</th>
<th>Four</th>
<th>Five</th>
</tr>
<tr>
<th>Title 1</th>
<td>10</td>
<td>9<span class="spanClass"></span></td>
<td>5<span class="spanClass"></span></td>
<td>3<span class="spanClass"></span></td>
<td>2<span class="spanClass"></span></td>
<td>1<span class="spanClass"></span></td>
</tr>
<tr>
<th>Title 2</th>
<td>25<span class="spanClass"></span></td>
<td>19<span class="spanClass"></span></td>
<td>16<span class="spanClass"></span></td>
<td>15<span class="spanClass"></span></td>
<td>10<span class="spanClass"></span></td>
<td>2<span class="spanClass"></span></td>
</tr>
<tr>
<th>Title 3</th>
<td>100</td>
<td>50<span class="spanClass"></span></td>
<td>25<span class="spanClass"></span></td>
<td>15<span class="spanClass"></span></td>
<td>10<span class="spanClass"></span></td>
<td>5<span class="spanClass"></span></td>
</tr>
</table>
Комментарии:
1. Спасибо, DCR. Он по-прежнему не работает, когда я дважды нажимаю на один и тот же td. я хочу, чтобы оно открывалось, если я нажимаю на td, но затем исчезает, если я снова нажимаю на тот же td. Есть мысли?
2. посмотрите на использование toggle ()
Ответ №2:
как насчет этого. использование щелчка вдали от таблицы — это первая функция, щелчок по таблице — вторая. Я использую фильтр not, чтобы исключить тот, на который вы нажимаете, и переключить его.
вот ручка. https://codepen.io/pollywog/pen/zYKrdma
window.onload = function() {
$('body').on('click', function(e) {
if(!$(e.target).closest('#myTable').length){
$('.spanClass').html('');
$('.spanClass').hide();
}
});
$('body').on('click', 'td', function() {
const firstCell = $(this).closest('tr').find("td:first").text();
const innerText = $(this).text();
const didIt = (innerText - firstCell);
const thisSpanClass = $(this).find('.spanClass');
$('.spanClass').not(thisSpanClass).html('');
$('.spanClass').not(thisSpanClass).hide();
thisSpanClass.html(didIt);
thisSpanClass.css("background-color", "#555");
thisSpanClass.toggle();
});
}