2011-02-08 40 views
6

Tôi đang cố gắng thay thế các giá trị url trên toàn bộ trang bằng cách sử dụng một số Javascript vanilla. Tôi không thể sử dụng bất kỳ thư viện/khung công tác nào. Dưới đây là những gì tôi có cho đến nay đã được đặt ở đầu mỗi trang giữa các thẻ:Thay đổi TẤT CẢ các liên kết, href, url với vanilla Javascript & regex

<script type="text/javascript"> 
function change_url() { 
    var str = ''; 
    str = str.replace(/blog\.domain\.info/g, 'blogtest\.domain\.info'); 
} 
change_url(); 
</script> 

Tuy nhiên, điều này không hoạt động khi tải trang.

Về cơ bản, tôi cần liên kết tài nguyên để đi từ http://blog.domain.info đến http://blogtest.domain.info. Nhiệm vụ đơn giản, tôi biết! Nhưng đoạn mã trên không hoạt động cho đến nay.

Đề xuất về những gì cần thay đổi?

+3

"vanilla Javascript" - bạn đang làm cho cuộc sống của bạn khó khăn hơn mức cần thiết. jQuery vv ftw! – ThiefMaster

+0

Bạn có nghĩa là chỉ 'neo kẹp 'hoặc bạn bao gồm tất cả hình ảnh và các thực thể khác như biểu định kiểu, tệp javascript, v.v ... không? – Orbling

+0

Không thể sử dụng bất kỳ loại khung/thư viện nào ... HAS là vani. – JsusSalv

Trả lời

13

Sau khi đọc bình luận của bạn, bạn cần một cái gì đó giống như

function replace_url(elem, attr) { 
    var elems = document.getElementsByTagName(elem); 
    for (var i = 0; i < elems.length; i++) 
     elems[i][attr] = elems[i][attr].replace('blog.domain.info', 'blogtest.domain.info'); 
} 

window.onload = function() { 
    replace_url('a', 'href'); 
    replace_url('img', 'src'); 
    // etc 
} 
+0

Đây là một câu trả lời thực sự tốt. Cám ơn rất nhiều! – JsusSalv

+0

Không sao cả. :)

2

Nếu bạn đang nhắm mục tiêu liên kết, bạn có thể làm điều này:

<script type="text/javascript"> 
    var els = document.getElementsByTagName('a'), 
     len = els.length; 

    while(len--) { 
     els[len].hostname = els[len].hostname.replace('blog.domain.info','blogtest.domain.info'); 
    } 
</script> 

Nơi kịch bản này ngay bên trong đóng cửa </body> thẻ.

Để biết thêm thẻ, hãy chỉ định tên thẻ và thuộc tính bạn đang cập nhật.

+0

Điều này cũng khá tuyệt vời! Đã không nhìn thấy điều này một cách kịp thời nhưng sẽ thử nó ra là tốt. Cảm ơn sự giúp đỡ và thông tin của bạn. – JsusSalv

0

Vâng, rất khó, làm thế nào để bạn nhận được các mục trong tiêu đề được thay đổi trước khi chúng gặp phải? Nếu bạn có thể buộc JS của bạn chạy trước khi tải, có lẽ, nhưng tôi nghi ngờ nó. Bạn có thể đi theo tải sau, tìm các mục nhập, viết lại chúng và tải chúng một cách không đồng bộ, nhưng mã cũng có thể bỏ lỡ các sự kiện khởi tạo theo cách đó. Nó sẽ trở nên phức tạp.

Các yếu tố có thể được giải quyết bằng cách sử dụng phương pháp getElementsByTagName() mà các câu trả lời khác đề cập đến. Điều này là tốt cho các thay đổi src/href, nhưng sẽ không xử lý hình ảnh CSS, đặc biệt là background-image, có thể xảy ra trên nhiều yếu tố. Sau đó, có vấn đề của những thứ như vậy gắn liền với các lớp học, mà sẽ yêu cầu cọ rửa các mục lớp, đó là một nỗi đau. Tôi nghi ngờ thay đổi thông tin meta như RSS feeds, favicon, vv, sẽ có hiệu lực tải bài.

Sẽ tốt hơn nếu xử lý thực sự phía máy chủ.

+0

Đây là một lời giải thích tuyệt vời và tôi hoàn toàn đồng ý. Ước gì tôi có thể nhưng điều này là dành cho một nền tảng đã có chức năng và các công cụ nổi xung quanh. Di chuyển JS sang phía máy chủ sẽ là lý tưởng nhưng sẽ đòi hỏi những thay đổi lớn trong suốt. Nhưng tôi hoàn toàn đồng ý với đánh giá của bạn! – JsusSalv

+0

Ồ tôi không có nghĩa là di chuyển phía máy chủ JS, di chuyển các thay đổi URL, tất cả trong HTML/CSS, vì vậy bạn chỉ cần phân tích cú pháp nó và thực hiện các thay đổi. Trong ASP.Net bạn chỉ có thể nắm bắt được sự kiện PreRender, nếu là PHP, bạn có thể sử dụng bộ đệm đầu ra và có lẽ là regex mà loại thay đổi đó. – Orbling

+0

Đệm đầu ra là những gì tôi sẽ sử dụng thông thường. Tuy nhiên, không phải là một lựa chọn ... nào! – JsusSalv

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