多id选择器
Multi id selector
$('body').append($('#add-done-modal, #add-failed-modal', data));
此代码应将 div
与 id
add-done-modal
和 add-failed-modal
附加到 body
。那些 div
在 data
中供应。我确信 data
中的 html
完全没问题而且是有意的。
代码永远找不到 id
。我正在使用 jQuery 3.3.1。
我知道 类 是一个解决方案,但由于可以根据客户端调用选择或不选择各种模式,因此会相当笨拙。
编辑:一个简单的 $('#add-done-modal', data)
returns 一个空的 jQuery 对象。我再一次确定 #add-done-modal
在 data
.
编辑:此函数由click
事件调用:
function popup(url, name) {
$.get(url, (data) => {
$('#loading-modal .modal-body').html($('#product', data));
// Can't find '#add-done-modal' nor '#add-failed-modal'
let x = $('#add-done-modal', data);
x = $('#add-failed-modal', data);
$('body').append($('#add-done-modal, #add-failed-modal', data));
// Initialize jQuery-UI or Bootstrap stuff loaded above here. Working.
});
$('#loading-modal .modal-header .modal-title').html(name);
$('#loading-modal').modal('show');
}
这里是AJAX调用返回的内容:
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Head stuff -->
</head>
<body>
<div id="all">
<div class="top-bar">
<div class="container">
<div class="row d-flex align-items-center">
<div class="col-8 col-lg-9">
<form action="/updatelocale/" method="POST">
<select class="bs-select" onchange="this.form.submit();">
<!-- Locale options, can be disregarded -->
</select>
</form>
</div>
<div class="col justify-content-md-end">
<div class="row">
<!-- Login and some buttons, not used -->
</div>
</div>
</div>
</div>
</div>
<header class="nav-holder make-sticky">
<div id="navbar" role="navigation" class="navbar navbar-expand-lg">
<!-- A pretty navbar -->
</div>
</header>
<div id="heading-breadcrumbs">
<!-- Cute breadcrumbs -->
</div>
<div id="content">
<!-- Product, loading this from data works -->
<div id="product" class="container">
<div id="productMain" class="row">
<!-- Stuff inside #product -->
</div>
</div>
</div>
<footer class="main-footer">
<!-- Pretty footer -->
</footer>
</div>
<!-- Modal #add-done-modal -->
<div id="add-done-modal" tabindex="-1" role="dialog" aria-labelledby="add-done-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 id="add-done-modalLabel" class="modal-title">cart.add.done</h4>
<button type="button" data-dismiss="modal" aria-label="Close" class="close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">cart.add.done.long</div>
<div class="modal-footer"><button data-dismiss="modal" class="btn">modal.close</button></div>
</div>
</div>
</div>
<!-- Modal #add-failed-modal -->
<div id="add-failed-modal" tabindex="-1" role="dialog" aria-labelledby="add-failed-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 id="add-failed-modalLabel" class="modal-title">cart.add.failed</h4>
<button type="button" data-dismiss="modal" aria-label="Close" class="close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">cart.add.failed.long</div>
<div class="modal-footer"><button data-dismiss="modal" class="btn">modal.close</button></div>
</div>
</div>
</div>
<div id="login-modal" tabindex="-1" role="dialog" aria-labelledby="login-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<!-- I don't care about this modal -->
</div>
</div>
</body>
</html>
编辑:这是一个带有一些测试的fiddle。在将文档渲染到 DOM、$('#add-done-modal, #add-failed-modal')
和 $('#add-done-modal')
之后,找到模态框,然后才没有。
在第二个 fiddle 和静态 HTML 中,我检查了是否找到了模态,它们是。
HTML 字符串的 jQuery 上下文长度是否有任何限制?
如果您想正确使用 HTML 字符串,我建议将其解析为文档,例如
const domParser = new DOMParser()
const doc = domParser.parseFromString(data, 'text/html')
然后在 jQuery 选择器中使用 doc
,例如
$('#add-done-modal', doc)
当jQuery遇到上下文时,它只是将表达式转换为...
jQuery(context).find(selector)
见https://github.com/jquery/jquery/blob/3.3.1/src/core/init.js#L99
这里的问题是 jQuery 将整个文档解析为包含 <body>
下的 top-level 元素的 jQuery 对象。参见 http://api.jquery.com/jQuery/#jQuery2
But if the string appears to be an HTML snippet, jQuery attempts to create new DOM elements as described by the HTML
比如把你的HTML当成一个字符串...
$(html)
给我一个包含 15 个元素的 jQuery 对象,大部分是空文本和一些注释节点,但包括
#3 <div id="all">...</div>
#7 <div id="add-done-modal"...>...</div>
#11 <div id="add-failed-modal"...>...</div>
#13 <div id="login-modal"...>...</div>
将此对象用作选择器 context,您可以找到作为这 5 个子元素但不是这些元素本身的元素。这就是为什么您可以找到 #product
的原因。
$('body').append($('#add-done-modal, #add-failed-modal', data));
此代码应将 div
与 id
add-done-modal
和 add-failed-modal
附加到 body
。那些 div
在 data
中供应。我确信 data
中的 html
完全没问题而且是有意的。
代码永远找不到 id
。我正在使用 jQuery 3.3.1。
我知道 类 是一个解决方案,但由于可以根据客户端调用选择或不选择各种模式,因此会相当笨拙。
编辑:一个简单的 $('#add-done-modal', data)
returns 一个空的 jQuery 对象。我再一次确定 #add-done-modal
在 data
.
编辑:此函数由click
事件调用:
function popup(url, name) {
$.get(url, (data) => {
$('#loading-modal .modal-body').html($('#product', data));
// Can't find '#add-done-modal' nor '#add-failed-modal'
let x = $('#add-done-modal', data);
x = $('#add-failed-modal', data);
$('body').append($('#add-done-modal, #add-failed-modal', data));
// Initialize jQuery-UI or Bootstrap stuff loaded above here. Working.
});
$('#loading-modal .modal-header .modal-title').html(name);
$('#loading-modal').modal('show');
}
这里是AJAX调用返回的内容:
<!DOCTYPE html>
<html lang="fr">
<head>
<!-- Head stuff -->
</head>
<body>
<div id="all">
<div class="top-bar">
<div class="container">
<div class="row d-flex align-items-center">
<div class="col-8 col-lg-9">
<form action="/updatelocale/" method="POST">
<select class="bs-select" onchange="this.form.submit();">
<!-- Locale options, can be disregarded -->
</select>
</form>
</div>
<div class="col justify-content-md-end">
<div class="row">
<!-- Login and some buttons, not used -->
</div>
</div>
</div>
</div>
</div>
<header class="nav-holder make-sticky">
<div id="navbar" role="navigation" class="navbar navbar-expand-lg">
<!-- A pretty navbar -->
</div>
</header>
<div id="heading-breadcrumbs">
<!-- Cute breadcrumbs -->
</div>
<div id="content">
<!-- Product, loading this from data works -->
<div id="product" class="container">
<div id="productMain" class="row">
<!-- Stuff inside #product -->
</div>
</div>
</div>
<footer class="main-footer">
<!-- Pretty footer -->
</footer>
</div>
<!-- Modal #add-done-modal -->
<div id="add-done-modal" tabindex="-1" role="dialog" aria-labelledby="add-done-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 id="add-done-modalLabel" class="modal-title">cart.add.done</h4>
<button type="button" data-dismiss="modal" aria-label="Close" class="close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">cart.add.done.long</div>
<div class="modal-footer"><button data-dismiss="modal" class="btn">modal.close</button></div>
</div>
</div>
</div>
<!-- Modal #add-failed-modal -->
<div id="add-failed-modal" tabindex="-1" role="dialog" aria-labelledby="add-failed-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h4 id="add-failed-modalLabel" class="modal-title">cart.add.failed</h4>
<button type="button" data-dismiss="modal" aria-label="Close" class="close"><span aria-hidden="true">×</span></button>
</div>
<div class="modal-body">cart.add.failed.long</div>
<div class="modal-footer"><button data-dismiss="modal" class="btn">modal.close</button></div>
</div>
</div>
</div>
<div id="login-modal" tabindex="-1" role="dialog" aria-labelledby="login-modalLabel" aria-hidden="true" class="modal fade">
<div role="document" class="modal-dialog">
<!-- I don't care about this modal -->
</div>
</div>
</body>
</html>
编辑:这是一个带有一些测试的fiddle。在将文档渲染到 DOM、$('#add-done-modal, #add-failed-modal')
和 $('#add-done-modal')
之后,找到模态框,然后才没有。
在第二个 fiddle 和静态 HTML 中,我检查了是否找到了模态,它们是。
HTML 字符串的 jQuery 上下文长度是否有任何限制?
如果您想正确使用 HTML 字符串,我建议将其解析为文档,例如
const domParser = new DOMParser()
const doc = domParser.parseFromString(data, 'text/html')
然后在 jQuery 选择器中使用 doc
,例如
$('#add-done-modal', doc)
当jQuery遇到上下文时,它只是将表达式转换为...
jQuery(context).find(selector)
见https://github.com/jquery/jquery/blob/3.3.1/src/core/init.js#L99
这里的问题是 jQuery 将整个文档解析为包含 <body>
下的 top-level 元素的 jQuery 对象。参见 http://api.jquery.com/jQuery/#jQuery2
But if the string appears to be an HTML snippet, jQuery attempts to create new DOM elements as described by the HTML
比如把你的HTML当成一个字符串...
$(html)
给我一个包含 15 个元素的 jQuery 对象,大部分是空文本和一些注释节点,但包括
#3 <div id="all">...</div>
#7 <div id="add-done-modal"...>...</div>
#11 <div id="add-failed-modal"...>...</div>
#13 <div id="login-modal"...>...</div>
将此对象用作选择器 context,您可以找到作为这 5 个子元素但不是这些元素本身的元素。这就是为什么您可以找到 #product
的原因。