2009-03-10 40 views
17

Câu hỏi:CƠ SỞ HREF, javascript, và Internet Explorer vs Firefox

IE và Firefox/Safari dường như để đối phó khác nhau với HREF BASE và Javascript yêu cầu loại window.location. Trước tiên, đây có phải là mô tả chính xác về sự cố không? Chuyện gì vậy? Và giải pháp cross-browser tốt nhất để giải quyết tình huống này là gì?

Bối cảnh:

Tôi có một sitelet PHP tập tin phẳng nhỏ (nó thực sự là một mẫu thử nghiệm khả năng sử dụng).

tôi tự động tạo ra giá trị href thẻ CƠ SỞ trong PHP, tức là nếu nó đang chạy trên máy chủ của công ty chúng tôi, đó là:

$basehref = 'http://www.example.com/alpha/bravo/UsabilityTest/'; 

và trên máy dev địa phương của tôi, đó là:

$basehref = 'http://ellen.local/delta/echo/foxtrot/UsabilityTest/';  

Đối một trong các tác vụ, tôi thu thập một số đầu vào của người dùng, thực hiện một số biến đổi trên Javascript và gửi đến máy chủ bằng cách sử dụng mã như sau:

function allDone() { 
    // elided code for simplicity of stackoverflow question 
    var URI = "ProcessUserInput.php?"; 
    URI = URI + "alphakeys=" + encodeURI(keys.join(",")); 
    URI = URI + "&sortedvalues=" + encodeURI(values.join(",")); 
    window.location = URI; 
} 

Cả tệp javascript (chứa hàm allDone()) và tập lệnh PHP xử lý (ProcessUserInput.php) nằm trong thư mục con của UsabilityTest. Nói cách khác, URL thực tế của họ là

http://www.example.com/alpha/bravo/UsabilityTest/foxtrot/ProcessUserInput.php aka

$basehref . '/foxtrot/ProcessUserInput.php'

Vấn đề

JavaScript của IE cơ bản dường như bỏ qua HREF BASE. Bộ xử lý javascript và PHP nằm trong cùng một thư mục, do đó, lệnh gọi tới ProcessUserInput.php hoạt động tốt. Các đầu vào được xử lý và tất cả mọi thứ hoạt động tốt.

Nhưng khi tôi thử nghiệm trên Firefox, JavaScript không xuất hiện để sử dụng HREF BASE, vì đầu ra của kịch bản được gửi đến

$basehref . '/ProcessUserInput.php' 

phá vỡ này, bởi vì ProcessUserInput.php là trong thư mục con của basehref. Tuy nhiên, nếu tôi thêm tên thư mục con vào javascript, nó không còn hoạt động trong IE nữa.

Giải pháp?

tôi có thể nghĩ ra một số cách để giải quyết việc này:

  • Trong javascript, đọc thuộc tính HREF của thẻ BASE và tự thêm vào trước để var URI trong javascript, gọi một URL tuyệt đối hoàn toàn giải quyết
  • Xử lý .js tệp bằng PHP và chèn biến số $basehref vào tập lệnh
  • Di chuyển tệp xung quanh
  • Cái gì khác?

Tôi chắc chắn cũng phải có các cách khác để giải quyết vấn đề này. Cách tốt nhất để đối phó với BASE HREF trong JavaScript khi IE và Firefox áp dụng nó một cách khác nhau trong JavaScript là gì?

Trả lời

7

Sử dụng phương thức assign của window.location có vẻ như câu trả lời đơn giản nhất.

Thay vì

window.location = URI; 

Tôi đang sử dụng này:

window.location.assign(URI); 

được làm đúng trong cả IE và Firefox.

+9

Không, điều này không giải quyết được vấn đề cơ sở href trong IE (như phiên bản 8). Tôi chỉ có một nụ cười trên khuôn mặt của mình khi tôi thấy cách đơn giản mà có thể được giải quyết, nhưng nó chỉ kéo dài trong một phút. –

+0

Như đã đề cập bởi @Halil Özgür, đây không phải là câu trả lời được chấp nhận. – fritzmg

3

Tôi tin rằng bạn muốn sửa đổi window.location.pathname, chứ không phải window.location. window.location là một đối tượng Location, có nhiều biến. Kết quả là, tác động của việc thay đổi nó không được xác định rõ. Tuy nhiên, window.location.pathname được định nghĩa là đường dẫn liên quan đến máy chủ, đó là những gì bạn muốn.

Nếu bạn muốn đọc thêm về nhiều biến mà bạn có thể thay đổi trong window.location, tôi muốn kiểm tra here. Theo tài liệu của Mozilla, việc thay đổi bất kỳ biến nào trong window.location sẽ tải lại trang với một URL mới tương ứng với những thay đổi đó.

+1

Viết một chuỗi vào một vị trí là tốt, hãy quay lại với JS 1.0. Xem http://docs.sun.com/source/816-6408-10/location.htm#1193137 - “Nếu bạn gán một chuỗi cho thuộc tính vị trí của một đối tượng, JavaScript sẽ tạo một đối tượng vị trí và gán chuỗi đó cho nó href. ” – bobince

+2

tên đường dẫn không giải quyết được vấn đề. –

+0

window.location.pathname làm việc cho tôi trong IE, cảm ơn –

6

IE và Firefox/Safari dường như đối phó khác với yêu cầu loại BASE HREF và Javascript window.location.

Vâng, đây là sự khác biệt lâu dài trong những ngày đầu của Netscape-vs-IE.

IE chỉ thi hành base-href tại điểm mà phần tử tài liệu được tương tác với. Vì vậy, bạn có thể createElement('a'), đặt một số tương đối hrefclick() nó *, nhưng cơ sở-href sẽ bị bỏ qua; appendChild nó vào tài liệu chứa base-href, và nó sẽ hoạt động.

Trên các trình duyệt khác, cơ sở-href được lấy làm toàn cầu cho mỗi cửa sổ và luôn được áp dụng. Cái nào đúng? Có vẻ như không xác định. Các tài liệu JavaScript gốc nói duy nhất mà location.hash (và do đó, location áp dụng như một string):

đại diện cho một URL đầy đủ

Vì vậy, đặt nó vào một URL có liên quan sẽ dường như là một hoạt động không xác định.

(*: link.click() là một phương pháp phi tiêu chuẩn được hỗ trợ bởi trình duyệt IE và Opera)

đọc thuộc tính HREF của thẻ BASE và tự thêm vào trước

Có lẽ những gì tôi 'd do, yeah, nếu bạn đã chết đặt trên sử dụng cơ sở <>.

+0

cảm ơn, như đã đề xuất ... Tôi đã làm theo cách này window.location.href = document.getElementById ("myBase"). Href + 'Company #!/Companylist' ; Nó hoạt động cả trên IE và Chrome –

2

chỉ cần thêm $('base').attr('href') trước liên kết. (Sử dụng jquery) hoặc

document.getElementBytagname('base').href 
+0

Dòng trên phải đọc: document.getElementsByTagName ('base') [0] .href –

2

tôi đã cùng một vấn đề ngày hôm nay, sau khi một số nghiên cứu, couldn't findn cách nào để ghi đè lên vấn đề này trong IE9, một requiremente cho dự án của tôi là gì, vì vậy, tôi đã làm như sau phương pháp tiếp cận (dựa trên jquery, nhưng nó thực sự dễ dàng để làm cho nó trong javascript đơn giản).

href = function(url){ 
    if ($("base").length > 0){ 
     location.href= $("base").attr("href")+url; 
    }else{ 
     location.href = url; 
    } 
} 

Và sau đó, thay đổi

location.href= 'emp/start' 

để

href('emp/start'); 
0

Bạn luôn có thể sử dụng Vanilla JS :)

var href = document.getElementBytagname('base')[0].href 

Tôi hy vọng điều này sẽ giúp.

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