Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用React.js在Safari上的隐藏元素上触发.click()?_Javascript_Reactjs_Safari - Fatal编程技术网

Javascript 如何使用React.js在Safari上的隐藏元素上触发.click()?

Javascript 如何使用React.js在Safari上的隐藏元素上触发.click()?,javascript,reactjs,safari,Javascript,Reactjs,Safari,我在React.js中有一个按钮,单击该按钮可以将数据发送到服务器以转换为CSV文件。当我得到响应时,我希望能够让用户下载CSV文件。它适用于Firefox和Chrome,但不适用于Safari。有什么想法吗?我知道。上不支持单击() 这是我的密码: import React from 'react'; import { graphql } from 'react-apollo'; import ExportDataQL from 'ExportDataQL' import Icon from

我在React.js中有一个按钮,单击该按钮可以将数据发送到服务器以转换为CSV文件。当我得到响应时,我希望能够让用户下载CSV文件。它适用于Firefox和Chrome,但不适用于Safari。有什么想法吗?我知道。上不支持单击()

这是我的密码:

import React from 'react';
import { graphql } from 'react-apollo';

import ExportDataQL from 'ExportDataQL'
import Icon from 'Icon';

const handleExport = (data, type, exportToCSV) => {
  const variables = { 
    data: JSON.stringify(data),
    type
  }

  exportToCSV({ variables })
  .then( response => {
    const { fileName, fileUri } = response.data.exportToCSV

    var hiddenElement = document.createElement('a');
    hiddenElement.href = fileUri;
    hiddenElement.target = '_blank';
    hiddenElement.download = fileName;
    document.body.appendChild(hiddenElement);
    console.log('clicking')
    // hiddenElement.click();
    hiddenElement.dispatchEvent(new MouseEvent(`click`, {bubbles: true, cancelable: true, view: window}))
    hiddenElement.remove()
  })
  .catch( e => console.log('ERROR getting download URL:', e) )
}

const ExportToCSV = ({ data, dataType, buttonText, exportToCSV }) => {
  if (data === undefined || data.length===0) return <span></span>

  return <button
          type='button'
          className="btn btn-link hover_cursor font-weight-bold"
          onClick={() => handleExport(data, dataType, exportToCSV)}>
          <Icon IconClassName="fill-primary" icon='excel-file'/><span className="ml-2">
          {buttonText ? buttonText : "Export data"}</span>
        </button>
}


export default graphql(ExportDataQL.exportToCSV, {name: "exportToCSV"})(ExportToCSV);
从“React”导入React;
从'react apollo'导入{graphql};
从“ExportDataQL”导入ExportDataQL
从“图标”导入图标;
const handleExport=(数据、类型、exportToCSV)=>{
常量变量={
数据:JSON.stringify(数据),
类型
}
exportToCSV({variables})
。然后(响应=>{
const{fileName,fileUri}=response.data.exportToCSV
var hiddenElement=document.createElement('a');
hiddenElement.href=fileUri;
hiddenElement.target='_blank';
hiddenElement.download=文件名;
document.body.appendChild(hiddenElement);
console.log('单击')
//hiddenElement.click();
dispatchEvent(新的MouseEvent(`click`,{bubbles:true,cancelable:true,view:window}))
hiddenElement.remove()
})
.catch(e=>console.log('获取下载URL时出错:',e))
}
const ExportToCSV=({data,dataType,buttonText,ExportToCSV})=>{
if(data==undefined | | data.length==0)返回
return handleExport(数据、数据类型、exportToCSV)}>
{buttonText?buttonText:“导出数据”}
}
导出默认图形ql(ExportDataQL.exportToCSV,{name:“exportToCSV”})(exportToCSV);

获取响应后,下载是否应该是强制性的?我真的不明白为什么你想要一个隐藏的元素,你可以“点击”下载一个文件到客户端。似乎是一个不必要的黑客:)你已经尝试了CSS光标:“指针”修复了吗?这样,safari应该将其视为可单击的对象。@MstrQKN该按钮调用API来处理数据并返回CSV。我希望用户只需单击一次。我怎么能有一个按钮来调用API,然后自动下载CSV?这有意义吗?也许有更好的方法。