栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

.NET C# Blazor 使用Viewer.js完成图片的大图查看

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

.NET C# Blazor 使用Viewer.js完成图片的大图查看

效果图

环境

.NET 6

代码 _Layout.cshtml

通过CDN引入插件


 
 
 
 
Init.js

编写js代码

我使用的 BootstrapBlazor 模版,有多页签(tabs)的功能,实现原理是 display: none,
dom中会同时存在所有页面的内容和图片,
也会同时存在多个div id = "imgBox"的dom,众所周知,id是不能重复的,
无法获取到第二个页面的div,新页面中的图片也就没有效果了,
所以不能用id去获取dom, 改用 name,获取后遍历一下,添加一个属性,去判断是否处理过了,
不让程序无意义的重复处理,让程序更牛逼一些,
…
如果是 Razor Page 或者 MVC,这种跳转页面每次都从服务端拿页面,
整个Dom中只存在一个页面的dom内容,
可以在JS页面加载完成事件中调用初始化,
div用 id = "imgBox",JS 一行代码即可 new Viewer(document.getElementById('imgBox'));
…
在React这种框架中会用到destroy

// Blaozr调用这个方法
function Init()
{
	// 初始化图片,根据自己的需求添加
    InitImg();
    
    // !!本文的核心方法!!
    InitViewer();
}

function InitImg() {   

    //修改图片宽高和居中
    let imgList = document.querySelectorAll("img");

    let attrName = "img-init";

    console.log("图片数量:" + imgList.length);

    for (let item of imgList) {

        if (item.getAttribute(attrName) == "true") {
            // console.log("img标签已经初始化,跳过")
            continue;
        }
        item.style.width = "200px";
        item.style.height = "100px";
        item.parentElement.style.textAlign = "center";

        // 处理过后,添加属性,下次直接跳过
        item.setAttribute(attrName, "true")
    }
}

let viewerArr = [];

function InitViewer() {
    // 获取所有 name="imgBox" 的dom
    let domList = document.getElementsByName('imgBox')

    let attrName = "viewer-init";

    for (let item of domList) {
        
        // 获取dom标签的属性
        if (item.getAttribute(attrName) == "true") {
            // console.log("imgBox标签已经初始化,跳过")
            continue;
        }

        // 初始化 Viewer
        viewerArr.push(new Viewer(item));

        // 处理过后,添加属性,下次直接跳过
        item.setAttribute(attrName, "true")
    }
}

// 销毁所有 Viewer 对象  (Blaozr暂时没发现destroy的应用场景,在React这种框架中会用到destroy)
function DestoryViewer() {
    if (viewerArr.length > 0) {
        // console.log(viewerArr);
        for (let item of viewerArr) {
            item.destroy()
        }
    }
}
Content.razor

给包裹内容的div加上 name = “imgBox”

Content.razor.cs
[Inject]
private IJSRuntime _jsRuntime { get; set; }

protected override async Task OnAfterRenderAsync(bool firstRender)
{
	// 调用js中的方法                
    await _jsRuntime.InvokeVoidAsync("Init");
}
Github

https://github.com/xxxxue/BlazorJiangBlog

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984885.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号