单击表格中的TD单元格并插入<select>框元素

时间:2016-08-31 19:13:17

标签: javascript jquery html

虽然我的代码似乎漫无目的地插入&lt; select&gt; &lt; td&gt;中的元素单元格(谁的类名是&#34; ufield&#34;)首次点击时,现在的问题是,当我点击并在选择框中进行选择时,会在旁边插入一个新的选择元素它。 如果已存在多个选择框,如何防止添加多个选择框? 我的第二个问题是,一旦在目标选择框中进行选择,如何删除选择框并在目标TD单元格中保留其选项文本值? 下面是问题的图片: 期望的结果是: 有问题的守则: &#13; &#13; window.onload = function(){&#13;   $(&#34; .ufield&#34;)。click(function(){&#13;     $(this).append(&#34;&lt; select&gt;&lt; option value =&#39; TEST&#39;&gt; TEST&lt; / option&gt;&#34;);&#13;   });&#13; }&#13; * {&#13;   font-family:Arial;&#13;   font-size:9pt;&#13; }&#13; &lt; script src =&#34; https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt; / script&gt;&#13; &lt; table style =&#34; width:100%&#34;&gt;&#13;   &LT; TR&GT;&#13;     &lt; td&gt;用户ID:&lt; / td&gt;&#13;     &LT; TD&GT; JSMITH&LT; / TD&GT;&#13;     &lt; td class =&#34; ufield&#34; ID =&#34;接入&#34;&GT; TEST&LT; / TD&GT;&#13;     &LT; TD&GT;地板:其中; / TD&GT;&#13;     &LT; TD&GT; 12&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &lt; td&gt;帐户状态:&lt; / td&gt;&#13;     &LT; TD&GT;有源&LT; / TD&GT;&#13;     &LT; TD&GT;办公:其中; / TD&GT;&#13;     &LT; TD&GT; D5656&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &lt; td&gt;上次登录:&lt; / td&gt;&#13;     &lt; td&gt; 30/08/2016 4:16 PM&lt; / td&gt;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;姓:其中; / TD&GT;&#13;     &LT; TD&GT;约翰&LT; / TD&GT;&#13;     &LT; TD&gt;地址:其中; / TD&GT;&#13;     &lt; td&gt; 175 Yahoo Lane&lt; / td&gt;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;姓:其中; / TD&GT;&#13;     &LT; TD&GT; Smith和LT; / TD&GT;&#13;     &LT; TD&GT;省:其中; / TD&GT;&#13;     &LT; TD&GT;安大略&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;电话:其中; / TD&GT;&#13;     &LT; TD&GT; 123-456-7891&LT; / TD&GT;&#13;     &LT; TD&GT;城市:其中; / TD&GT;&#13;     &lt; td&gt; Niagra Falls&lt; / td&gt;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;传真:其中; / TD&GT;&#13;     &LT; TD&GT; 613-990-1301&LT; / TD&GT;&#13;     &LT; TD&GT;国家:其中; / TD&GT;&#13;     &LT; TD&GT;加拿大和LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;电子邮件:其中; / TD&GT;&#13;     &LT; TD&GT; john_smith@yahoo.ca< / TD&GT;&#13;     &lt; td&gt;邮政编码:&lt; / td&gt;&#13;     &LT; TD&GT; 90210&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13;   &LT; TR&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;     &LT; TD&GT;&安培; NBSP;&LT; / TD&GT;&#13;   &LT; / TR&GT;&#13; &LT; /表&gt;&#13; &#13; &#13;

5 个答案:

答案 0 :(得分:0)

首次点击后,您可以将字词应用到字段中。然后,只有当没有此类时,才可以将该下拉列表添加到该字段中。

$(".ufield").click(function() {
    if (!$(this).hasClass('hasSelect') {
      $(this).addClass('hasSelect');
      $(this).append("<select><option value='TEST'>TEST</option>");
    }
  });

答案 1 :(得分:0)

您必须告诉您的元素停止收听点击事件。您可以使用unbind(http://api.jquery.com/unbind/)来完成此操作。您的JS代码将类似于:

 $(".ufield").click(function() {

    $(this).append("<select><option value='TEST'>TEST</option>");
    $(this).unbind('click');

});

答案 2 :(得分:0)

您可以添加if语句来检查子项是否为select元素

$(document).on('click', '.ufield', function() {
  if($(this).find('select').length == 0) {
      $(this).empty();  //clears out current text in the table
      $(this).append("<select><option value='TEST'>TEST</option>");
  }
});

对于问题的第二部分,您可以在用户从select元素中聚焦时添加事件。

$(document).on('focusout', '.ufield select', function(){
    var myValue = $(this).val();
    var $parent = $(this).parent();
    $(this).remove();
    $parent.append(myValue);
});

&#13;
&#13;
$(document).on('click', '.ufield', function() {
  if($(this).find('select').length == 0) {
    $(this).empty(); //clears out the current value in the table cell
    $(this).append("<select><option value='TEST'>TEST</option>");
  }
});

$(document).on('focusout', '.ufield select', function(){
    var myValue = $(this).val();  //gets the current value of the select box
    var $parent = $(this).parent();   //saves the parent element to append the value to later
    $(this).remove();  //removes the select element
    $parent.append(myValue);  //appends the value to the table cell
});
&#13;
* {
  font-family: Arial;
  font-size: 9pt;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table style="width: 100%">
  <tr>
    <td>User ID:</td>
    <td>JSMITH</td>
    <td class="ufield" id="access">TEST</td>
    <td>Floor:</td>
    <td>12</td>
  </tr>
  <tr>
    <td>Account Status:</td>
    <td>active</td>
    <td>Office:</td>
    <td>D5656</td>
  </tr>
  <tr>
    <td>Last Login:</td>
    <td>30/08/2016 4:16 PM</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>Firstname:</td>
    <td>John</td>
    <td>Address:</td>
    <td>175 Yahoo Lane</td>
  </tr>
  <tr>
    <td>Lastname:</td>
    <td>Smith</td>
    <td>Province:</td>
    <td>Ontario</td>
  </tr>
  <tr>
    <td>Telephone:</td>
    <td>123-456-7891</td>
    <td>City:</td>
    <td>Niagra Falls</td>
  </tr>
  <tr>
    <td>Fax:</td>
    <td>613-990-1301</td>
    <td>Country:</td>
    <td>Canada</td>
  </tr>
  <tr>
    <td>E-mail:</td>
    <td>john_smith@yahoo.ca</td>
    <td>Postal Code:</td>
    <td>90210</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
  <tr>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
    <td>&nbsp;</td>
  </tr>
</table>
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我们需要一个函数来创建一个需要事件触发器的新<select>,每次都在这里

&#13;
&#13;
function NewSelectBox() {
  var select = document.createElement('select');
  var values = ['foo', 'bar', 'foo2'];
  for (var i = 0; i < values.length; i++) {
    var new_opt = document.createElement('option');
    new_opt.setAttribute('value', values[i]);
    new_opt.innerHTML = values[i];
    select.appendChild(new_opt);
  }

  //add the event we need
  $(select).on('change',function(){
    var $parent = $(this).parent();
    var value = $(this).val();
    $(this).remove();
    $parent.text(value);
  });

  return select;
}
&#13;
&#13;
&#13;


仅用于插入<select>如果没有任何...

&#13;
&#13;
$('.ufield').on('click',function () {
    $(this).unbind('click'); // this will unbind click event only for this element (not all '.ufield's select.
    $(this).append( NewSelectBox() );//prepared before
});
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我已经创建了一种方法,可以在不使用jQuery的情况下执行此操作,但是您也想要这个选项 - 我不认为在几行时包含整个库是值得的vanilla JS可以轻松处理这个问题;但您可能需要在项目中使用jQuery。

这是两个功能;其中一个调用窗口加载并分配选择选项。

第二个选项等待焦点清除选择菜单,并使用所选值的字符串填充辅助表的访问TD。你可以通过&#34; tabbing&#34;离开,或者点击屏幕上的其他位置,例如下一个字段,等等。

以下是工作示例:

&#13;
&#13;
var input = document.getElementById('input')
var output = document.getElementById('output')


window.onload = addSelections();

function addSelections(){
 var inputString = input.innerHTML = "<select id='selectedInput' ><option value='TEST 1'>TEST 1</option><option value='TEST 2'>TEST 2</option><option value='TEST 3'>TEST 3</option></select>" 
  
var inputListener = document.getElementById("selectedInput");
inputListener.addEventListener("blur", dumpSelections);
}

  
function dumpSelections() {
var selectedInput = document.getElementById('selectedInput')
var outputString = selectedInput.options[selectedInput.selectedIndex].text;
output.innerHTML = outputString;


}
&#13;
<h2>Input Table</h2>
<table>
  <tr>
    <th>Name</th>
    <th>Access</th>
  </tr>
  <tr>
    <td>John</td>
    <td id="input" >TEST</td>
    <td>
  </tr>
</table>

<h2>Output Table</h2>
<table>
  <tr>
    <th>Name</th>
    <th>Access</th>
  </tr>
  <tr>
    <td>John</td>
    <td id="output" ></td>
  </tr>
</table>

  
&#13;
&#13;
&#13;