formData get()似乎在Safari中不起作用

时间:2016-08-11 13:30:03

标签: safari

这是我的代码。它适用于Firefox和Chrome,但不适用于Safari。我没有错。

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

有没有人知道解决方法?

1 个答案:

答案 0 :(得分: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);