- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
1) $(html_str)
如果没有 <script>
则有效标签:
$(document).ready(function() {
var $select = $('<select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>');
var id = $select.attr("id");
console.log(id); //=> select1
});
但是$(html_str)
当 html 包含前导 <script>
时“失败”标签:
$(document).ready(function() {
var $select = $('<script>alert("hello");</script><select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>');
var id = $select.attr("id");
console.log(id); //=> script
});
仔细阅读文档表明这是预期的行为:jQuery()
的文档,即$()
,说:
Return a collection of matched elements
http://api.jquery.com/jquery/#jQuery2
...attr() 的文档说:
Get the value of an attribute for the first element in the set of matched elements
...以及 <script>
标签没有 id。
2) jQuery() 文档还说:
For explicit parsing of a string to HTML, use the
$.parseHTML()
method.
还有$.parseHTML()
文档说:
Parses a string into an array of DOM nodes.
http://api.jquery.com/jquery.parsehtml/
因为这只是一个包含非 jQuery 对象的 javascript 数组,为了在数组上使用 jQuery 函数,您必须将数组转换为 jQuery 对象,这就是 $()
也可以这样做:
jQuery(elementArray)
elementArray
Type: Array
An array containing a set of DOM elements to wrap in a jQuery object.
换句话说,你需要做这样的事情:
var js_dom_node_array = $.parseHTML(html_str);
var $jquery_obj = $(js_dom_node_array);
归结为这个看起来奇怪的结构:
var $jquery_obj = $($.parseHTML(html_str));
所以让我们尝试一下:
$(document).ready(function() {
var $jquery_obj = $($.parseHTML('<select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>'));
var id = $jquery_obj.attr("id")
console.log(id); //=> select1
});
这有效。现在领先<script>
标签:
$(document).ready(function() {
var $jquery_obj = $($.parseHTML('<script>alert("hello");</script> \
<select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>'));
var id = $jquery_obj.attr("id")
console.log(id); //=> undefined
});
那是行不通的。所以$($.parseHTML(html_str))
似乎工作就像 $(html_str)
,但是还有这样的:
$(document).ready(function() {
var $jquery_obj = $($.parseHTML('<script>alert("hello");</script><select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>'));
var id = $jquery_obj.attr("id")
console.log(id); //=> select1
});
嗯?为什么这样有效?
忽略这一异常现象,为什么是 $.parseHTML(html_str)
甚至需要?根据http://jquery.com/upgrade-guide/1.9/#jquery-htmlstring-versus-jquery-selectorstring :
jQuery(htmlString)
versusjQuery(selectorString)
Prior to 1.9, a string would be considered to be an HTML string if it had HTML tags anywhere within the string. This has the potential to cause inadvertent execution of code and reject valid selector strings. As of 1.9, a string is only considered to be HTML if it starts with a less-than ("<") character. The Migrate plugin can be used to restore the pre-1.9 behavior.
If a string is known to be HTML but may start with arbitrary text that is not an HTML tag, pass it to
jQuery.parseHTML()
which will return an array of DOM nodes representing the markup. A jQuery collection can be created from this, for example:$($.parseHTML(htmlString))
. This would be considered best practice when processing HTML templates for example. Simple uses of literal strings such as$("<p>Testing</p>").appendTo("body")
are unaffected by this change.Bottom line: HTML strings passed to jQuery() that start with something other than a less-than character will be interpreted as a selector. Since the string usually cannot be interpreted as a selector, the most likely result will be an "invalid selector syntax" error thrown by the Sizzle selector engine. Use
jQuery.parseHTML()
to parse arbitrary HTML.
3) $(html_str).filter("select").attr("id")
作品:
$(document).ready(function() {
var $html = $('<script>alert("hello");</script><select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>');
var id = $html.filter("select").attr("id");
console.log(id); //=> select1
});
最佳答案
请记住 .attr('id')
返回 id
的值当前 jQuery 集合中 first 元素的属性。
Huh? Why does that work?
因为 $.parseHTML
条<script>
默认标记,因此 <select>
element 成为 jQuery 集合中的第一个元素。引用 docs :
<小时/>[...]
jQuery.parseHTML
does not run script in the parsed HTML unlesskeepScripts
is explicitlytrue
.
另一方面,$(htmlString)
保持<script>
标签,因此.attr('id')
寻找一个不存在的id
脚本元素中的属性。
$(html_str).filter("select").attr("id")
这有效是因为 $(html_str).filter("select")
返回一个 jQuery 集合,其第一个(也是唯一的)元素是 select
您想要检索 id
的元素来自。
最后,两个$.parseHTML
正如 Wumpus 所评论的,由于标签之间的空白,样本会产生不同的结果。
在这两个示例中,脚本标记都被删除。其中一个示例的 script 标记和 select 标记之间有空格,从而创建一个文本节点:
console.log($.parseHTML('<script>alert("hello");<\/script> \
<select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>')); // [textNode, select#select1]
console.log($.parseHTML('<script>alert("hello");<\/script><select id="select1" name="select1"> \
<option value="o1">hello</option> \
<option value="o2">world</option> \
</select>')); // [select#select1]
然后这些数组被输入到 $()
,并尝试检索.attr('id')
从 textNode 失败,无提示地返回 undefined
.
我相信您已经弄清楚了问题中的其余部分。
<小时/>这实际上取决于您的用例。我个人会继续使用$()
只要它有效,代码看起来更干净。当然,你可以使用$.parseHTML
与 keepScripts
提供更多的面向 future 的能力,以防您的 HTML 变得更加复杂并且可能不以 <
开头.
关于jquery - 解析 html 字符串并提取标签 id 的最佳方法是什么? $() v. $.parseHTML v. $().filter v.?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26347187/
我有一个 k*n矩阵 X 和 k*k矩阵A。对于X的每一列,我想计算标量 X[:, i].T.dot(A).dot(X[:, i]) (或者,数学上, Xi' * A * Xi )。 目前,我有一个
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是 VueJS 的新手。我已经使用 vuetify/webpack-ssr 模板创建了一个项目,现在我想创建一个登录页面,但是没有显示表单,控制台给了我以下信息: [Vue warn]: Unkno
我尝试将 value 插入到 C++ vector v 之前的第 i 元素(或元素 (i-1) 之后) )。代码很简单 v.insert(v.begin() + i, value); 我确信当 i 介
我需要显示使用合并排序算法排序的 vector 。然而,当我使用 v.begin() 时,我的 friend 使用 v.data() 来传递 vector 。他的代码运行良好,而我的却不行。请解释。
这是我的命令(url1、url2、url3、url4 是占位符): ffmpeg -i url1 -i url2 -i url3 -i url4 -filter_complex “[1:v:0] [1
我以前用过Vue,我知道怎么用v-for渲染元素序列,v-if或v-show有条件地显示元素,并且 v-model例如,控制段落的内容。 但现在我需要对 DOM 进行更精细的控制: 我有一个range
我正在学习所有权和借用。 borrow1 和borrow2 的区别在于在borrow2 打印时使用了&: fn borrow1(v: &Vec) { println!("{}", &v[10]
我找不到一种方法来选择不同的选项来渲染 v-for 中的文本。是否有可能或者我是否需要以不同的方式构建逻辑来执行类似于下面的代码的操作? // i
Iterable 的三个直接子类型是 Map , Seq , 和 Set .除了性能问题之外,似乎还有一个 Seq是从整数到值的映射,以及 Set是从值到 bool 值的映射(如果值在集合中,则为 t
我想应用一个计算方法,如果键存在则增加值,否则将 1。有 Map map = new HashMap<>(); 我不明白为什么 for (int i = 0; i v != null ? v++ :
标准(IEEE 754/C)是否保证以下代码断言永远不会失败? int main() { for ( /* all possible float / double values */ )
代码由Vue语言编写,使用Element-ui框架, 如果一个对象包含某些内容,则会显示该内容,如果不包含则禁用菜单按钮。 输出应该是这样的: a、b(禁用)、c、d、e 但我的是这样的: a、a(禁
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
我将 Vue.js 与 Vuetify 一起使用,我正在尝试使用 v-data-table 从后端加载菜单列表并使用 对其设置一些权限v-switches 但我在尝试 v-model 数组时遇到问题:
我在 Java 的流式操作中努力维护我想要的数据结构,这很可能是由于缺乏正确的理解和实践。 public class Main { public static void main(String
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
所以我想知道为什么这个 v-if 和 v-else 语句不起作用,为什么我要以不同的方式解决它。 代码如下 Required: Select a Workflow {{ isChain ?
我有一个 VueJS 组件 ,我在同一个模板中使用了两次来显示两组不同的数据。每个都显示在自己的 使用 v-if 切换的容器在导航选项卡上。 似乎这些组件被实例化为同一个实例。我调用 console
我是一名优秀的程序员,十分优秀!