【问题标题】:get text inside element, if element contains select get selected option获取元素内的文本,如果元素包含选择获取选定选项
【发布时间】:2020-04-21 15:24:08
【问题描述】:

编辑后:使用 MutationObserver 代替 DOMSubtreeModified

我有一个 div,我在其中使用 .each 遍历每个标签并获取它们的文本,但我想添加一个额外的 ifelse 语句,如果标签包含一个 select 子项,请将 selected 选项添加到文本字符串

$("#droppable").on('click', '.delete', function() {
  $(this).parent().remove(); // changed - missed "()"
});

var target = document.querySelector('#droppable')
var observer = new MutationObserver(function(mutations) {
  var str = "";
	$('#droppable label').each(function(){
	str += $(this).text() + "<br>";
  document.getElementById("inside_drop_zone").innerHTML = str  
	});
})
// configuration of the observer:
var config = { attributes: true, childList: true, characterData: true };
// pass in the target node, as well as the observer options
observer.observe(target, config);
#droppable {
border: 2px dashed #466683;
padding: 1em;
min-height: 200px;
}

#droppable.ui-droppable-hover {
background: #bad4ed;
}

#droppable select {
margin: 5px;
}

.drop_area {
  border: 1px solid lightgray;
  padding: 3px;
  margin-bottom: 3px;
  width: 100%;
}

.delete {
  background: none;
  border: 0px;
  color: #888;
  font-size: 15px;
  width: 60px;
  margin: 0px 0 0;
  font-family: Lato, sans-serif;
  cursor: pointer;
  float: right;
  display: inline-block;
}

button:hover {
  color: #CF2323;
}

#inside_drop_zone {
  height: 100px;
  width: 100%;
  background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="droppable">
<div class="form-group drop_area">
<label class="control-label" for="one">ONE</label><select id="one-select">
<option value="week1" selected>Week 1</option>
<option value="week2">Week 2</option>
<option value="week3">Week 3</option>
<option value="week4">Week 4</option></select>
<button class="delete">Delete</button>
</div>

<div class="form-group drop_area">
<label class="control-label" for="chg">THREE</label>
<button class="delete">Delete</button>
</div>

<div class="form-group drop_area">
<label class="control-label" for="two">TWO</label><select id="two-select">
<option value="week1" selected>Week 1</option>
<option value="week2">Week 2</option>
<option value="week3">Week 3</option>
<option value="week4">Week 4</option></select>
<button class="delete">Delete</button>
</div>
</div>

<div id="inside_drop_zone"></div>

期望的输出

标签或标签:选择的选项

ONE + ":" + week 1 
THREE
TWO + ":" + week 3

我对 JQuery 还很陌生,所以感谢您的帮助/提示!

【问题讨论】:

  • 您是否只在标签和选择框之间查找:放置,当存在选择框时? span>
  • 不推荐使用 DOMSubtreeModified 吗?

标签: javascript jquery


【解决方案1】:

查找标记为// changed的行

$("#droppable").on('click', '.delete', function() {
  $(this).parent().remove(); // changed - missed "()"
});

$("body").on('DOMSubtreeModified', "#droppable", function() {
  var str = "";
  $('#droppable label').each(function() {
    const txt = $(this).text() // changed
    const val = $(this).parent().find("select").children("option:selected").val() // changed - the main idea is to get parent() of $(this) and then search for <select>
    str += txt + (val ? ":" + val : "") + "<br>"; // changed
  })

  document.getElementById("inside_drop_zone").innerHTML = str
});
#droppable {
  border: 2px dashed #466683;
  padding: 1em;
  min-height: 200px;
}

#droppable.ui-droppable-hover {
  background: #bad4ed;
}

#droppable select {
  margin: 5px;
}

.drop_area {
  border: 1px solid lightgray;
  padding: 3px;
  margin-bottom: 3px;
  width: 100%;
}

.delete {
  background: none;
  border: 0px;
  color: #888;
  font-size: 15px;
  width: 60px;
  margin: 0px 0 0;
  font-family: Lato, sans-serif;
  cursor: pointer;
  float: right;
  display: inline-block;
}

button:hover {
  color: #CF2323;
}

#inside_drop_zone {
  height: 100px;
  width: 100%;
  background-color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="droppable">
  <div class="form-group drop_area">
    <label class="control-label" for="one">ONE</label>
    <select id="one-select">
      <option value="week1" selected>Week 1</option>
      <option value="week2">Week 2</option>
      <option value="week3">Week 3</option>
      <option value="week4">Week 4</option>
    </select>
    <button class="delete">Delete</button>
  </div>

  <div class="form-group drop_area">
    <label class="control-label" for="chg">THREE</label>
    <button class="delete">Delete</button>
  </div>

  <div class="form-group drop_area">
    <label class="control-label" for="two">TWO</label>
    <select id="two-select">
      <option value="week1" selected>Week 1</option>
      <option value="week2">Week 2</option>
      <option value="week3">Week 3</option>
      <option value="week4">Week 4</option>
    </select>
    <button class="delete">Delete</button>
  </div>
</div>

<div id="inside_drop_zone"></div>

【讨论】:

  • 非常感谢,太好了!!!我稍微编辑了帖子以使用 MutationObserver 并希望这足以检测到 #droppable 中的选择更改,但此代码仅在删除内部 div 之一时运行,理想情况下,我希望文本在何时刷新用户选择不同的选项。我如何修改您的代码以在 option:selected 更改时包含?
  • 从 on('DOMSubtreeModified') 回调创建命名函数...我们将其命名为 update_drop_zone() 并添加 $('select').on('change', update_drop_zone);
  • 是的...不要使用MutationObserver,只需完全删除 on('DOMSubtreeModified') 并在 on('click', '.delete') 内添加对update_drop_zone() 的调用回调
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2011-08-06
  • 2013-08-06
  • 1970-01-01
  • 2011-11-05
  • 2010-11-23
  • 2016-03-17
相关资源
最近更新 更多