不使用tauri-apps/plugin-opener插件,自定义配置打开url或路径,不需要权限校验

136 阅读1分钟

因为tauri-apps/plugin-opener这个查看需要配置权限,限制哪些窗口才可以单独打开url,挺烦的,看了底层的代码逻辑,其实完全可以通过自定义实现这个功能,还不需要权限校验。

直接添加open这个依赖库:

open依赖库地址:crates.io/crates/open

然后写一个command:

#[tauri::command]
pub async fn open_url(_: tauri::AppHandle, url: String) {
    open::that(url).unwrap();
}

最后在注入的js脚本中添加:

const { invoke } = window.__TAURI__.core

if ('__TAURI__' in window) {
    const hookClick = (e) => {
        const origin = e.target.closest('a')
        const isBaseTargetBlank = document.querySelector(
            'head base[target="_blank"]'
        )
        console.log('origin', origin, isBaseTargetBlank)
        invoke('open_url', { url: origin.href })
    }
    document.addEventListener('click', hookClick, { capture: true })
}

代码中的含义就是:

拦截url打开跳转的链接,然后调用open_url这个函数,就好了

传入的是文件夹或文件路径,就会使用系统默认的程序打开,传入的是url,就会使用默认的浏览器打开。

如果不想使用默认的浏览器打开,而是想在当前窗口打开,也可以配置:

const hookClick = (e) => {
    const origin = e.target.closest('a')
    const isBaseTargetBlank = document.querySelector(
        'head base[target="_blank"]'
    )
    console.log('origin', origin, isBaseTargetBlank)
    if (
        (origin && origin.href && origin.target === '_blank') ||
        (origin && origin.href && isBaseTargetBlank)
    ) {
        e.preventDefault()
        console.log('handle origin', origin)
        location.href = origin.href
    } else {
        console.log('not handle origin', origin)
    }
}

document.addEventListener('click', hookClick, { capture: true })