2016-08-11 20 views
7

這是我的代碼。它適用於Firefox和Chrome,但不適用於Safari。我沒有得到任何錯誤。formData get()在Safari中似乎不起作用

<script> 
var cleanData = new FormData(); 
cleanData.append("test", "test"); 
alert(cleanData.get("test")); 
</script> 

有沒有人知道解決方法?

回答

1

我解決了這個通過有條件地(如果Safari是瀏覽器)通過元件進行迭代的實際形式屬性對於所有其他。瀏覽器,我的包裝只是迭代通過FormData條目()。在任何情況下,我的函數的最終結果是一個簡單的JavaScript對象(JSON),這相當於名稱/值對。

function FormDataNameValuePairs(FormName) 
{ 
    var FormDaytaObject={}; 
    var FormElement=$('#'+FormName).get(0); 

    if (IsSafariBrowser()) 
    { 
    var FormElementCollection=FormElement.elements; 
    //console.log('namedItem='+FormElementCollection.namedItem('KEY')); 
    var JQEle,EleType; 
    for (ele=0; (ele < FormElementCollection.length); ele++) 
    { 
     JQEle=$(FormElementCollection.item(ele)); 
     EleType=JQEle.attr('type'); 

     // https://github.com/jimmywarting/FormData/blob/master/FormData.js 
     if ((! JQEle.attr('name')) || 
      (((EleType == 'checkbox') || (EleType == 'radio')) && 
      (! JQEle.prop('checked')))) 
     continue; 
     FormDaytaObject[JQEle.attr('name')]=JQEle.val(); 
    } 
    } 
    else 
    { 
    var FormDayta=new FormData(FormElement); 
    for (var fld of FormDayta.entries()) 
     FormDaytaObject[fld[0]]=fld[1]; 
    } 

    return FormDaytaObject; 
} 

其中IsSafariBrowser()通過任何你喜歡的方法來實現,但我選擇了這個:

function IsSafariBrowser() 
{ 
    var VendorName=window.navigator.vendor; 
    return ((VendorName.indexOf('Apple') > -1) && 
      (window.navigator.userAgent.indexOf('Safari') > -1)); 
} 

用法示例在OP的情況下,假設你有一個名爲CleanDataForm一個實際的形式,而不是創建從頭開始的FormData:

var cleanData=FormDataNameValuePairs('CleanDataForm'); 
alert(cleanData.test);