如何在我的 HTML 自定义元素中接收焦点和选择事件

Posted

技术标签:

【中文标题】如何在我的 HTML 自定义元素中接收焦点和选择事件【英文标题】:How can I receive focus and select event in my HTML custom element 【发布时间】:2019-10-19 20:08:16 【问题描述】:

我正在构建一个自定义 html 元素。

自定义 HTML 元素扩展了表格单元格元素。

我在这个自定义元素中包含了一个输入文本框。

当自定义元素获得焦点或选择事件时,我希望输入文本框获得这些事件。

这是我的代码:

class DateCell extends HTMLTableCellElement 
				constructor() 
					super();
					this.textBox = document.createElement("input");
					this.textBox.type = "text";
					this.appendChild(this.textBox);
					$(this).addClass("borderCell");
					$(this).addClass("dateCell");
				
				focus(e)
				
					this.textBox.focus();
				
				select(e)
				
					this.textBox.select();
								
				set textContent(t)
				
					this.textBox.value = t;
				
				get textContent()
				
					return this.textBox.value ;
				
				set value(v) 
				
					this.textBox.value = v;
					switch (v)
					
						case "a":
								this.textBox.className="aShiftColor";
								break;
						case "b":
								this.textBox.className="bShiftColor";
								break;
						case "c":
								this.textBox.className="cShiftColor";
								break;		
					
				
				get value() 
					return this.textBox.value;
				
			
			customElements.define('datacell-string',
				DateCell, 
					extends: 'td'
				);
			$(document).ready(function() 
				var t = document.createElement("table");
				var row = t.insertRow(t.rows);
				var cell1 = new DateCell();
				var cell2 = new DateCell();
				var cell3 = new DateCell();
				row.appendChild(cell1);
				row.appendChild(cell2);
				row.appendChild(cell3);
				
				$(cell1).val("a");
				cell2.value = "c";
				cell2.select();
				$(cell3).val("b");
				$(cell3).focus();
				$(document.body).append(t);
				$("td").each(function()
					console.log(this.value);
				);
			);
td input[type="text"]			
			
				//color:white;
				border:none;
				//border:1px solid black;
				height:100%;
				width:100%;
				text-align:center;
				box-sizing: border-box;
				-moz-box-sizing: border-box;
				-webkit-box-sizing: border-box;
			
			td input[type="text"]:focus 
			
				outline: none;
			
			table 
			
				border-spacing: 0;
				border-collapse: collapse;
						
			.aShiftColor
			
				background-color:#ff99cc;
			
			.borderCell
			
				border:1px solid #e0e0e0;
			
			.bShiftColor
			 
				background-color:#ffffcc;
			
			.cShiftColor
			
				background-color:#ccffcc;
			
			.dateCell
			
				margin:0px;
				width:25px;
				padding: 0px;
				text-align: center;
				font-size:17px;
			
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

很遗憾,这些输入框都没有被选中或处于焦点位置。

【问题讨论】:

【参考方案1】:

经过多次试验,我发现由于所有的DateCells都没有连接到附加到DOM,所以“选择”和“焦点”效果没有显示出来。

因此,我更改了以下代码:

   ..............
   cell2.select();
   $(cell3).val("b");
   $(cell3).focus();
   $(document.body).append(t);

  ..............
  $(cell3).val("b");
  $(document.body).append(t);
  cell2.select();
  $(cell3).focus();

,然后就可以了!

【讨论】:

以上是关于如何在我的 HTML 自定义元素中接收焦点和选择事件的主要内容,如果未能解决你的问题,请参考以下文章

辅助功能 - 如何在元素上设置自定义选项卡焦点顺序

如何仅在我的活动页面中自定义导航项元素

如何使用自定义钩子和 useContext 仅渲染相关组件

无法设置模态内部元素的 tabindex

如何从 index.html 自定义元素标签接收数组作为@Input?

(flex mobile)如何在我的自定义布局中添加元素