Частичное обновление ядра mvc asp.net с помощью ajax не запускает функцию javascript для html-элементов частично - PullRequest
1 голос
/ 13 июня 2019

У меня есть приложение asp.net mvc core 2.2.На странице загружается партиал:

<div class="col-md-9" id="content">
    @await Html.PartialAsync("_TrainingContent")
</div>

партиал имеет модель и загружает видео с помощью проигрывателя video.js:

@model Partner2Train.Models.ModuleViewModels.TrainingContentViewModel

@if (Model != null)
{
    <li>Do some training stuff for @Model.ModuleId</li>
    <div class="row">
        <div id="instructions">
            <video id="my_video" class="video-js vjs-default-skin" width="640" height="267"
                   poster=''
                   data-setup='{ "aspectRatio":"640:267", "playbackRates": [0.5, 1, 2], "controls":true, "preload":"auto", "autoplay":false, "inactivityTimeout":0 }'>

                <source src="~/video/sample_video.mp4" type="video/mp4" />
                <source src="~/video/sample_video.webm" type="video/webm" />
                <source src="~/video/sample_video.ogv" type="video/ogg" />
                <p>Your browser does not support HTML5 video.</p>
            </video>
        </div>
    </div>

    <div class="row" style="margin-top:25px;">
        <div id="db_data">
            <label>Current video location: </label> <input type="text" id="watched_value" value="" disabled /><br />
            <label>Total video duration: </label> <input type="text" id="total_duration" value="" disabled />
        </div>
    </div>
    <br /><br />

}
else
{
    <text>Please select a module</text>
}

Если у меня есть функции javascript, которые модифицируют div и загружают видео, запускают документ, готово, видео загружается, и вы можете воспроизводить его.Однако, когда я обновляю партиал с помощью вызова ajax:

$("#tcontent").click(function () {
    $.ajax({
        url: "Module/TrainingContent/?id=2",
        type: "get",
        //data: $("form").serialize(), //if you need to post Model data, use this
        success: function (result) {
            $("#content").html(result);
        }
    });
})

Видео больше не загружается.Вызов ajax в конечном итоге вернет обновленную модель для отображения в частичном, другом видео, тексте и т. Д. Я предполагаю, что это не сработало, потому что ajax не запускает загрузку страницы, поэтому видео javascript не загружается снова.Поэтому я переместил видео javascript в функцию и вызвал ее при успешном вызове ajax:

$("#tcontent").click(function () {
    $.ajax({
        url: "Module/TrainingContent/?id=2",
        type: "get",
        //data: $("form").serialize(), //if you need to post Model data, use this
        success: function (result) {
            $("#content").html(result);
            vidprep();
            vidbutton();
        }
    });
})

Однако я получаю тот же результат, что он не загружает элементы управления.Функции запускаются, как я вижу некоторый отладочный текст в консоли, но не добавят элементы управления видео, просто показывая окно с неотформатированным первым кадром.

Если вы обновляете партиал с помощью ajax, как вы получаетеJavaScript, чтобы воздействовать на элементы в частичном?

Любая помощь будет высоко ценится, так как я застрял на этом пару дней.

Элементы после вызова ajax elements after ajax call

Вот две мои функции JS, которые работают, сообщения печатаются на консоль:

function vidprep() {

    console.log("In partial video function");
    // Stop if HTML5 video isn't supported
    if (!document.createElement('video').canPlayType) {
        $("#video_controls").hide();
        console.log("Can't Play Video");
        return;
    }

    var video = document.getElementById("my_video");

    // Play/Pause ============================//
    $("#play_button").bind("click", function () {
        video.play();
    });

    $("#pause_button").bind("click", function () {
        video.pause();
    });

    $("#play_toggle").bind("click", function () {
        if (video.paused) {
            video.play();
            $(this).html("Pause");
        } else {
            video.pause();
            $(this).html("Play");
        }
    });

    // Play Progress ============================//
    $(video).bind("timeupdate", function () {
        var timePercent = (this.currentTime / this.duration) * 100;
        $("#play_progress").css({ width: timePercent + "%" })
    });

    // Load Progress ============================//
    $(video).bind("progress", function () {
        updateLoadProgress();
    });
    $(video).bind("loadeddata", function () {
        updateLoadProgress();
    });
    $(video).bind("canplaythrough", function () {
        updateLoadProgress();
    });
    $(video).bind("playing", function () {
        updateLoadProgress();
    });

    function updateLoadProgress() {
        if (video.buffered.length > 0) {
            var percent = (video.buffered.end(0) / video.duration) * 100;
            $("#load_progress").css({ width: percent + "%" })
        }
    }

    // Time Display =============================//
    $(video).bind("timeupdate", function () {
        $("#current_time").html(formatTime(this.currentTime));
        $("#watched_value").val(formatTime(this.currentTime));
    });
    $(video).bind("durationchange", function () {
        $("#duration").html(formatTime(this.duration));
        $("#total_duration").val(formatTime(this.duration));
    });

    function formatTime(seconds) {
        var seconds = Math.round(seconds);
        var minutes = Math.floor(seconds / 60);
        // Remaining seconds
        seconds = Math.floor(seconds % 60);
        // Add leading Zeros
        minutes = (minutes >= 10) ? minutes : "0" + minutes;
        seconds = (seconds >= 10) ? seconds : "0" + seconds;
        return minutes + ":" + seconds;
    }
}

function vidbutton() {
    var $refreshButton = $('#refresh');
    var $results = $('#css_result');
    console.log("In video button");
    function refresh() {
        var css = $('style.cp-pen-styles').text();
        $results.html(css);
    }

    refresh();
    $refreshButton.click(refresh);

    // Select all the contents when clicked
    $results.click(function () {
        $(this).select();
    });
}

1 Ответ

0 голосов
/ 13 июня 2019

Включили ли вы файл js и отладку в браузере?

...