Console.log() 元素在 JQuery 之后存在,但在 HTML 文档中,元素不存在
Console.log() Element Exists after JQuery but in HTML document, Element doesn't exist
我正在使用 JQuery 更新模态中的 select 元素。如果我执行 console.log,则该元素存在。
如果我检查元素,它不存在。
可能导致问题的原因是什么? console.log 在 JQuery 有 运行 之后发生,这意味着它工作正常。如果你不在模态中执行,代码工作正常,但如果你在模态中执行,它不会追加。
什么会导致这种行为?
这是一个示例代码,它可以正常工作,但在我的计算机上不起作用。
var options = {
'option1': {'display': 'Series A', 'optionsB': {'name': 'John', 'city': 'Doe'}},
'option2': {'display': 'Series B', 'optionsB': {'name': 'Jane', 'city': 'Maria'}},
}
function updateOptions(){
/* var options = $('#selectoptions').data('datasets') */;
for (const opt1 in options) {
$('#option1').append($('<option>', {
value: opt1,
text: options[opt1]['display']
}))
}
$('#option1').on('click', function(){
var option1 = $('#option1').val();
for (const opt2 in options[option1]['optionsB']) {
$('#option2').append($('<option>', {
value: opt2,
text: options[option1]['optionsB'][opt2]
}))
}
})
}
$(function(){
updateOptions();
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<button type="button" id="examPle" data-bs-toggle="modal" data-bs-target="#exampleModal" class="btn btn-primary">Get Example</button>
<div id="exampleModal" class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Example Modal</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form class="form" id="exampleform" name="exaple" method="post" required>
<div id="selectoptions">
<select id="option1" class="form-select form-select-sm mb-1">
<option value="...">Select Option 1</option>
</select>
<select id="option2" class="form-select form-select-sm mb-1">
<option value="...">Select Option 2</option>
</select>
</div>
</form>
</div>
</div>
</div>
</div>
这是对问题的编辑:
上面的代码显示了一个最小版本。整个代码是一个 Django 应用程序。我将上面的 html 代码编辑为
<div class="modal-body">
<!-- {% csrf_token %} -->
<p>Filter Collection</p>
<div id="navpanel" data-datasets="{{ datasets }}">
<select id="option1" class="form-select form-select-sm mb-1">
<option value="...">Select Map Type</option>
</select>
</div>
</div>
python views.py 文件具有以下内容:
from .controls import datasets
import json
def maps(request):
context = {
'datasets': json.dumps(datasets),
}
return render(request, 'example.html', context)
.controls示例如下
datasets = {
'series1': {
'display': 'This first Text',
'options': {
'series1A': {
'display' : 'This text for 1 A'
},
'series1B': {
'display' : 'This text for 1 B'
},
},
},
'series 2': {
'display': 'This text',
'options': {
'series2A': {
'display': 'This next text of 2 A',
},
'series2B': {
'display': 'This next text of 2 B'
},
},
},
}
和 javascript,您删除 var 选项变量并将其更改如下:
function updateOptions(){
var options = $('#selectoptions').data('datasets');
for (const opt1 in options) {
$('#option1').append($('<option>', {
value: opt1,
text: options[opt1]['display']
}))
}
$('#option1').on('click', function(){
var option1 = $('#option1').val();
for (const opt2 in options[option1]['optionsB']) {
$('#option2').append($('<option>', {
value: opt2,
text: options[option1]['optionsB'][opt2]['display']
}))
}
})
}
$(function(){
updateOptions();
});
答案是有另一个具有相同 ID 的元素。它正在更新那个而不是模态中的那个。
我正在使用 JQuery 更新模态中的 select 元素。如果我执行 console.log,则该元素存在。
如果我检查元素,它不存在。
可能导致问题的原因是什么? console.log 在 JQuery 有 运行 之后发生,这意味着它工作正常。如果你不在模态中执行,代码工作正常,但如果你在模态中执行,它不会追加。
什么会导致这种行为?
这是一个示例代码,它可以正常工作,但在我的计算机上不起作用。
var options = {
'option1': {'display': 'Series A', 'optionsB': {'name': 'John', 'city': 'Doe'}},
'option2': {'display': 'Series B', 'optionsB': {'name': 'Jane', 'city': 'Maria'}},
}
function updateOptions(){
/* var options = $('#selectoptions').data('datasets') */;
for (const opt1 in options) {
$('#option1').append($('<option>', {
value: opt1,
text: options[opt1]['display']
}))
}
$('#option1').on('click', function(){
var option1 = $('#option1').val();
for (const opt2 in options[option1]['optionsB']) {
$('#option2').append($('<option>', {
value: opt2,
text: options[option1]['optionsB'][opt2]
}))
}
})
}
$(function(){
updateOptions();
});
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.6.0.js" integrity="sha256-H+K7U5CnXl1h5ywQfKtSj8PCmoN9aaq30gDh27Xc0jk=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13" crossorigin="anonymous"></script>
<button type="button" id="examPle" data-bs-toggle="modal" data-bs-target="#exampleModal" class="btn btn-primary">Get Example</button>
<div id="exampleModal" class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Example Modal</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form class="form" id="exampleform" name="exaple" method="post" required>
<div id="selectoptions">
<select id="option1" class="form-select form-select-sm mb-1">
<option value="...">Select Option 1</option>
</select>
<select id="option2" class="form-select form-select-sm mb-1">
<option value="...">Select Option 2</option>
</select>
</div>
</form>
</div>
</div>
</div>
</div>
这是对问题的编辑: 上面的代码显示了一个最小版本。整个代码是一个 Django 应用程序。我将上面的 html 代码编辑为
<div class="modal-body">
<!-- {% csrf_token %} -->
<p>Filter Collection</p>
<div id="navpanel" data-datasets="{{ datasets }}">
<select id="option1" class="form-select form-select-sm mb-1">
<option value="...">Select Map Type</option>
</select>
</div>
</div>
python views.py 文件具有以下内容:
from .controls import datasets
import json
def maps(request):
context = {
'datasets': json.dumps(datasets),
}
return render(request, 'example.html', context)
.controls示例如下
datasets = {
'series1': {
'display': 'This first Text',
'options': {
'series1A': {
'display' : 'This text for 1 A'
},
'series1B': {
'display' : 'This text for 1 B'
},
},
},
'series 2': {
'display': 'This text',
'options': {
'series2A': {
'display': 'This next text of 2 A',
},
'series2B': {
'display': 'This next text of 2 B'
},
},
},
}
和 javascript,您删除 var 选项变量并将其更改如下:
function updateOptions(){
var options = $('#selectoptions').data('datasets');
for (const opt1 in options) {
$('#option1').append($('<option>', {
value: opt1,
text: options[opt1]['display']
}))
}
$('#option1').on('click', function(){
var option1 = $('#option1').val();
for (const opt2 in options[option1]['optionsB']) {
$('#option2').append($('<option>', {
value: opt2,
text: options[option1]['optionsB'][opt2]['display']
}))
}
})
}
$(function(){
updateOptions();
});
答案是有另一个具有相同 ID 的元素。它正在更新那个而不是模态中的那个。