【问题标题】:How to load content of other html to div without losing css style?如何在不丢失css样式的情况下将其他html的内容加载到div?
【发布时间】:2016-12-10 02:19:02
【问题描述】:

我尝试将其他 html 内容加载到我的 div 中,但我发现我丢失了加载内容的样式。

我尝试使用以下代码:

.load()

$('#paymentsExecutiveExSum').load("summary/ExecutiveSummary/paymentsExecutiveSummary.html");

.get() & .append();

$.get("summary/ExecutiveSummary/paymentsExecutiveSummary.html",function(data){
    $("#paymentsExecutiveExSum").append(data);
});

我使用相同的代码:

<a data-role="button" class="fullWidth">Test</a>

Inspect Element 中的我的 CSS:

已加载(从其他html使用正常方式加载html)

未加载(我的情况,基本上不加载JQM按钮的css)

更新:

这是我的完整代码:

home.html

<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0" />
    <link rel="shortcut icon" href="images/favicon.png" />
    <link rel="apple-touch-icon" href="images/apple-touch-icon.png" />
    <link rel="stylesheet" href="css/my.css"/>
    <link rel="stylesheet" href="css/theme-addon.css"/>
    <link rel="stylesheet" href="js/jquery.mobile-1.3.1/jquery.mobile-1.3.1.css"/>

    <script src="js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script>
    <script>
        var jq = jQuery.noConflict();
        var animation = "none";

        Number.prototype.formatMoney = function(c, d, t){
            var n = this, 
                c = isNaN(c = Math.abs(c)) ? 2 : c, 
                d = d == undefined ? "." : d, 
                t = t == undefined ? "," : t, 
                s = n < 0 ? "-" : "", 
                i = parseInt(n = Math.abs(+n || 0).toFixed(c)) + "", 
                j = (j = i.length) > 3 ? j % 3 : 0;
            return s + (j ? i.substr(0, j) + t : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + t) + (c ? d + Math.abs(n - i).toFixed(c).slice(2) : "");
        };
    </script>
    <script src="js/jquery.mobile-1.3.1/jquery.mobile-1.3.1.min.js" type="text/javascript" charset="utf-8"></script>

</head>
<body onload="WL.Client.init({})" id="content" style='display: none' class="fullWidth">

    <div data-role="page" id="homePage">
        <div data-role="content">
            <a href="#" data-role="button" id="login" class="fullWidth">Log In</a>
        <script src="js/my.js" type="text/javascript" charset="utf-8"></script>
    </div>

    <script src="js/plugin/simplesplitview-1.0.js" type="text/javascript" charset="utf-8"></script>
    <script src="js/initOptions.js"></script>
    <script src="js/messages.js"></script>

</body>

my.js

$('#login').click(function(e){
    e.preventDefault();
    e.stopImmediatePropagation();

    jq.mobile.changePage("next.html", { transition: animation, changeHash: true });
});

那么,说到summary.html

<div data-role="header" data-position="fixed" data-tap-toggle="false">
    <button class="back" data-theme="a">Back</button>
    <div class="ui-title headerTitle">Summary</div>
</div>

<div data-role="content" id='splitviewcontainer' class='splitviewcontainer summary'>

    <div class='leftside'>
        <div id="executiveSummaryMenuGroupButton">
            <a id="paymentsExecutiveSummaryButton" data-role="button" class="executiveSummaryTitleMenuButton">Payments</a>
            <div class="horizontalDivider"></div>
        </div>
    </div>

    <div class='rightside' id='paymentsExSum'></div>    
</div>

<script src="js/summary.js"></script>

summary.js

$(function(){
    $('#executiveSummaryMenuGroupButton').hide();
    $('#splitviewcontainer').simplesplitview();
});

$('#paymentsExecutiveSummaryButton').click(function(e){
    $("#paymentsExSum").load("summary/ExecutiveSummary/paymentsExecutiveSummary.html").trigger('create'); //It seems it doesn't work
    $('#splitviewcontainer').simplesplitview('showRight', 'paymentsExSum', true);
});

在不丢失css样式的情况下,将其他html的内容加载到div的正确方法是什么?

【问题讨论】:

  • 确保你的类名没有深度嵌套
  • 你能解释一下吗?
  • 例如,如果您的 HTML 结构是 &lt;div class="a"&gt; &lt;div class="b"&gt; &lt;/div&gt;&lt;/div&gt; 并且您有类似 .a .b { somestyle } 的样式 .. 如果您移出 div.b 并在其他地方注入一些样式,显然样式不会是根据当前 CSS 样式应用的 case 仅在嵌套在 a 中时应用于 b
  • 嗨 Sushanth,谢谢你的解释,实际上 JQM 的 css 没有加载不是我的。请看我编辑的帖子。

标签: jquery css jquery-mobile


【解决方案1】:

解释:

您首先需要加载它们,然后手动触发页面增强。你并没有失去风格,你一开始就没有。 jQuery Mobile 在页面初始化期间增强内容,每个动态添加的内容都必须手动增强,阅读更多关于它here

$(document).on('pagebeforeshow', '#index', function(){ 
    $("#index").load("load.html", function() {
        $(this).trigger("pagecreate");
    });
});

您所需要的只是trigger("pagecreate");,它可以将页面标记增强为正确的 jQuery Mobile 外观。如果您只是附加到内容 DIV,请使用 trigger('create');,但这次是在内容 DIV 上。

工作示例:

index.html

<!DOCTYPE html>
<html>
    <head>
        <title>jQM Complex Demo</title>
        <meta http-equiv='Content-Type' content='text/html; charset=utf-8'/>
        <meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; minimum-scale=1.0; user-scalable=no; target-densityDpi=device-dpi"/>
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.css" />
        <script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.3.1/jquery.mobile-1.3.1.min.js"></script>    
        <script>
            $(document).on('pagebeforeshow', '#index', function(){ 
                $("#index").load("load.html", function() {
                    $(this).trigger("pagecreate");
                });
            });
        </script>
    </head>
    <body>
        <div data-role="page" id="index">

        </div>    
    </body>
</html>    

加载.html

<div data-theme="b" data-role="header">
    <h1>Index page</h1>
    <div data-role="navbar">
        <ul>
            <li><a href="#" class="ui-btn-active">One</a></li>
            <li><a href="#">Two</a></li>
            <li><a href="#">Three</a></li>
        </ul>
    </div><!-- /navbar -->  
</div>

<div data-role="content">
    <div data-role="navbar">
        <ul>
            <li><a href="#" class="ui-btn-active">One</a></li>
            <li><a href="#">Two</a></li>
            <li><a href="#">Three</a></li>
        </ul>
    </div><!-- /navbar -->  
</div>

【讨论】:

  • 对我也不起作用:(这很奇怪。我稍后会发布更多代码。
  • 当您谈论样式时,您是在谈论经典的 jQuery Mobile 样式还是您自己的自定义样式?
  • 让我检查一下并尽快回复您
  • 你也可以添加你的 HTML,我可以为你创建一个例子吗?我的示例正在运行,我不知道您是否尝试过,甚至查看过我发布的链接。您需要了解仅加载 HTML 是不够的,如果您有任何 jQuery Mobile 内容,则需要使用我在回答中提到的方法对其进行增强。如果您正在加载内容(与 jQUery Mobile 无关),则必须在加载内容之前初始化其 css。
  • 抱歉忘记发布我的代码。我将在 3 小时后发布。顺便说一句,我通过再次触发 pagecreate 来测试您的代码,但是,我正在使用另一个使用 worklight 的插件,据我测试,pagecreate、pageshow 及其朋友从未调用过。
【解决方案2】:

你可以同时使用它们,但是

$('#paymentsExecutiveExSum').load("summary/ExecutiveSummary/paymentsExecutiveSummary.html");

将用新的html替换所有以前的html并且

$.get("summary/ExecutiveSummary/paymentsExecutiveSummary.html",function(data){
    $("#paymentsExecutiveExSum").append(data);
});

会将新数据附加到之前的 html 中,但不会删除旧的。您也可以使用 .html 之类的

$.get("summary/ExecutiveSummary/paymentsExecutiveSummary.html",function(data){
    $("#paymentsExecutiveExSum").html(data);
});

这将用新数据替换旧数据

【讨论】:

  • 他们仍然失去了风格:(
  • @Rendy 对于新创建的 html 可能有不同的父级,因此需要考虑新的类和父级,还需要在 paymentExecutiveSummary.html 中包含 css 文件
  • 只是想知道,将 css 放在 html 上而不是放在顶部 html 中(例如 home.html)是一个好习惯吗?
  • 看他正在从另一个页面加载 html 数据,因此他还需要在该页面上包含 css ......同时在主页中加载 css 时不应用 css
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 2015-11-19
  • 2022-01-26
  • 2020-08-01
  • 2012-04-12
  • 2014-06-18
相关资源
最近更新 更多