Vue 2.6 在 Safari IOS 上无法正常工作

Posted

技术标签:

【中文标题】Vue 2.6 在 Safari IOS 上无法正常工作【英文标题】:Vue 2.6 not working correctly on Safari IOS 【发布时间】:2021-06-25 14:16:54 【问题描述】:

我有一个按钮,当被点击/按下时会在输入 type=file 上触发 click() 并允许用户要上传文件,它在每个平台上都可以正常工作,但有时我需要在打开上传窗口之前发出请求,当我需要发出请求时,它可以在除 Safari/IOS Safarai之外的所有平台上工作>,在 Safari 中发出了请求,我得到了响应,但没有触发输入 click()。

这是我的代码。

  async handleClickUpload(origin: string) 
    try 
      this._setDocumentType( origin );
      const  code: documentCode  = this.currentDocument;

      if (this._isDocumentBackVariant(documentCode)) 
        await this._variantBackDocumentHandler();
      
      this._handleUploadMethod();
     catch (e) 
      console.error(e);
    
  

在这里我提出请求并设置文档的变体,(在 Safari 上可以正常工作

  async _variantBackDocumentHandler() 
    const  variation  = await this.getSpecificDocument("cnh_rg_frente");

    console.error("Encontrou variação", variation);
    if (!variation) 
      this._setDocumentType( open: true );
      throw new Error("Variação não encontrada");
    
    this._setDocumentType( variation );
  

在此方法中,我选择是打开用户相机还是允许用户上传文件(在 Safari 上运行良好)。

  _handleUploadMethod() 
    const  origin = ""  = this.documentType;
    if (origin === "camera") 
      this.cameraController.open = true;
     else 
      this._uploadInputHandler();
    
  

在这里我触发了隐藏输入的点击,我已经控制了 const uploadInput 并且它获取了元素(即使在 safari 中)。在每个浏览器上,它都会触发 click() 并打开一个窗口来上传文件,但在 Safari 上没有任何反应

  _uploadInputHandler() 
    const uploadInput: htmlInputElement | null = document.querySelector("#uploadInput");

    uploadInput?.click();
  

这是我的意见

    <input
      id="uploadInput"
      @change="(event) => $emit('receiveFile', event)"
      type="file"
      style="visibility: hidden"
      accept="application/pdf, image/png, image/jpeg"
    />

这是我的 .browserlistrc

defaults
not IE 11
maintained node versions
last 10 ios_saf versions
last 10 safari versions

这是我的 babel.config.js

const plugins = () => 
  const defaultPlugins = [
    "@babel/plugin-proposal-optional-chaining",
    "@babel/plugin-proposal-throw-expressions",
    "@babel/plugin-syntax-throw-expressions",
    [
      "@babel/plugin-transform-runtime",
      
        absoluteRuntime: false,
        corejs: false,
        helpers: true,
        regenerator: true,
        useESModules: false,
      ,
    ],
  ];
  // if (process.env.NODE_ENV === "production") 
  //   defaultPlugins.push("transform-remove-console");
  // 
  return defaultPlugins;
;

module.exports = 
  presets: [
    [
      "@vue/cli-plugin-babel/preset",
      
        polyfills: [
          "es.array.iterator",
          "es.promise",
          "es.object.assign",
          "es.promise.finally",
          "es.symbol",
        ],
      ,
    ],
  ],
  plugins: plugins(),
;

我的 main.ts 上有这两个导入

import "core-js/stable";
import "regenerator-runtime/runtime";

该方法在每个浏览器上都可以正常工作,但是当我需要在 click() 之前发出请求时,IOS Safari 上没有任何反应,而在其他浏览器上它可以工作。

【问题讨论】:

【参考方案1】:

这是known issue。

Safari 以 security 的名义,不会在以下元素上注册 click 事件:

visibility: hidden; opacity: 0 display: none 或者不是“有效点击目标” - 这是他们一直在玩弄的一个松散概念,但例如,他们不认为没有href 属性的&lt;a&gt; 是有效点击目标。这意味着点击&lt;a href&gt; 有效,但点击&lt;a&gt; 无效。根据 Apple 标准,undefined href 增加了点击目标的有效性。

如果您希望用户能够单击“不可见”元素,请不要给该元素visibility: hidden。相反,将其不透明度更改为0.01

旁注:您的问题与 Vue 无关。它可以在 React、Angular 或普通 JS 中重现。您可能希望将标题更改为“Web 在 Safari IOS 中无法正常工作”

【讨论】:

以上是关于Vue 2.6 在 Safari IOS 上无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

iOS 14 的 Safari 浏览器将内置翻译功能,现在你就能用上

视频无法在Safari和iOS上运行

图像无法在 iOS 上的 Safari 上加载

带有自定义控件的视频无法在 iOS 上播放(Safari 和 Chrome)

相机无法在 iOS 上运行,getUserMedia 出错

pouchdb 无法在 ios Safari 上运行