2012-02-11 28 views
5

Tôi biết theo thông số kỹ thuật, số href của base phải là một URI tuyệt đối.Làm thế nào để cho phép hỗ trợ IE thẻ cơ sở html với href tương đối? như: `<base href =" ../ "></base>`

href = uri [CT] 
This attribute specifies an absolute URI that acts as the base URI for resolving relative URIs. 

Nhưng firefox và chrome hỗ trợ URI tương đối, ví dụ: ../../, điều rất quan trọng trong dự án hiện tại của tôi. Tôi không tìm thấy một giải pháp tốt hơn khác "cơ sở tương đối href" cho dự án của tôi.

Có bất kỳ hacks hoặc nơi làm việc nào cho IE để cho phép nó hỗ trợ các URI tương đối không? Các trang web của tôi hoạt động tốt trong firefox và chrome ngay bây giờ, nhưng nó phải hỗ trợ IE.

+0

Tôi đã tìm thấy IE rằng base href hoạt động tốt, miễn là bạn không cố gắng tăng lên một cấp. – Joshua

+0

Nhưng tôi cần nó để đi lên cho một số cấp độ – Freewind

+0

Chúng được tạo ra các trang html tĩnh. Tôi cần chúng hoạt động trên một máy chủ http bình thường, nhưng không thể xác định được url. – Freewind

Trả lời

5

Sử dụng chức năng này để chuyển đổi URL của bạn đến tuyệt đối:

function toAbsURL(s) { 
    var l = location, h, p, f, i; 
    if (/^\w+:/.test(s)) { 
     return s; 
    } 
    h = l.protocol + '//' + l.host + (l.port!=''?(':' + l.port):''); 
    if (s.indexOf('/') == 0) { 
     return h + s; 
    } 
    p = l.pathname.replace(/\/[^\/]*$/, ''); 
    f = s.match(/\.\.\//g); 
    if (f) { 
     s = s.substring(f.length * 3); 
     for (i = f.length; i--;) { 
     p = p.substring(0, p.lastIndexOf('/')); 
     } 
    } 
    return h + p + '/' + s; 
    } 

Bạn có thể sử dụng

var base = document.getElementsByTagName('base')[0]; 
base.href = toAbsURL(base.href); 

Ví dụ http://jsfiddle.net/tEpkx/1/

Ngoại trừ việc bạn phải phát hiện các trình duyệt, quá, và chỉ chạy nó cho IE. Các trình duyệt khác sẽ tự động nhận được window.location được cập nhật bởi href của thẻ base và đoạn mã này sẽ thay đổi lại. Vì vậy, hãy viết nó là

<!--[if IE]> 
<script type="text/javascript"> 
var base = document.getElementsByTagName('base')[0]; 
base.href = toAbsURL(base.href); 
</script> 
<![endif]--> 

ps: <base /> là một thẻ duy nhất, nó không yêu cầu đóng.

Đã cập nhật để bao gồm số cổng nếu được đặt.

+0

cảm ơn, nó hoạt động tốt. Nó có hỗ trợ url với cổng không? như: 'http: //aaa.com: 8080/bbb'? – Freewind

+0

@Freewind Không, nhưng thay thế 'h = l.protocol + '//' + l.host;' bằng 'h = l.protocol + '//' + l.host + ':' + l.port;' và nó sẽ hỗ trợ. Tôi đã cập nhật mã. – Cheery

+0

Kịch bản rất hay. Xấu hổ, bạn đã không sử dụng các biến có ý nghĩa mặc dù ... –

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