Blazor Webassembly 中的 JavaScript 免费引导轮播

Posted

技术标签:

【中文标题】Blazor Webassembly 中的 JavaScript 免费引导轮播【英文标题】:JavaScript free Bootstrap Carousel in Blazor Webassembly 【发布时间】:2021-07-08 08:28:49 【问题描述】:

我是 Blazor 的新手。

我在 .NET 5 的 Blazor Webassembly 项目中创建了一个轮播。它不会自动滑动,并且它的上一个和下一个按钮不起作用。

请建议如何在没有 javascript 的情况下解决它。

下面是我的代码。

<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
    <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="active"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2"></li>
    </ol>
    <div class="carousel-inner">
        <div class="carousel-item active">
            <img class="d-block w-100" src="/images/slide/slide-1.jpg" >
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="/images/slide/slide-2.jpg" >
        </div>
        <div class="carousel-item">
            <img class="d-block w-100" src="/images/slide/slide-3.jpg" >
        </div>
    </div>
    <a class="carousel-control-prev" href="#carouselExampleIndicators" role="button" data-slide="prev">
        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </a>
    <a class="carousel-control-next" href="#carouselExampleIndicators" role="button" data-slide="next">
        <span class="carousel-control-next-icon" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </a>
</div>

PS:我正在使用由 VS 2019 和 .NET 5 生成的默认项目模板,并且没有包含任何额外的 javascript 文件。

【问题讨论】:

也许这可以帮助你:***.com/questions/56513221/… @JasonD 感谢您的评论。我看到了这个链接,它需要 javascript,但我需要没有 javascript 的解决方案,并且已经在问题陈述中提到它。 引导轮播需要 javascript。如果您不想使用 javascript,则应考虑专门为 Blazor 设计的其他组件。这是一个这样的例子:blazorstrap.io/carousels 【参考方案1】:

经过广泛的研究,现在我可以在没有 javascript 的情况下在 blazor 中自动滚动轮播。我还让 prev 和 next 按钮工作并添加了功能:当用户单击 prev 或 next 时,它会进入手动模式并自动停止滚动。以下是我的解决方案:

@page "/"
@using System.Threading;

<div id="carouselExampleIndicators" class="carousel slide" data-ride="carousel">
    <ol class="carousel-indicators">
        <li data-target="#carouselExampleIndicators" data-slide-to="0" class="@firstSlideCss"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="1" class="@secondSlideCss"></li>
        <li data-target="#carouselExampleIndicators" data-slide-to="2" class="@thirdSlideCss"></li>
    </ol>
    <div class="carousel-inner">
        <div class="carousel-item @firstSlideCss">
            <img class="d-block w-100" src="/images/slide/slide-1.jpg" >
        </div>
        <div class="carousel-item @secondSlideCss">
            <img class="d-block w-100" src="/images/slide/slide-2.jpg" >
        </div>
        <div class="carousel-item @thirdSlideCss">
            <img class="d-block w-100" src="/images/slide/slide-3.jpg" >
        </div>
    </div>
    <a class="carousel-control-prev" href="" role="button" data-slide="prev" @onclick="()=>Manually(true)">
        <span class="carousel-control-prev-icon" aria-hidden="true"></span>
        <span class="sr-only">Previous</span>
    </a>
    <a class="carousel-control-next" href="" role="button" data-slide="next" @onclick="()=>Manually(false)">
        <span class="carousel-control-next-icon" aria-hidden="true"></span>
        <span class="sr-only">Next</span>
    </a>
</div>

@code
    string firstSlideCss = "active";
    string secondSlideCss = "";
    string thirdSlideCss = "";

    int currentPosition = 0;
    int currentSlide = 0;

    CancellationTokenSource cts;
    CancellationToken ct;

    protected override async Task OnInitializedAsync()
    
        cts = new CancellationTokenSource();
        ct = cts.Token;
        await Walkthrough(ct);
    

    public async Task Walkthrough(CancellationToken ct)
    
        while (!ct.IsCancellationRequested)
        
            await Task.Delay(2500, ct);
            currentPosition++;
            ChangeSlide();
            await InvokeAsync(() => this.StateHasChanged());
        
    

    public void Manually(bool backwards)
    
        cts.Cancel();

        if (backwards)
            currentPosition--;
        else
            currentPosition++;

        ChangeSlide();
    

    private void ChangeSlide()
    
        currentSlide = Math.Abs(currentPosition % 3);

        switch (currentSlide)
        
            case 0:
                firstSlideCss = "active";
                secondSlideCss = "";
                thirdSlideCss = "";
                break;
            case 1:
                firstSlideCss = "";
                secondSlideCss = "active";
                thirdSlideCss = "";
                break;
            case 2:
                firstSlideCss = "";
                secondSlideCss = "";
                thirdSlideCss = "active";
                break;
            default:
                break;
        
    

【讨论】:

以上是关于Blazor Webassembly 中的 JavaScript 免费引导轮播的主要内容,如果未能解决你的问题,请参考以下文章

Angular 项目中的 Blazor webassembly

Blazor WebAssembly + Grpc Web = 未来?

Blazor WebAssembly 3.2 正式发布

重定向到 Blazor WebAssembly 中的 403 禁止组件

TypeError:Blazor webassembly 解决方案中的 FailedToFetch

如何从 Blazor WebAssembly 中的 Razor 页面访问 body 标签或其他标签?