Я имею дело с ситуацией на моем веб-сайте, когда я хотел бы, чтобы пользователь мог щелкнуть какой-либо текст (окруженный <span>) и превратить его в поле ввода, а затем вернуться к обычному тексту после редактирования или терять фокус.
Я нашел множество вещей повсюду, но на самом деле ни один из них не работает!
Тот же самый рабочий jsfiddle не работает на моей реальной веб-странице. Итак, вот код моей страницы, я бы хотел, чтобы кто-нибудь объяснил мне, почему он не работает, и помог мне это исправить.
<html>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function() {
$('span').live('click', function() {
var input = $('<input />', {
'type': 'text',
'name': 'aname',
'value': $(this).html()
});
$(this).parent().append(input);
$(this).remove();
input.focus();
});
$('input').live('blur', function() {
$(this).parent().append($('<span />').html($(this).val()));
$(this).remove();
});
});
</script>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.box {
border: 1px;
border-style: solid;
padding: 1px;
}
.rotated {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
table {
empty-cells: show;
padding: 0px;
border-spacing: 0px;
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.padd {
padding: 0px;
}
.padding {
padding: 0px;
}
</style>
<body>
<div style = "margin: 0 auto; width: 40%;">
Currently Viewing.
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Date:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Client: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Style #:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Season / Year: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Size Range:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;"> Preparation/Thread: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Sample Size:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Description: </div>
<div style = "width: 25%;"> asdsd</div>
</div>
</div>
<br> Before....
<span>
test
</span>
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
<br> After...
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
</td>
<td class = "box padding">
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
</div>
</div>
</body>
</html>Я пытаюсь превратить эту часть в текстовое поле
<br>
Before....
<span>
test
</span>
<br>



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


.live() устарел в jQuery 1.7 и полностью удален в 1.9. Вы используете 3.3.1, поэтому вам следует использовать .on().
Ну .... хорошо, в этом есть смысл. Но вся моя функция сейчас не работает. вы можете показать мне JSFiddle с использованием .on ()?
@digit ну для одного ваш html недействителен
Измените .live() на .on(), поскольку функция .live() устарела.
Ниже рабочий код:
<html>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
$(function() {
$('span').on('click', function() {
var input = $('<input />', {
'type': 'text',
'name': 'aname',
'value': $(this).html()
});
$("#container").append(input);
$("#testSpan").remove();
input.focus();
});
$('input').on('blur', function() {
$(this).parent().append($('<span />').html($(this).val()));
$(this).remove();
});
});
</script>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.box {
border: 1px;
border-style: solid;
padding: 1px;
}
.rotated {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
table {
empty-cells: show;
padding: 0px;
border-spacing: 0px;
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.padd {
padding: 0px;
}
.padding {
padding: 0px;
}
</style>
<body>
<div style = "margin: 0 auto; width: 40%;">
Currently Viewing.
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Date:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Client: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Style #:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Season / Year: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Size Range:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;"> Preparation/Thread: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Sample Size:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Description: </div>
<div style = "width: 25%;"> asdsd</div>
</div>
</div>
<br> Before....
<div id = "container">
<span id = "testSpan">test</span>
</div>
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
<br> After...
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
</td>
<td class = "box padding">
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
</div>
</div>
</body>
</html>Нажмите на «тест», и вы увидите, что текстовое поле помещается внизу страницы, а не на место текста.
@digit проверьте мой код сейчас. Обновленный ответ. Остальное, вы можете изменить CSS и т. д. В соответствии с вашими требованиями.
Потрясающие! Можете ли вы обновить код, чтобы он вернулся в Испанию после редактирования / расфокусировки?
@digit, который не был частью требования в вашем вопросе.
$ ('input'). on ('blur', function () {$ (this) .parent (). append ($ ('<span />'). html ($ (this) .val ()))) ; $ (this) .remove ();}); ---- это в моем коде, но он не работает ... это была одна из вещей, о которых я пытался упомянуть, но, похоже, забыл. почему это не работает?
@digit см. мой ответ, чтобы узнать больше о том, что вам нужно изменить и почему
Если вы запустите фрагмент стека, вы увидите сообщение об ошибке $(...).live is not a function. Он был удален еще в v1.9.
Вы должны создать свою собственную делегацию событий, используя on()
<html>
<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(function() {
$(document).on('click', 'span', function() {
var input = $('<input />', {
'type': 'text',
'name': 'aname',
'value': $(this).html()
});
$(this).after(input);
$(this).remove();
input.focus();
});
$(document).on('blur', 'input', function() {
$(this).after($('<span />').html($(this).val()));
$(this).remove();
});
});
</script>
<style>
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.box {
border: 1px;
border-style: solid;
padding: 1px;
}
.rotated {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
table {
empty-cells: show;
padding: 0px;
border-spacing: 0px;
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.padd {
padding: 0px;
}
.padding {
padding: 0px;
}
</style>
<body>
<div style = "margin: 0 auto; width: 40%;">
Currently Viewing.
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Date:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Client: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Style #:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Season / Year: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Size Range:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;"> Preparation/Thread: </div>
<div style = "width: 25%;">asdsd</div>
</div>
</div>
<div>
<div style = " width: 100%; display: flex;
border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;">
<div style = "width: 25%;">Sample Size:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Description: </div>
<div style = "width: 25%;"> asdsd</div>
</div>
</div>
<br> Before....
<span>
test
</span>
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
<br> After...
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<tr>
<td colspan = "3">
</td>
<td class = "box">
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box">
M
</td>
<td class = "box">
L
</td>
<td class = "box">
XL
</td>
</tr>
<br>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2">BODY</td>
<td>
</td>
<td class = "box padding">
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tr>
</table>
</div>
</div>
</body>
</html>Если вы нажмете на текст «тест», вы увидите, что текстовое поле помещается внизу страницы, а не на свое место.
Я не знал, что это проблема, в этом случае вы можете использовать after вместо append.
html даже близко не к валидному. Теги BR не могут находиться внутри ТАБЛИЦЫ. у вас есть лишние закрывающие теги повсюду, а вещи, которые должны быть в HEAD, просто лежат в html (теги стиля и скрипта)
вы пытаетесь добавить события к несуществующим элементам. когда вы помещаете свои теги скрипта в верхнюю часть тела, JS будет запущен до того, как тело будет завершено.
Это становится особенно важным, потому что вместо того, чтобы правильно делегировать ваши события, вы вместо этого присоединяете новый прослушиватель событий к каждому отдельному тегу span.
https://learn.jquery.com/events/event-delegation/
MVCE очень важен для StackOverflow. Не включайте ВСЮ страницу html, если ваш вопрос касается только одного тега span. Я очистил ваш html-файл для вас, чтобы у вас было рабочее решение "копировать и вставлять". однако ваш вопрос ДОЛЖЕН содержать только html, который имеет отношение к вашей проблеме.
https://stackoverflow.com/help/mcve
время выполнения:
а. поместите JS в нижнюю часть тела, где он должен быть
б. заверните свой JS в $(function(){})
делегирование мероприятия
Все события здесь должны быть делегированы общему родителю:
$(document).on('click', 'span', function(){})
live устарел, и вы не должны его использовать.
вы должны ВСЕГДА читать документацию по любой используемой библиотеке, ПРЕЖДЕ чем начать ее использовать.
$(function () {
$(document).on('click', 'span', function () {
console.info(this)
var input = $('<input />', {'type': 'text', 'value': $(this).text().trim()});
$(this).replaceWith(input);
input.focus();
});
$(document).on('blur', 'input', function () {
var val = $(this).val(),
span = $('<span />');
span.html(val)
$(this).replaceWith(span);
});
});body {
font-family:Arial, Helvetica, sans-serif;
font-size: 10px;
}
.cell {
width: 100%; display: flex; border-bottom: 1px; border-bottom-color: black; border-bottom-style:solid;
}
.box {
border: 1px;
border-style: solid;
padding: 1px;
}
.rotated {
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
transform: rotate(90deg);
}
table {
empty-cells: show;
padding: 0px;
border-spacing: 0px;
font-family: Arial, Helvetica, sans-serif;
font-size: 10px;
}
.padd {
padding: 0px;
}
.padding {
padding: 0px;
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style = "margin: 0 auto; width: 40%;">
Currently Viewing.
<div class = "cell">
<div style = "width: 25%;">Date:</div>
<div style = "width: 25%;" >asdasdasd</div>
<div style = "width: 25%;">Client: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div class = "cell">
<div style = "width: 25%;">Style #:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;">Season / Year: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div class = "cell">
<div style = "width: 25%;">Size Range:</div>
<div style = "width: 25%;">asdasdasd</div>
<div style = "width: 25%;"> Preparation/Thread: </div>
<div style = "width: 25%;">asdsd</div>
</div>
<div class = "cell">
<div style = "width: 25%;">Sample Size:</div>
<div style = "width: 25%;" >asdasdasd</div>
<div style = "width: 25%;">Description: </div>
<div style = "width: 25%;"> asdsd</div>
</div>
<br>
Before....
<span>
test
</span>
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<thead>
<tr>
<td colspan = "3">
</td>
<td class = "box" >
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box" >
M
</td>
<td class = "box" >
L
</td>
<td class = "box">
XL
</td>
</tr>
</thead>
<tbody>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2" >BODY</td>
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tbody>
</table>
<br>
After...
<br>
<table class = "padding box" style = " width: 100%;border: 1px; border-style: solid; padding: 0px; table-layout: fixed; border-collapse: collapse;">
<thead>
<tr >
<td colspan = "3">
</td>
<td class = "box" >
Tol
</td>
<td class = "box">
XS
</td>
<td class = "box">
S
</td>
<td class = "box" >
M
</td>
<td class = "box" >
L
</td>
<td class = "box">
XL
</td>
</tr>
</thead>
<tbody>
<tr style = "height: 10px;" class = "padding box">
<td class = "box padding rotated" style = "width: 15%; vertical-align: middle; word-wrap:break-word; height: 200px;" rowspan = "2" >BODY</td>
<td>
</td>
<td class = "box padding">
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
<tr style = "height: 10px;" class = "padding box">
<td>
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td class = "box padding">
test
</td>
<td>
test
</td>
</tr>
</tbody>
</table>
</div>
Почему бы не использовать атрибут
content-editable?