2012-08-06 21 views
16

Tôi đang làm việc với CMS ngăn chúng tôi chỉnh sửa phần đầu. Tôi cần phải thêm bản định kiểu CSS vào trang web, ngay sau thẻ. Có cách nào để làm điều này với JS, nơi tôi có thể thêm một kịch bản vào dưới cùng của trang (tôi có quyền truy cập để thêm kịch bản ngay trước thẻ) mà sau đó sẽ tiêm các stylesheet vào phần đầu?Thêm biểu định kiểu vào Đầu bằng javascript trong phần thân

+2

Nghĩa đen một vài câu hỏi xuống: http://stackoverflow.com/questions/11833325/css-hack-adding-css-in-the-body -of-a-website – Kwon

+2

bạn đang sử dụng CMS nào? Thường có ít nhất một số cách được cung cấp để bao gồm chúng –

+0

Bản định kiểu nội tuyến hoặc bên ngoài? –

Trả lời

52

Cập nhật: Theo specs, phần tử link không được phép trong phần thân. Tuy nhiên, hầu hết các trình duyệt vẫn sẽ hiển thị nó tốt. Vì vậy, để trả lời các câu hỏi trong phần nhận xét - người thực sự phải thêm link vào trang head của trang chứ không phải body.

function addCss(fileName) { 

    var head = document.head; 
    var link = document.createElement("link"); 

    link.type = "text/css"; 
    link.rel = "stylesheet"; 
    link.href = fileName; 

    head.appendChild(link); 
} 

addCss('{my-url}'); 

Hoặc một chút dễ dàng hơn với jquery

function addCss(fileName) { 
    var link = $("<link />",{ 
    rel: "stylesheet", 
    type: "text/css", 
    href: fileName 
    }) 
    $('head').append(link); 
} 

addCss("{my-url}"); 

câu trả lời gốc:

Bạn không cần thiết phải bổ sung nó vào đầu, chỉ cần thêm nó vào cuối thẻ body.

$('body').append('<link rel="stylesheet" type="text/css" href="{url}">') 

như Juan Mendes đã đề cập, bạn có thể chèn stylesheet vào đầu thay vì

$('head').append('<link rel="stylesheet" type="text/css" href="{url}">') 

Và cùng mà không jQuery (xem mã trên)

+3

Bạn có thể sử dụng hầu như cùng một thứ để gắn nó vào đầu. –

+0

@Juan Mendes, tôi biết, nhưng những gì tôi nói là nó chỉ có thể được chèn vào trong cơ thể – vittore

+0

Xin chào, tôi đã thêm tập lệnh thứ hai mà bạn đã đề cập ngay trước thẻ, tuy nhiên, dường như không tải CSS trong phần đầu ... suy nghĩ? Vấn đề chính là chúng tôi đang tạo một biểu định kiểu mới để ghi đè lên biểu định kiểu mà CMS buộc chúng tôi sử dụng. Vì vậy, chúng tôi đã tạo một biểu định kiểu MỚI để ghi đè cài đặt của chúng. Chúng tôi muốn tải RIGHT sau khi tải chúng ... nếu không, biểu định kiểu của chúng sẽ tải và hiển thị trang web, sau đó vài giây sau, thay đổi của chúng tôi sẽ hiển thị ... –

12

này sẽ làm những gì bạn muốn trong một thông minh đường. Cũng sử dụng JS thuần túy.

function loadStyle(href, callback){ 
    // avoid duplicates 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href == href){ 
      return; 
     } 
    } 
    var head = document.getElementsByTagName('head')[0]; 
    var link = document.createElement('link'); 
    link.rel = 'stylesheet'; 
    link.type = 'text/css'; 
    link.href = href; 
    if (callback) { link.onload = function() { callback() } } 
    head.appendChild(link); 
} 
+2

Tôi đã chỉnh sửa để thêm thiếu 'i' vào vòng lặp for:' if (document.styleSheets [i] .href == href) {' – cronoklee

+0

Tôi đã thử phương pháp nối phần tử liên kết vào đầu và thấy rằng nó hoạt động, tuy nhiên, điều này gây ra một flash rất đáng chú ý trong trình duyệt kể từ khi tất cả mọi thứ được rerendered. Tôi đã quan sát điều này trên Google Chrome nhưng đã có người dùng trong tất cả các trình duyệt khác nhau báo cáo. Tôi đã thử điều này trong hai sản phẩm khác nhau với cùng một kết quả, và cả hai đều có HTML rất khác nhau, cho biết rằng flash sẽ xuất hiện bất kể HTML hiện diện là gì. Câu chuyện dài ngắn, tôi không khuyên bạn nên thêm liên kết vào đầu – Trevor

+0

Giải pháp là để kiểm soát việc hiển thị thông qua JS là tốt. Giống như tải css trước, nó bao giờ được sử dụng cho tải. Bạn có thể thêm một đối số gọi lại và đặt một sự kiện onload bên trong hàm. Điều này sẽ cho bạn biết khi nào nó đã sẵn sàng để được sử dụng. Cũng vậy với các yếu tố khác như khung, tập lệnh, v.v. – Eddie

4

Tôi đã sửa đổi chức năng của Eddie để loại bỏ hoặc Toggle stylesheet bật hoặc tắt. Nó cũng sẽ trả về trạng thái hiện tại của biểu định kiểu. Điều này rất hữu ích, ví dụ, nếu bạn muốn có một nút bật tắt trên trang web của bạn cho người dùng khiếm thị và cần lưu tùy chọn của họ trong cookie.

function toggleStylesheet(href, onoff){ 
    var existingNode=0 //get existing stylesheet node if it already exists: 
    for(var i = 0; i < document.styleSheets.length; i++){ 
     if(document.styleSheets[i].href && document.styleSheets[i].href.indexOf(href)>-1) existingNode = document.styleSheets[i].ownerNode 
    } 
    if(onoff == undefined) onoff = !existingNode //toggle on or off if undefined 
    if(onoff){ //TURN ON: 
     if(existingNode) return onoff //already exists so cancel now 
     var link = document.createElement('link'); 
     link.rel = 'stylesheet'; 
     link.type = 'text/css'; 
     link.href = href; 
     document.getElementsByTagName('head')[0].appendChild(link); 
    }else{ //TURN OFF: 
     if(existingNode) existingNode.parentNode.removeChild(existingNode) 
    } 
    return onoff 
} 

sử dụng mẫu:

toggleStylesheet('myStyle.css') //toggle myStyle.css on or off 

toggleStylesheet('myStyle.css',1) //add myStyle.css 

toggleStylesheet('myStyle.css',0) //remove myStyle.css 
+2

Cách sử dụng thuộc tính '' .disabled'' chuẩn trên StyleSheet để bật/tắt –

+0

Rõ ràng đó là một tùy chọn và sẽ nhanh hơn một chút để bật lần thứ hai, nhưng điều này sẽ yêu cầu trường hợp thứ ba trong hàm để xử lý biểu định kiểu đã tồn tại trong trạng thái bị vô hiệu hóa, vì vậy hàm sẽ lâu hơn một chút. – cronoklee

Các vấn đề liên quan