【问题标题】:How do I trigger a JavaScript function from a select element when the select element no longer exists in a normal manner? [closed]How do I trigger a JavaScript function from a select element when the select element no longer exists in a normal manner? [关闭]
【发布时间】:2018-12-10 08:04:51
【问题描述】:

我有一个数据表,它曾经使用 jQuery 调用来显示一个隐藏的 div,其中包含一个额外的文本输入字段,只有在选择时选择了一个特定选项。它看起来像这样 - 在页面的头部:

jQuery(function ($) {
    $('#newSubStatus').change(function () {
        $('#showhide').toggle(this.value == 'Option B');
    }).change(); // To set the initial state
})

在体内:

<select id="newSubStatus" name="newSubStatus">
    <option value="Option A">Option A</option>
    <option value="Option B">Option B</option>
    <option value="Option C">Option C</option>
    <option value="Option D">Option D</option>
    <option value="Option E">Option E</option>
    <option value="remove">Remove Sub-status</option>
</select><br>
<div id="showhide" style="display: none;">
    <input type="text" style="width: 120px; margin-left: 40px;" name="newSubStatusExtra" value="" placeholder="Enter amount">
</div>

效果很好。现在我正在重做这个页面,以便可以使用 Jeditable 编辑表中的数据,它可以完美地处理这个例外,因为我无法让它以任何可能的方式显示隐藏的 div。我当前的代码看起来像这样 - 在头脑中:

jQuery(function ($) {
    $('#newSubStatus').change(function () {
        $('#showhide').toggle(this.value == 'Option B');
    }).change(); // To set the initial state
})

$(function() {
    $(".edselect_subStatus").editable("./update.php?x=jiwjOijoJoihYfytfjhhiuh", {
        data        : '{"Option A":"Option A","Option B":"Option B","Option C":"Option C","Option D":"Option D","Option E":"Option E","REMOVE":"Remove Sub-status"}',
        callback    : function() {
            location.reload();
        },
        type        : 'select',
        event       : 'dblclick',
        placeholder : '',
        onblur      : 'ignore',
        indicator   : 'Saving...',
        cssclass    : 'editable',
        submit      : 'Save',
        cancel      : 'Cancel',
    });
});

在体内:

 <tr>
     <td>Status:</td>
     <td class="edselect_status" id="status"><?=$status?></td>
     <td style="padding-left: 10px;">Sub-status:</td>
     <td class="edselect_subStatus" id="subStatus"><?=$subStatus?>
     <div id="showhide" style="display: none;"><br>
         <input type="text" style="width: 120px; margin-left: 40px;" name="newSubStatusExtra" value="" placeholder="Enter amount">
     </div></td>
 </tr>

我知道没有任何东西可以将#newSubStatus 连接到选择来触发它。我尝试了将它连接到它所在的td id 的方法,但没有成功。我找到了许多其他方法来显示文本字段,但它们都依赖于来自原始select 的 id 元素。有没有办法使这项工作发挥作用,还是 JavaScript 不匹配太多而无法一起运行?

【问题讨论】:

  • Jeditable 的 HTML 输出是什么?它创造了什么?
  • 它使用data 行中列出的选项创建一个select。它似乎没有产生一个select,我可以在上面放置一个id。我什至通过调整 jquery.jeditable.mini.js 文件来尝试过这个。
  • 显然输入newSubStatusExtra的值实际上需要以某种实用的方式与select数据一起发布,否则它无法正常工作。
  • 如果这是一个要求,它需要成为问题的一部分。如果您实际上没有告诉他们您的全部要求,那么很难责怪回答者不包括它。我们无法读懂你的想法。

标签: javascript jquery


【解决方案1】:

select 时如何从 select 元素触发 JS 函数 元素不再以正常方式存在?

您正在将处理程序分配给尚未呈现的 Jeditable 元素,并且无法将处理程序分配给它需要存在于 DOM 中的元素。

在这种情况下,您可以使用事件委托,在本例中是 jQuery 的 .on(),其中处理程序附加到父级,然后设置为从 select(第二个参数)获取事件,例如

jQuery(function ($) {
    $('#subStatus').on('change', 'select', function (event) {
        $('#showhide').toggle(this.value == 'Option B');
    })
})

堆栈sn-p

jQuery(function ($) {
    $('#subStatus').on('change', 'select', function (event) {
        $('#showhide').toggle(this.value == 'Option B');
    })
})
/* for the purpose of this demo */
td {
  vertical-align: top;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <tr>
    <td>Status:</td>
    <td class="edselect_status" id="status">
      <?=$status?>
    </td>
    <td style="padding-left: 10px;">Sub-status:</td>
    <td class="edselect_subStatus" id="subStatus">

      <select>
        <option value="Option A">Option A</option>
        <option value="Option B">Option B</option>
        <option value="Option C">Option C</option>
        <option value="Option D">Option D</option>
        <option value="Option E">Option E</option>
        <option value="remove">Remove Sub-status</option>
      </select>

      <div id="showhide" style="display: none;">
        <input type="text" style="width: 120px; margin-left: 40px;" name="newSubStatusExtra" value="" placeholder="Enter amount">
      </div>
    </td>
  </tr>
</table>

对于任何想要更深入地解释什么是事件委托的人,这里有一个很好的答案,其中包含几个指向具体代码示例的链接:


根据评论更新,说隐藏的div还是不行 显示/隐藏。

通过Codepen demo,我能够找出问题所在。

tdedselect_subStatus 类是 Jeditable 生成的地方,它替换了 td 中的所有内容,你的 div/input 也一样,所以为了解决这个问题,我添加了一个额外的 @987654337 @ 并将 edselect_subStatus 类移到其中。

一个不太重要的注意事项,在 Codepen 的第二个样本中,dividinputshowhide_B,而不是最初的 showhide,并且修复了它现在一切正常,可以正确显示/隐藏隐藏的div

堆栈 sn-p - 和 updated version of your Codepen sample

<html>
<head>
<title>Demo</title>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>
<script src="http://www.appelsiini.net/download/jquery.jeditable.mini.js"></script>
<script>
//<![CDATA[
jQuery(function ($) {
    $("#newSubStatus_A").change(function () {
        $("#showhide_A").toggle(this.value == 'Option B');
    }).change(); //to set the initial state
})

jQuery(function ($) {
    $('#subStatus').on('change', 'select', function (event) {
      $('#showhide_B').toggle(this.value == 'Option B');
    })
})

jQuery(function ($) {
    $('#subStatus').on('click', 'button', function (event) {
        $('#showhide_B').hide();
    })
})
function jeditableReset(settings, original) {
    $('#showhide_B').hide();
}
  
$(function() {
	$(".edselect_appStatus").editable("./ADMIN.UPDATER.php?key=demo", {
		data		: '{"Stat A":"Stat A","Stat B":"Stat B","Stat C":"Stat C","Stat D":"Stat D","Stat E":"Stat E"}',
		callback	: function() {
			location.reload();
		},
		type			: 'select',
		event		: 'dblclick',
		placeholder	: '',
		onblur		: 'ignore',
		indicator	: 'Saving...',
		cssclass	: 'editable',
		submit		: 'Save',
		cancel		: 'Cancel',
	});

	$(".edselect_subStatus").editable("./ADMIN.UPDATER.php?key=demo", {
		data         : '{"Option A":"Option A","Option B":"Option B","Option C":"Option C","Option D":"Option D","Option E":"Option E","REMOVE":"Remove Sub-status"}',
		callback	: function() {
			location.reload();
		},
    onreset: jeditableReset,
    type			: 'select',
		event		: 'dblclick',
		placeholder	: '',
		onblur		: 'ignore',
		indicator	: 'Saving...',
		cssclass	: 'editable',
		submit		: 'Save',
		cancel		: 'Cancel',
	});
});
//]]>
</script>
</head>

<body style="bgcolor: #fff;">

<h1>Original method</h1>

<p>To see effect, choose &quot;Option B&quot; in Sub-Status</p>

    <table style="width: 800px; margin-bottom: 0;" border="1">
     <tbody><tr>
      <td style="width: 17%;">Status:</td>
      <td style="bgcolor: #f6f6f6; width: 33%;">
	   <select id="newStatus_A" name="newStatus_A" style="width: 270px;">
       <option value="">Choose...</option>
       <option value="Stat A">Stat A</option>
       <option value="Stat B">Stat B</option>
       <option value="Stat C">Stat C</option>
       <option value="Stat D">Stat D</option>
       <option value="Stat E">Stat E</option>
      </select></td>
      <td style="width: 17%; padding-left: 10px;">Sub-status:</td>
      <td style="bgcolor: #f6f6f6; width: 33%;">
	   <select id="newSubStatus_A" name="newSubStatus_A" style="width: 270px;">
       <option value="">Choose...</option>
       <option value="Option A">Option A</option>
       <option value="Option B">Option B</option>
       <option value="Option C">Option C</option>
       <option value="Option D">Option D</option>
       <option value="Option E">Option E</option>
       <option value="REMOVE">Remove Sub-status</option>
      </select><br>
      <div id="showhide_A" style="display: none;">
       <input type="text" style="width: 120px; margin-left: 40px;" name="newSubStatusExtra_A" value="" placeholder="Enter amount">
      </div></td>
     </tr></tbody>
    </table>

<br><br>

<h1>New method (using Jeditable)</h1>

<p>Double click in on the &quot;Select...&quot; fields. Choosing &quot;Option B&quot; in Sub-Status field is supposed to reveal the additional field as above</p>

    <table style="width: 800px; margin-bottom: 0;" border="1">
     <tbody><tr>
      <td style="width: 17%;">Status:</td>
      <td style="bgcolor: #f6f6f6; width: 33%;" class="edselect_appStatus" id="appStatus">Select...</td>
      <td style="width: 17%; padding-left: 10px;">Sub-status:</td>
      <td style="bgcolor: #f6f6f6; width: 33%;" id="subStatus"><div class="edselect_subStatus">Select...</div>
        
      <div id="showhide_B" style="display: none;"><br>
       <input type="text" style="width: 120px; margin-left: 40px;" name="newSubStatusValue" maxlength="12" value="" placeholder="Enter amount">
      </div></td>
     </tr></tbody>
    </table>

</body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-16
    • 2021-07-18
    • 1970-01-01
    • 2022-12-01
    • 2022-12-02
    • 2023-02-26
    • 2022-01-04
    • 2022-12-27
    相关资源
    最近更新 更多