2012-09-02 45 views
3

我的應用程序動態構建HTML內容爲一個字符串,並在完成時將內容附加到DOM。然而,在WinJS中,當我嘗試將字符串附加到DOM時,會引發異常。爲了解決這些異常問題,我必須通過運行toStaticHTML來清理HTML,這是在WinJS以及Internet Explorer中全局定義的。我遇到的問題是data-* html5屬性有很多用處。一旦我將它們運行到靜態HTML,它們將被剝離。爲什麼toStaticHTML刪除data- *屬性?他們真正的安全問題是什麼?爲什麼toStaticHTML刪除data- *屬性

請注意,我無法在MSApp.execUnsafeLocalFunction中包裝DOM插入,因爲我正在使用jQuery,並且我不允許修改jQuery代碼。

var html = "<ul><li data-role='list-node'>My list node</li></ul>"; 
$('#container').html(toStaticHTML(html)); 

產地:

<ul> 
    <li>My list node</li> 
</ul> 
+0

'$( '#集裝箱')HTML(HTML)'不工作? 'html'無論如何是一個字符串... – Ridcully

回答

7

這是因爲有關插入HTML的隨機位到文檔中,並可能允許不安全的代碼到受保護的上下文中執行安全問題(您的應用程序,完全訪問WinRT和用戶文檔)。

toStaticHtml旨在保持在不斷變化的HTML /網絡模式的情況下,「安全」,從而它是一個白名單而非黑名單

鑑於你挑戰,你必須在這裏我看到了以下選項:

  • 包調用的jQuery在msExecUnsafeLocalFunction(見下文)。這意味着對於這個呼籲的生活,所有的Dom插入都會很好。這不需要更改jquery,只需要您的代碼。
  • 完全重寫Jquery在封面下使用的任何DOM調用msExecUnsafeLocalFunction
  • 將應用程序的安全上下文更改爲web上下文而不是本地上下文。這當然會讓你失去直接訪問WinRT的權限。您必須通過其他機制(I幀之間的消息或類似消息)進行操作
  • 使用WinJS.Binding.Template呈現您的內容而不是Jquery。這克隆了節點而不是將HTML編成字符串
  • 編寫自己的節點克隆器
  • 在插入安全節點後,使用setAttribute設置屬性。 msExecUnsafeLocalFunction的

實例:

+0

我相信我試圖在MSApp.execUnsafeLocalFunction中打包我的調用,但是我仍然遇到異常。我必須在星期一證實這一點。 –

+0

如果JQuery的工作是「延遲」,例如在實際設置之前執行已經交給瀏覽器,那麼可以解釋這一點。看看代碼,這似乎並沒有發生。更新以添加另一個選項。 –

+0

實際上jQuery應該在這種情況下使用它的延遲。實際上,有些情況下我只有在使用MS Promise時纔會出現錯誤,如果我沒有,那麼我不會收到任何錯誤,而是發出警告。我將在明天更新研究結果。 –

3

data-role -attribute這裏沒有列出:http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx

這是一個未知屬性,將被刪除。

+0

我仍然沒有看到爲什麼所有data-win- *屬性都是允許的,而其他data-*屬性是不允許的。其餘的安全問題是什麼? –

+1

嗯,我想*標準信息:這裏沒有適用的標準。* @ http://msdn.microsoft.com/en-us/library/windows/apps/hh466094.aspx給出了一個線索。 – KooiInc

+0

@Konstantin Dinev:不是「all」data-win - * - 允許的屬性,只有列出的。 –

相關問題