JQuery 和 frame(set) - 为什么它们会消失

JQuery and frame(set)s - why do they disappear?

本文关键字:为什么 消失 frame set JQuery      更新时间:2023-09-26

当我使用控制台并尝试使用标记框架集创建元素时,我没有得到任何结果:

$('<div id="content" data-something="hello" />')
=> [<div id=​"content" data-something=​"hello">​</div>​]
$('<frameset frameborder="0" framespacing="0" marginwidth="0" marginheight="0" framespacing="0" border="0"></frameset>')
=> []

此行为在多个 JQuery 版本(如 1.10.2、2.0.0 和 1.2.6 等)中仍然存在。

如何从此框架集中读取"frameborder"(例如)属性,而无需自己构建解析器?

附言(如果你想知道我为什么使用框架)这一行(或像这样的一行)是来自外部(或多或少)API 的响应,我无法更改。我只想阅读信息并继续。

frameset 标记将用作框架文档的正文,以代替body标记,并与frameset文档类型声明结合使用。自HTML5以来,它被认为是过时的。


要解决您的问题,最好的办法是自行解析字符串中所需的部分,或使用 HTML 解析库(如 htmlparser.js

框架集元素上的属性不是有效的 HTML,因此 jQuery 不会创建它。如果你把它们拿出来,它会起作用。然后,您可以使用 .attr 一次添加一个属性。

var x = $('<frameset></frameset>');
x.attr('frameborder', '0');
x.attr('framespacing', '0');
x.attr('border', '0');  

但是,创建元素的添加代码和资源成本并不仅仅是为了在字符串中查找属性值。您可以使用 match 方法找到您要查找的子字符串,如下所示:

var frameborder = '<frameset frameborder="0" border="0"></frameset>'.match(/frameborder="(.+?)"/)[1]

只需将正则表达式中的"frameborder"替换为另一个属性的名称即可获取其值。简单。

我使用了一个解决方法:

var sourceWithFrames = ...
sourceWithFrames = sourceWithFrames.replace(/<frame/g, '<xyzFrame')
// e.g. 
var frameborder = $(sourceWithFrames).find('xyzFrameset').attr('frameborder')
// and so on

在我看来,这是解决这个问题的最好方法(也可能是唯一一种方法......