使用jQuery添加CSS文件

68

我正在创建一个弹出窗口并希望向该弹出窗口添加CSS文件。下面是弹出窗口的代码。我有一个JavaScript可以创建一个弹出窗口。

<a href="popupwindowcontent.xhtml" title="Print" class="popupwindow">Print1</a>

现在我想将一个CSS文件添加到这个弹出窗口中。我尝试了以下代码:

$('.popupwindow').append('<link rel="stylesheet" href="css/style2.css" type="text/css" />');


 $('head').append('<link rel="stylesheet" href="css/style2.css" type="text/css" />');

但是它不起作用。


除非您使用了我不熟悉的某种插件或技术,否则您无法通过在“a”上使用“rel”属性来指定弹出窗口的大小。 - sdleihssirhc
Yup rel 只是一个打字错误,弹出窗口的高度和宽度是从 JavaScript 中获取的。 - Jay
您可以使用灰色的[编辑]链接编辑您的问题以修复拼写错误。 - 700 Software
你必须在将<link>添加到<head>后设置href属性,否则它在不同的浏览器中无法正常工作。 - ekerner
8个回答

164
$('head').append('<link rel="stylesheet" href="style2.css" type="text/css" />');

这应该可以起作用。


我正在使用这个弹出窗口 https://github.com/rip747/popupwindow ,你可以创建一个本地的 .xhtml 文件并将其链接到任何示例中,然后尝试更改弹出窗口的样式。如果可以,请告诉我。该网站位于我们的本地服务器上,因此外部人员无法访问它。 - Jay
它应用于文件的样式,我只想将CSS应用于弹出窗口。 - Jay
这个方法对<script>标签也适用吗?我尝试使用相同的方法,只是将link替换为script。但是它并没有起作用。 - ChickenWing24
2
值得注意的是,这似乎不允许在CSS中通常应用的“级联规则”的常规级别。如果在两个样式表中使用相同的选择器,则会采用先前通过链接标记正常输入的规则,而不是新注入的样式表中更靠下的规则。我不确定为什么,甚至是否在所有浏览器中都会这样做。因此...计划在辅助样式表中使用更具体的选择器。 :) - user1816910

16

这是我使用jQuery ajax添加CSS的方法。希望能对某些人有所帮助。

$.ajax({
            url:"site/test/style.css",
            success:function(data){
                 $("<style></style>").appendTo("head").html(data);
            }
        })

14
    var css_link = $("<link>", {
        rel: "stylesheet",
        type: "text/css",
        href: "yourcustomaddress/bundles/andreistatistics/css/like.css"
    });
    css_link.appendTo('head');

6

这只是我的个人见解……有时候确认没有重复是很重要的,所以我们在工具库中有下面这个函数:

jQuery.loadCSS = function(url) {
    if (!$('link[href="' + url + '"]').length)
        $('head').append('<link rel="stylesheet" type="text/css" href="' + url + '">');
}

使用方法:

$.loadCSS('css/style2.css');

loadCSS 可以通过向 URL 添加或不添加时间戳查询参数来告知是否从缓存中加载 CSS 文件。 - Stephan

2
尝试换个方式做。
$('<link rel="stylesheet" href="css/style2.css" type="text/css" />').appendTo('head');

你是用什么来调用弹出窗口的?是window.open还是JavaScript弹出窗口? - Mark Costello
哦,那么只需在加载页面时添加CSS文件,然后在CSS文件中为弹出窗口设置样式即可。 - Mark Costello
但是弹出窗口和当前页面是同一页。 - Jay
那么,你可以通过使用类来为页面上的元素和弹出窗口设置不同的样式。 - Mark Costello
这就是我正在尝试做的事情。 - Jay
显示剩余3条评论

1

你的问题在于你的选择器是用于锚点元素<a>。你把<a>标签看作代表页面,但实际上并非如此。

$('head')只要这个选择器是由需要css的页面执行,就可以工作。

为什么不直接将css文件添加到相关页面呢?有任何特殊原因需要从另一个页面动态尝试这样做吗?我甚至不熟悉可以像这样注入css到远程页面的方法...感觉会是一个重大安全漏洞。

对你的推理进行补充:

那么你应该简单地传递一个参数给页面,使用javascript读取它,然后根据参数执行必要的操作。


@Jay 我认为发生这种情况的原因是你在预览页面上也执行了那段代码?我非常怀疑仅通过在父页面调用它就会将其注入到两个页面中。 - Matthew Cox
你有什么链接可以帮助我吗?我不确定如何将参数传递到页面。谢谢。 - Jay
@Jay,你在用什么编程语言?是服务器端语言吗?还是只使用HTML和JQuery? - Matthew Cox
@Jay 这个页面popupwindowcontent.xhtml...仅用于打印预览吗?直接添加CSS文件会有问题吗? - Matthew Cox
在预览中,我使用相同的文件,只是通过 CSS 文件修改结构。 - Jay
显示剩余2条评论

0

你尝试过使用CSS引用的媒体属性吗?

<link rel="stylesheet" href="css/style2.css" media="print" type="text/css" />

或者将其设置为屏幕,如果您不希望打印版本使用该样式:

<link rel="stylesheet" href="css/style2.css" media="screen" type="text/css" />

这样你就不需要动态添加它了。


但是弹出窗口是由JavaScript生成的。 - Jay
弹出窗口不是显示在popupwindowcontent.xhtml文件中的内容吗?你不能把样式表放在那里吗? - fehays
可能是文件名让你感到困惑了。但我正在显示同一个文件,只是想在弹出窗口中添加一些样式来修改它的外观。 - Jay

0

我认为你不能将一个实例化的窗口附加到下面...我知道如果url在不同的域上(XSS和所有爵士),你不能这样做,但是你可以从那个窗口向上讲话并访问父窗口的元素,假设它们在相同的域上。你最好在加载页面时附加样式表,如果该页面不在同一域上(例如尝试重新设计其他人的页面),则无法进行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接