2014-03-27 30 views
4

我想在運行時添加清單屬性,所以我可以控制什麼時候Appcache將被下載。無論如何要在運行時更改<html>標記的屬性嗎?

例如:當用戶登錄到應用程序正確,

<html> 
// page content 
</html> 

變爲:

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

反正我有可以使用JavaScript和jQuery或任何實現這一目標?我想要控制什麼時候Appcache將被有條件地下載(我已經閱讀過關於在iFrame內部具有另一個html)。

回答

9

According to the specification,在文檔加載後更改manifest屬性無效。

,您仍然可以訪問html元素和更改屬性值,通過document.documentElement:

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

它只是不會做任何事情。

+2

問題是,它有關係嗎? appcache清單文件告訴瀏覽器要緩存什麼,並且我不確定在頁面加載後添加對該文件的引用會以任何方式影響瀏覽器緩存,我可能認爲它不會,並且清單文件只在頁面加載時加載,但從未測試過。無論如何,+1,這確實添加了屬性,正如所要求的! – adeneo

+0

@adeneo檢查這個小提琴,以更好地理解http://jsfiddle.net/YY4BL/ –

+1

@ adeneo:這就是我說我不知道​​它是否有任何作用。你說得更好:)老實說,我現在懶得去測試它。 –

1

嘗試這種情況:

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

docs

document.documentElement中

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

3

您可以使用.attr()

獲取屬性的值的第一個元素集合中的 匹配的元素,也可以爲每個匹配 元素的一個或多個屬性。

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

+1屬性的作品,但道具不是http://jsfiddle.net/YY4BL/2/ –

0

的jQuery試試這個。

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

可以使用例如向元素添加屬性的常規方式。

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

(如@FelixKing在評論中指出,分配給document.documentElement.manifest不工作,由規範,因爲manifest沒有在DOM定義。我是第一次使用Chrome的在這個問題上的行爲誤導。)

但是,這不起作用。 HTML5 CR says:「清單屬性僅在文檔加載的早期階段才起作用。動態更改屬性因此不起作用(因此,沒有爲此屬性提供DOM API)。」

(當然,它有身臨其境的效果,所以你可以使用樣式屬性,檢索屬性值等,但沒有什麼會導致應用程序緩存操作。)

+0

尼斯發現有關該屬性的處理。但無論哪種方式,HTMLHTMLElement沒有'manifest'屬性,所以這不是正確的設置方法。 –

0

它可能不是可能有效地添加清單屬性,但它可能可以刪除它,並由此可能會達到相同的結果。

要禁用應用程序緩存,我用這個:

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

請小心,這可能並不總是可行的!