簡體   English   中英

部分視圖和jQuery圖形問題

[英]Partial View and jQuery graph issues

我繼承了一個項目,關於UI方面非常環保。 該項目在Chrome上使用Bootstrap,nvd3和flot。 有一個布局視圖,其中引用了jQuery,然后在布局主體中呈現了每個頁面的部分視圖。 在儀表板頁面上,除非腳本中再次引用jQuery,否則不會顯示圖形,但是該引用會導致側邊欄停止工作。 可以在儀表板腳本中復制引用緩動,以同時顯示圖形和側邊欄,但是一個圖形仍無法正常工作。 這使我相信jQuery及其庫在布局和局部視圖上被多次引用,清除了顯示圖形,激活側邊欄,正確呈現圖形的引用等。

如果這是正確的,是否有一種方法可以跟蹤每個jQuery參考? 我嘗試通過視覺刪除源代碼中的多個引用,將布局引用移至HTML正文中,測試通過Chrome開發者工具所遭受的打擊,如上所述將這些引用作為創可貼進行調用,並在此處搜索類似問題,但似乎無法同時實現正確的外觀和功能。 另外,共享相同父布局的不同局部視圖上的重復jQuery引用是否可以使其他任何局部視圖中的引用無效? 請認為如果這里沒有考慮其他可能的解決方案,因為我最終正在嘗試使側邊欄和圖形正常工作。 在此先感謝您的關注。

這是帶有參考的布局:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>@ViewBag.Title</title>
    <meta name="viewport" content="initial-scale=1.0,maximum-scale=1.0,user-scalable=no">

    <link rel="shortcut icon" href="/favicon.ico" />

    @Styles.Render("~/Content/css")
    @Styles.Render("~/Content/icons")

    @Scripts.Render("~/bundles/modernizr")

    @RenderSection("headcontent", required: false)

    <!-- page specific stylesheets -->
    <!-- nvd3 charts -->
    <link rel="stylesheet" href="/Content/lib/novus-nvd3/nv.d3.min.css">
    <!-- owl carousel -->
    <link rel="stylesheet" href="/Content/lib/owl-carousel/owl.carousel.css">

    <!-- google webfonts -->
    <link href='http://fonts.googleapis.com/css?family=Source+Sans+Pro:400&amp;subset=latin-ext,latin' rel='stylesheet' type='text/css'>

    <!-- datepicker -->
    <link rel="stylesheet" href="/Content/lib/bootstrap-datepicker/css/datepicker3.css">
    <!-- date range picker -->
    <link rel="stylesheet" href="/Content/lib/bootstrap-daterangepicker/daterangepicker-bs3.css">
    <!-- timepicker -->
    <link rel="stylesheet" href="/Content/lib/bootstrap-timepicker/css/bootstrap-timepicker.min.css">
    <!-- ion.rangeSlider -->
    <link rel="stylesheet" href="/Content/lib/ion.rangeSlider/css/ion.rangeSlider.css">
    <!-- bootstrap switches -->
    <link href="/Content/lib/bootstrap-switch/build/css/bootstrap3/bootstrap-switch.css" rel="stylesheet">
    <!-- 2col multiselect -->
    <link href="/Content/lib/multi-select/css/multi-select.css" rel="stylesheet">
    <!-- multiselect, tagging -->
    <link rel="stylesheet" href="/Content/lib/select2/select2.css">

    <!-- main stylesheet -->
    <link href="/Content/css/style.css" rel="stylesheet" media="screen">

    <!-- moment.js (date library) -->
    <script src="/Content/lib/moment-js/moment.min.js"></script>


    [styles omitted...]

</head>
<body>
    [header omitted...]

    <!-- main content -->
    <div id="main_wrapper">

        [messages omitted...]

        @RenderBody()
    </div>

    <!-- side navigation -->
    <nav id="side_nav">
        @Html.Partial("~/Views/Shared/_SidebarLeft.cshtml")
    </nav>

    <!-- jQuery -->
    <script src="/Content/js/jquery.min.js"></script>
    <!-- easing -->
    <script src="/Content/js/jquery.easing.1.3.min.js"></script>
    <!-- bootstrap js plugins -->
    <script src="/Content/bootstrap/js/bootstrap.min.js"></script>
    <!-- top dropdown navigation -->
    <script src="/Content/js/tinynav.js"></script>
    <!-- perfect scrollbar -->
    <script src="/Content/lib/perfect-scrollbar/min/perfect-scrollbar-0.4.8.with-mousewheel.min.js"></script>

    <!-- common functions -->
    <script src="/Content/js/tisa_common.js"></script>

    @RenderSection("Scripts", required: false)

</body>
</html>

這是儀表板的HTML:

@using Project.Models
@model DashboardViewModel
@{
    ViewBag.Title = "Home Page";

    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="container-fluid">
    <div class="row">
        <div class="col-md-12">
            <div class="panel panel-default">
                <div class="heading_b">Prices Chart</div>
                <div class="panel-body">
                    <div id="nvd3_cumulativeLine" style="width: 100%; height: 300px">
                        <svg></svg>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

最后,這是儀表板腳本,其中刪除了jQuery,導致圖表消失,刪除了緩動,導致側欄停止彈出,並且刪除了兩者,導致圖表消失,但側欄功能保持不變。

@section Scripts{
    <!-- page specific plugins -->

    <!-- jQuery DUPLICATE -->
    <script src="/Content/js/jquery.min.js"></script>
    <!-- easing DUPLICATE -->
    <script src="/Content/js/jquery.easing.1.3.min.js"></script>

    <!-- nvd3 charts -->
    <script src="/Content/lib/d3/d3.min.js"></script>
    <script src="/Content/lib/novus-nvd3/nv.d3.min.js"></script>
    <!-- flot charts-->
    <script src="/Content/lib/flot/jquery.flot.min.js"></script>
    <script src="/Content/lib/flot/jquery.flot.pie.min.js"></script>
    <script src="/Content/lib/flot/jquery.flot.resize.min.js"></script>
    <script src="/Content/lib/flot/jquery.flot.tooltip.min.js"></script>
    <!-- clndr -->
    <script src="/Content/lib/underscore-js/underscore-min.js"></script>
    <script src="/Content/lib/CLNDR/src/clndr.js"></script>
    <!-- easy pie chart -->
    <script src="/Content/lib/easy-pie-chart/dist/jquery.easypiechart.min.js"></script>
    <!-- owl carousel -->
    <script src="/Content/lib/owl-carousel/owl.carousel.min.js"></script>

    <!-- dashboard graph functions -->
    <script src="/Content/js/apps/tisa_dashboard.js"></script>

    <script type="text/javascript">
        function cumulativeTestData() {
            var closes = JSON.parse('@Html.Raw(Json.Encode(Model.Coordinates))')
            return [
                {
                    key: "Prices",
                    values: closes
                },
            ];
        }
    </script>
}

您認為在多次加載同一腳本時存在沖突是正確的。 每個腳本僅加載一次。

我可以看到為什么嘗試從部分視圖中刪除那些腳本導致您的部分視圖失敗的原因。 直到局部視圖之后,您才加載腳本。 在部分視圖中的所有內容都已加載並執行之后,它們才存在。

在布局中,將腳本移至標題(首選)或至少移至某個位置,然后再拉入局部視圖。 然后在您的局部視圖中,確保沒有對已加載腳本的引用。

在局部視圖中,我經常使用腳本爭用程序來加載可能已動態加載或未動態加載的腳本。 您可以使用以下方法來嘗試加載腳本。 它檢查是否已經在頁面上(特別是在標題標記中)加載了具有相同名稱的腳本,如果已經加載,則不會嘗試再次加載它。 它不是最漂亮的,但是可以完成工作。

mycode = function()
{

    //Put all your custom javascript here.
    //This will run when the scripts below have successfully been processed.

}
var headTag = document.getElementsByTagName("head")[0];
var initialScripts = ["/scripts/jquery-2.1.4.min.js",
                        "/scripts/jquery-ui.min.js",
                        "/scripts/jquery.timepicker.min.js"];
var neededScripts = [];
for (var z = 0; z < initialScripts.length; z++) {
    if (!isScriptLoaded(initialScripts[z]))
        neededScripts.push(initialScripts[z]);
}
if(neededScripts.length)
    addScripts(neededScripts, headTag, function () { mycode(); delete mycode; }, 0);
else {
    mycode(); delete mycode;
}
function addScripts(scriptsToLoad, loadTag, callback, i) {
    if (i >= scriptsToLoad.length)
        return;
    var script = scriptsToLoad[i];
    var scriptTag = document.createElement('script');
    scriptTag.setAttribute('type', 'text/javascript');
    scriptTag.setAttribute('src', script);
    if (i >= (scriptsToLoad.length - 1)) {
        scriptTag.onload = callback;
    }
    else {
        scriptTag.onload = function () {
            console.log("Added script file " + script);
            addScripts(scriptsToLoad, loadTag, callback, i + 1);
        }
    }
    loadTag.appendChild(scriptTag);
}

function isScriptLoaded(url) {
    var tags = document.getElementsByTagName('script');
    for (var i = tags.length; i--;) {
        var existingName = tags[i].src.split('/');
        existingName = existingName[existingName.length-1];

        var newName = url.split('/');
        newName = newName[newName.length-1];

        if (existingName == newName) return true;
    }
    return false;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM