在运行时更改<html>标签的属性有什么方法吗?

4
我希望您能在运行时添加清单属性,这样我就可以控制Appcache何时下载。
例如:当用户正确登录应用程序时,
<html>
// page content
</html>

变成:

<html manifest="myapp.manifest">
// page content
</html>

有没有用JavaScript、jQuery或其他方法实现这个功能的方式?我的需求是有条件地控制Appcache何时下载(我已经了解了在iFrame中使用另一个HTML的方法)。
6个回答

9

根据规范, 文档加载后更改manifest属性无效。

您仍然可以通过document.documentElement:访问html元素并更改属性值。

document.documentElement.setAttribute('manifest', 'myapp.manifest');

它就是什么都不做。


2
问题是,这有关系吗?Appcache清单文件告诉浏览器要缓存什么,我不确定在页面加载后添加对该文件的引用是否会以任何方式影响浏览器缓存,我认为它不会,而且清单文件只会在页面加载时加载,但从未测试过。无论如何,+1,这确实添加了所要求的属性! - adeneo
1
@adeneo:当我说我不知道它是否有任何影响时,这就是我的意思。你表达得更好 :) 老实说,我现在太懒了,不想测试它。 - Felix Kling
@FelixKling 我真的很感兴趣为什么attr起作用而prop却不起作用?http://jsfiddle.net/YY4BL/2/ - Bhojendra Rauniyar
1
@C-link:首先,因为属性选择器不考虑属性,其次是因为HTMLHTMLElements根本没有这样的属性。 - Felix Kling
@C-link - 就像Felix所说,浏览器通常会读取HTML并创建DOM,其中对象是根据HTML和浏览器默认值创建的,并设置属性。换句话说,如果HTML标签本身没有manifest属性,稍后添加一个也没有用,因为浏览器不会读取它,浏览器读取的是HTML以及添加到HTML元素的属性。 - adeneo

3
您可以使用.attr()

获取匹配元素集合中第一个元素的属性值,或为每个匹配元素设置一个或多个属性。

$('html').attr('manifest','myapp.manifest');

2
将英文句子翻译成中文:

可以使用常规方法向元素添加属性,例如:

document.documentElement.setAttribute('manifest', 'foo.appcache');

(如@FelixKing在评论中指出的那样,按照规范分配给document.documentElement.manifest是不起作用的,因为manifest在DOM中没有定义。这个问题最初让我误导了Chrome的行为。)
然而,这没有任何影响。HTML5 CR :“manifest属性仅在文档加载的早期阶段有效。因此动态更改属性无效(因此,没有为此属性提供DOM API)。 ”
(好吧,它有存在的效果,所以您可以在样式中使用属性、检索属性值等。但没有任何会导致应用程序缓存操作的东西。)

关于属性处理的发现不错。但无论如何,HTMLHTMLElement没有manifest属性,因此这也不是正确的设置方式。 - Felix Kling

1

试试这个:

document.documentElement.setAttribute('manifest', 'myapp.manifest');

来自文档:

document.documentElement

返回文档的根元素(例如,HTML文档的 元素)。


0

可能无法有效地添加清单属性,但可能可以将其删除,从而可以实现相同的结果。

要禁用应用程序缓存,我使用以下方法:

window.console.warn('removing appcache');
window.document.documentElement.removeAttribute('manifest');

请注意,这可能并不总是有效!


0

尝试使用jQuery。

$('html').attr('manifest', 'myapp.manifest');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接