2012-10-30 37 views
3

我有這個Window Store應用程序,我想動態地添加一些標記,我的問題可以歸結爲:jQuery.append,類型輸入和Windows應用商店應用程序(HTML/CSS/JS)

工作

$('.some-element').append('<input type="radio"><label>Test</label>'); 

不工作

$('.some-element').append('<input type="radio" name="test"><label>Test</label>); 

的Visual Studio告訴我說:

JavaScript runtime error: Unable to add dynamic content. A script attempted to inject dynamic content, or elements previously modified dynamically, that might be unsafe. For example, using the innerHTML property to add script or malformed HTML will generate this exception. Use the toStaticHTML method to filter dynamic content, or explicitly create elements and attributes with a method such as createElement.

並指向行jQuery的追加執行:

append: function() { 
     return this.domManip(arguments, true, function(elem) { 
      if (this.nodeType === 1 || this.nodeType === 11) { 
       this.appendChild(elem); // Here! 
      } 
     }); 
    } 

有誰知道那裏有解決的辦法? (我需要jQuery,因爲我想使用JsRender作爲我的模板引擎)。

回答

2

您正在執行主機執行安全功能。當您從字符串創建元素時,Win8 HTML主機不喜歡它;在這種情況下,特別是在輸入元素上放置name =「」屬性時,它並不喜歡它。你能設置id而不是名字嗎?

請參閱http://msdn.microsoft.com/en-us/library/windows/apps/hh465388.aspx瞭解有關安全性的詳細信息。

錯誤消息居然給你兩個選擇,以解決該錯誤:

  1. 使用toStaticHTML的方法來過濾動態內容
  2. 明確創建的元素和屬性

使用toStaticHTML的會是什麼樣子這個:

$('.some-element').append(toStaticHTML('<input type="radio" name="test"><label>Test</label>')); 

但那樣會導致創建的HTML看起來可能與您傳入的字符串不同; toStaticHTML將刪除被認爲不安全的元素和屬性。

第二個選擇是直接使用DOM API而不是jQuery來創建有問題的元素,你已經說過這是一個不行。

還有第三種選擇,儘管它可能不會讓你穿過商店驗證過程:

MSApp.execUnsafeLocalFunction(function() { 
    $('.some-element').append('<input type="radio" name="test"><label>Test</label>'); 
}); 

這將暫時禁用不安全的HTML檢查。 不要做這個,除非你已經做了安全分析。特別是,不要從XHR獲取字符串並使用它創建DOM,這是獲取應用程序的邀請,以及用戶的機器pwnd。

+0

您好,感謝您的回答。在我的情況下,主要問題是我想使用JsRender進行模板化,並使用jQuery。所以我不直接使用jQuery,所以toStaticHTML並不是真正的選擇。我可以使用WinJS內置的模板,但這只是一種無法使用Windows Store應用程序的常規Web技術棧的觀點(我認爲) - 但是我想我會堅持使用它,或者只是輸入手動標記。再次感謝您的回覆,這非常有用 – mat

+0

您還有更多的選擇,您仍然可以繼續使用JsRender,儘管我在這裏猜測,因爲我不知道JsRender。首先,編輯您的渲染模板,以便不包括被視爲不安全的事物。另一種方法是將調用封裝到JMSRender的execUnsafeLocalFunction方法中 - 這將關閉對該調用堆棧持續時間的安全檢查。雖然如果JsRender稍後進行模板渲染(從綁定更新時,knockout.js存在此問題),但您將無法在不編輯源代碼的情況下使用execUnsafeLocalFunction。 –

+0

嗯,我真的不知道哪些事情被認爲是不安全的(所以接下來會遇到什麼問題?),在我的具體情況下,「名稱」屬性位於單選按鈕上,因爲我需要一個無線電組。如果我不能使用它,我必須自己編寫瀏覽器給出的功能(我並不真正感興趣)。 – mat

0

也許你可以使用

WinJS.Utilities.setInnerHTMLUnsafe(divName, '<input type="radio"><label>Test</label>');