2016-08-11 26 views

Trả lời

6

Rõ ràng, Safari không có phương tiện nhận các giá trị được lưu trữ trong các đối tượng FormData tại thời điểm này. Không có cách giải quyết nào vào thời điểm này, và dường như nó không thực tế đối với polyfill.

Xin lỗi :(

Ghi chú: https://developer.mozilla.org/en-US/docs/Web/API/FormData/get#Browser_compatibility https://www.bountysource.com/issues/27573236-is-it-possible-to-polyfill-missing-formdata-methods

1

tôi giải quyết điều này bằng cách có điều kiện (nếu Safari là trình duyệt) lặp lại qua yếu tố tài sản của một thực tế dạng Đối với tất cả khác. Kết quả cuối cùng của hàm của tôi, trong cả hai trường hợp, là một đối tượng javascript đơn giản (JSON) có số lượng các cặp tên/giá trị.

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; 
} 

nơi IsSafariBrowser() được thực hiện bởi bất cứ điều gì phương pháp ưa thích của bạn, nhưng tôi đã chọn này:

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

Ví dụ sử dụng trong trường hợp OP của, giả sử rằng bạn có một hình thức thực tế gọi là CleanDataForm thay vì tạo một FormData từ đầu:

var cleanData=FormDataNameValuePairs('CleanDataForm'); 
alert(cleanData.test); 
Các vấn đề liên quan