- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想用 JavaScript 更改单元格内容。当我单击单元格时,会出现一个 input
元素,该元素获取单元格文本的值。在编辑输入元素中的文本后,当我单击 Enter 时,我希望单元格再次正常(没有输入元素)。
这是一个表格:
<table>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
</tr>
<tr>
<td>Content 4</td>
<td>Content 5</td>
<td>Content 6</td>
</tr>
</table>
这是 JavaScript:
$("td").click(function(){
if($(this).find("input").length==0){
var cellContent = $(this).html();
$(this).empty();
$(this).append("<input type='text' size='"+cellContent.length+"' value='"+cellContent+"'>");
$(this).find("input").focus();
}});// this part creates input element in a cell
现在,当新内容应保留在单元格中但没有输入元素时,按 Enter 键后会出现问题。
$("td").click(function(){
var newCellContent = $("input",this).val();
console.log(newCellContent);
$("input").keyup(function(event){
if(event.which == 13){
$(this).empty();
$(this).html(newCellContent);
}
newCellContent = $("input",this).val();
});
});
最佳答案
我个人建议使用 CSS 来显示/隐藏 <input>
元素,并使用 JavaScript 仅处理值的传输和 <input>
的模糊处理按输入,如下所示:
// finding the <table> element containing the <input> elements,
// and adding an event-listener:
document.querySelector('table').addEventListener('keyup', function(e) {
// 'e' is the event itself.
// caching the element that triggered the keyup event:
var current = e.target,
// caching its tagName, in lower-case:
tag = current.tagName.toLowerCase(),
// we're using this check twice, so caching the result,
// checking that the tag is equal to 'input', and that
// the element has a 'type' property, and that the
// current type is equal to 'text':
isRelevantInput = tag === 'input' && current.type && current.type === 'text';
// if the check returns true, and the key pressed (e.which) is
// equal to 13 (the enter key):
if (isRelevantInput && e.which === 13) {
// we blur the element (allowing the CSS
// to show the <label> text again, and hide
// the <input>:
current.blur();
}
// otherwise, if only the check itself is true
// (note that the most difficult-to-satisfy condition
// goes first):
else if (isRelevantInput) {
// we update the textContent of the <input> element's
// next element-sibling (the <span> in this example)
// to the current value of the <input> element:
current.nextElementSibling.textContent = current.value;
}
});
// Using Function.prototype.call() to use Array.prototype.forEach()
// to iterate over the NodeList returned from
// document.querySelectorAll():
Array.prototype.forEach.call(document.querySelectorAll('table label > input'), function (input) {
// the first argument of the anonymous function (here: 'input')
// is the array-element of the array over which we're iterating.
// setting the value of the <input> to the textContent of
// of its next element-sibling (the <span> containing the
// text of the parent <label> associated with the <input>:
input.value = input.nextElementSibling.textContent;
});
上面的 JavaScript 与这个 CSS 结合在一起:
td {
height: 2em;
}
label > input {
/* we're not using 'display: none' in
order that the <input> elements can
receive focus: */
opacity: 0;
height: 0;
}
/* once focused the <input>
has a defined height and
a visible opacity: */
label > input:focus {
opacity: 1;
height: 1.5em;
}
/* forcing the <span> to the
next line of the <td>: */
label > input + span {
display: block;
height: 1.5em;
}
/* hiding the <span> when the
<input> has focus: */
label > input:focus + span {
display: none;
}
使用 HTML:
<table>
<tr>
<td>
<!-- wrapping the <input> in a <label> element
means that clicking the <label> text will
focus the <input>, using CSS to show the
<input> and hide the <span>: -->
<label>
<input type="text" /><span>Content 1</span>
</label>
</td>
<!-- repeated content removed for brevity -->
</tr>
</table>
document.querySelector('table').addEventListener('keyup', function(e) {
var current = e.target,
tag = current.tagName.toLowerCase(),
isRelevantInput = tag === 'input' && current.type && current.type === 'text';
if (isRelevantInput && e.which === 13) {
current.blur();
}
else if (isRelevantInput) {
current.nextElementSibling.textContent = current.value;
}
});
Array.prototype.forEach.call(document.querySelectorAll('table label > input'), function (input) {
input.value = input.nextElementSibling.textContent;
});
td {
height: 2em;
}
label > input {
opacity: 0;
height: 0;
}
label > input:focus {
opacity: 1;
height: 1.5em;
}
label > input + span {
display: block;
height: 1.5em;
}
label > input:focus + span {
display: none;
}
<table>
<tr>
<td>
<label>
<input type="text" /><span>Content 1</span>
</label>
</td>
<td>
<label>
<input type="text" /><span>Content 2</span>
</label>
</td>
<td>
<label>
<input type="text" /><span>Content 3</span>
</label>
</td>
</tr>
<tr>
<td>
<label>
<input type="text" /><span>Content 4</span>
</label>
</td>
<td>
<label>
<input type="text" /><span>Content 5</span>
</label>
</td>
<td>
<label>
<input type="text" /><span>Content 6</span>
</label>
</td>
</tr>
</table>
但是,对于您当前的 HTML,并使用 jQuery,我建议:
// finding the relevant <td> elements,
// using on() to attach an anonymous
// click event-handler:
$('table td').on('click', function() {
// creating an <input> element,
// setting its 'type' and 'value'
// properties:
var input = $('<input />', {
'type': 'text',
'value': this.textContent
// appending the created <input> to the <td> (this/$(this))
// after emptying the <td> using empty(), and focusing the
// created <input>:
}).appendTo($(this).empty()).focus();
// binding an keyup event-handler using on(),
// passing the event ('e') to the function:
}).on('keyup', function(e) {
// if it was the enter key that was pressed:
if (e.which === 13) {
// finding the <input> element with find(),
// and caching the result:
var input = $(this).find('input');
// inserting the text string of the current
// value of the <input> before the <input>,
// and then removing the <input>:
input.before(input.val()).remove();
}
});
$('table td').on('click', function() {
var input = $('<input />', {
'type': 'text',
'value': this.textContent
}).appendTo($(this).empty()).focus();
}).on('keyup', function(e) {
if (e.which === 13) {
var input = $(this).find('input');
input.before(input.val()).remove();
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
<tr>
<td>Content 1</td>
<td>Content 2</td>
<td>Content 3</td>
</tr>
<tr>
<td>Content 4</td>
<td>Content 5</td>
<td>Content 6</td>
</tr>
</table>
引用文献:
Array.prototype.forEach()
.document.querySelector()
.document.querySelectorAll()
.eventTarget.addEventListener()
.Function.prototype.call()
.KeyboardEvent.key
.关于javascript - 在 "enter"上使输入元素在单元格中消失,但保留文本内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30818541/
表架构 DROP TABLE bla; CREATE TABLE bla (id INTEGER, city INTEGER, year_ INTEGER, month_ INTEGER, val I
我需要拆分字符串/或从具有以下结构的字符串中获取更容易的子字符串。 字符串将来自 window.location.pathname 或 window.location.href,看起来像 text/n
每当将对象添加到数组中时,我都会尝试更新 TextView ,并在 TextView 中显示该文本,如下所示: "object 1" "object 2" 问题是,每次将新对象添加到数组时,它都会覆盖
我目前正在寻找使用 Java 读取网站可见文本并将其存储为纯文本字符串的方法。 换句话说,我想转换成这样: Hello stupid World进入“ Hello World ” 或者类似的东西 Un
我正在尝试以文本和 HTML 格式发送电子邮件,但无法正确发送正确的 header 。特别是,我想设置 Content-Type header ,但我找不到如何为 html 和文本部分单独设置它。 这
我尝试了上面的代码,但我无法绑定(bind)文本,我怎样才能将资源内部文本 bloc
我刚刚完成了 Space Shooter 教程,由于没有 GUIText 对象,所以我创建了 UI.Text 对象并进行了相应的编码。它在统一播放器中有效,但在构建 Web 应用程序后无效。我花了一段
我有这个代码: - (IBAction)setButtonPressed:(id)sender { NSUserDefaults *sharedDefaults = [[NSUserDefau
抱歉标题含糊不清,但我想不出我想在标题中做什么。无论如何,对于图像上的文本,我使用了 JLabel 文本并将其添加到图标中。 JLabel icon = new JLabel(new Imag
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我在将 Twitter 嵌入到我从 HTML 5 转换的 wordpress 运行网站时遇到问题。 我遇到的问题是推文不是我的自定义字体... 这是我无法使用任何 css 定位的 HTML 代码,我正
我正在尝试找到解决由于使用以下形式的代码而导致的冗余字符串连接问题的最佳方法: logger.debug("Entering loop, arg is: " + arg) // @1 在大多数情况下,
我写了这个测试 @Test public void removeRequestTextFromRouteError() throws Exception { String input = "F
我目前正在创建一个正则表达式来拆分所有匹配以下格式的字符串:&[文本],并且需要获取文本。字符串可能类似于:something &[text] &[text] everything &[text] 等
有没有办法将标题文本从一个词变形为另一个词,同时保留两个词中使用的字母?我看过的许多 css 文本动画大多是视觉的,很少有旋转整个单词的。 我想要做的是从一个词过渡,例如“BEACH”到“CHANGE
总结matplotlib绘图如何设置坐标轴刻度大小和刻度。 上代码: ?
我在容器 (1) 中创建了容器 (2)。你能帮忙如何向容器(1)添加文本吗?下面是我的代码 return Scaffold( body: Padding( padding: c
我似乎找不到任何人或任何人这样做过。我试图限制我们使用的图像数量,并想创建一个带有渐变作为其“颜色”的文本,并在其周围设置渐变轮廓/描边 到目前为止,我还没有看到任何将两者结合在一起的东西。 我可以自
我正在为视频游戏暗黑破坏神 2 使用 discord.py 构建一个不和谐机器人。其中一项功能要求机器人从暗黑破坏神 2 屏幕截图中提取项目的名称和属性。我目前正在为此使用 pytesseract,但
我很难弄清楚如何旋转 strip.text theme 中的属性来自 ggplot2 .我使用的是 R 版本 3.4.2 和 ggplot2 版本 2.2.1。 以下是 MWE 的数据。 > dput
我是一名优秀的程序员,十分优秀!