2013-01-15 58 views
14

Tôi muốn viết một bookmarklet sẽ sửa đổi bất kỳ trang web nào để khi mã JavaScript trên trang đó thực hiện một cái gì đó như document.location = 'http://site.tld' hoặc document.location.href = 'http://site.tld' trang mở một tab hoặc cửa sổ mới thay vì thay đổi vị trí; giống như mã là window.open('http://site.tld');Sửa đổi document.location sao cho tab/cửa sổ mới được mở thay vì điều hướng trong tab hiện tại

Tôi có thể sửa đổi mẫu thử nghiệm bằng cách nào đó để đạt được mục tiêu này không? (Tôi sử dụng từ này bất cẩn bởi vì mặc dù tôi đã đọc về sửa đổi nguyên mẫu một vài lần, tôi chưa bao giờ thực sự làm nó.) Hoặc có cách nào khác không?

Trả lời

8

Bạn không nói bạn đang sử dụng trình duyệt nào, nhưng chỉ cách tôi mới có thể nghĩ đến việc này là sử dụng số Object.watch của Firefox.

document.watch('location', function(prop, oldval, newval) { 
    window.open(newval); 
    return '#'; 
}); 

này sẽ can thiệp vào bất kỳ nỗ lực để thiết lập document.location, mở một cửa sổ với lập luận tương tự thay vào đó, và sau đó thay đổi sự phân công để '#' thay vì (mà sẽ không làm gì cả, thường).

Ở dạng bookmarklet, và mở rộng để bao gồm cả document.locationwindow.location:

javascript:(function(){var handle=function(prop, oldval, newval){window.open(newval); return '#';};document.watch('location',handle);window.watch('location',handle);})(); 

Nhưng ngay cả điều này sẽ không làm việc chống lại gán để document.location.href; đối tượng vị trí là một số điều đặc biệt mà Object.watch từ chối tiếp tục.

Nếu không đủ, bạn có thể sử dụng onbeforeunload để nhắc bạn khi bạn cố gắng điều hướng và hủy bỏ nó (nếu đó là mục tiêu của bạn ở đây).

Tốt nhất tôi có, xin lỗi!

+0

Không phải là câu trả lời lý tưởng, nhưng nếu không ai khác cung cấp cái gì tốt hơn , bạn sẽ nhận được tiền thưởng. FYI, 'onbeforeunload' không hữu ích trừ khi tôi bằng cách nào đó có thể biết URL nào sẽ mở trong cửa sổ mới. Chỉ cần dừng điều hướng không phải là mục tiêu. Đang buộc tab mới là. Nhưng cảm ơn vì đã đề cập đến nó. –

1

Bạn chỉ có thể làm điều gì đó với nguyên mẫu nếu đó là cuộc gọi hàm thay vì chỉ định. Ví dụ: trong trường hợp document.write

document.write = function(txt) { 
    alert("txt"); 
}; 

document.write("test"); 
2

Tôi đã thử các phương pháp khác nhau nhưng hầu như không thể theo dõi được href của cửa sổ mục tiêu.

Sử dụng

window.onbeforeunload = function(e) { 
    window.open(document.location.href); 
}; 

sẽ mở ra cửa sổ hiện tại của bạn trong một tab và các mục tiêu trong cửa sổ hiện hành. Vấn đề là onbeforeunload được kích hoạt không chỉ trên thay đổi vị trí của cửa sổ, ngay cả khi đóng cửa sổ hoặc làm mới nó. Phụ thuộc vào nơi bạn muốn sử dụng.

PS:

window.onunload = function() { 
    document.location = document.location; 
} 

nếu bạn kiểm tra này, khi bạn thay đổi vị trí trang, bạn sẽ có thể xem các url mới vào thanh địa chỉ trong chốc lát sau đó bạn sẽ được chuyển hướng đến trang hiện tại của bạn . Tôi đã không xoay sở để đạt được mục tiêu mới. Chúc may mắn!

3

Tôi sẽ đề nghị sử dụng ES5 Object.defineProperty, nhưng vì nó phải là, document.location là một đối tượng "cấu hình: sai", có nghĩa là nó không thể thay đổi.Đối với người hiếu, nếu bạn sẽ có thể thay đổi nó mã sẽ là như thế này:

Object.defineProperty(document.location, 'href', { 
    get: function() { return this.href }, 
    set: function(value) { this.href = value; window.open(value); return false} //Not sure about this part, but anyways... 
}); 

Edit: Trả lời câu hỏi của bạn, tôi không nghĩ rằng điều này có thể đạt được thông qua một bookmarlet.

+0

Cảm ơn vì điều đó. Rất vui được học về mọi thứ. Về mặt lý thuyết, nếu có thể thực hiện điều này, liệu có thể truy cập document.location "gốc" bên trong hàm mới không? –

+0

Trong ý nghĩa bạn có nghĩa là bản gốc? Điều gì sẽ xảy ra với mã trên là khi location.href được đặt (href = "http://google.com"), hàm set sẽ kích hoạt, thiết lập giá trị .href cho giá trị được định nghĩa và mở một cửa sổ mới. – Bruno

-1

FWIW: Đây hoạt động trên firefox mới nhất để tìm kiếm các văn bản đã chọn trong một tab mới:

javascript: Qr = document.getSelection(); if (Qr!) {Void (Qr = prompt (' Từ khóa ... ',' '))}; nếu (Qr) window.open ("http://google.com/search?query=" + escape (Qr)); void (0)

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