2011-01-05 23 views
10

Tôi đã viết một bookmarklet cho nhanh chóng dịch văn bản đã chọn sử dụng Google Translator trong một cửa sổ popup:Làm thế nào một bookmarklet có thể tránh được chặn popup

javascript:(function(){ 
    var text = encodeURI(document.getSelection()); 
    if (!text.length) { 
     text = prompt('Texto') 
    } 
    var url = 'http://translate.google.com/translate_t?hl=&ie=UTF-8&text=' + text + ' &sl=es&tl=pt#'; 
    window.open(url,'trans','left=20,top=20,width=1000,height=500,toolbar=0,location=0,resizable=1'); 
})(); 

Tuy nhiên, chặn popup Firefox không cho phép cửa sổ mới được mở ra . Tôi có thể thêm ngoại lệ cho mọi trang web nơi tôi sử dụng cửa sổ bật lên, nhưng nó có thể khá khó chịu ...

Tôi nghĩ bookmarklet có thể mở cửa sổ bật lên - thực tế, nhiều người trong số họ làm điều đó, phải không? Tôi đang làm gì sai? Hoặc là nó không thể làm điều đó?

Trả lời

10

Có một cách khác để làm việc xung quanh trình chặn cửa sổ bật lên trước tiên bao gồm liên kết được phủ lên trang và sau đó cho phép người dùng nhấp vào đó để tạo cửa sổ bật lên. JavaScript bookmarklet sau đó có thể được lưu trữ trong một tệp riêng biệt. Đây là cách bookmarklet của Pinterest quản lý để làm điều đó. Trước tiên, họ chọn hình ảnh từ trang và phủ hình ảnh trực tiếp trên trang. Sau đó, khi người dùng nhấp để chọn một trong các ảnh, cửa sổ bật lên xuất hiện. Vì hành động này được khởi tạo bởi người dùng, cửa sổ bật lên hoạt động.

Dưới đây là một số mã bạn có thể sử dụng để kiểm tra:

Đặt tệp này vào tệp có tên bookmarklet.js

var popupProperties='width=600,height=400,toolbar=0,location=0,resizable=1'; 
var newA = document.createElement("a"); 
var url = 'http://www.stackoverflow.com'; 
newA.setAttribute("href","javascript:window.open(url,'Hi',popupProperties);"); 
newA.setAttribute("style","position:fixed;z-index:9999999;top:0;left:0;width:100px;height:100px;color:#000;background:#fff;display:block;"); 
var newT = document.createTextNode("Open this"); 
newA.appendChild(newT); 
document.body.appendChild(newA); 

Và sau đó liên kết bookmarklet bạn có thể là như thế này:

javascript:var jsCode = document.createElement('script');jsCode.setAttribute('src', 'http://localhost/bookmarklet.js?r='+Math.random()*99999999);document.body.appendChild(jsCode); 

Ngoài ra, bạn cần phải bao gồm các cửa sổ bật lên trong liên kết bookmarklet thực tế. Điều này sẽ có nghĩa là cách duy nhất để thực hiện bất kỳ thay đổi nào là để người dùng cài đặt lại bookmarklet.

EDIT: Ngoài phương pháp trên, sau này tôi thấy rằng thậm chí còn có một cách khác để giải quyết vấn đề này bằng cách sử dụng easyXDM. Nó có thể giúp bạn làm việc xung quanh Chính sách gốc tương tự http://easyxdm.net/wp/

Sử dụng điều này, bạn có thể sử dụng iframe cho bookmarklet của mình và thậm chí bạn có thể có liên kết "đóng" bên trong iframe của mình. trang.

+1

Bạn thậm chí có thể ném một id trên neo đó và thực hiện một số shenanigans như document.getElementById ('myid'). Click() và chỉ bắn nó ra khỏi dơi (vùng xám ở đây ...) Native DOM .click là khó tìm hỗ trợ tài liệu cho, nhưng chrome và FF hiện đại hoạt động tốt trong các bài kiểm tra ngắn gọn của tôi. –

-1

Trình chặn cửa sổ bật lên có cơ sở để thêm ngoại lệ. có lẽ thử thêm một ngoại lệ cho translate.google.com

(công cụ menu-> Options-> phần nội dung)

+1

Thực ra, nó không hoạt động vì trang web có nội dung được xem là trang nguồn. Ví dụ: nếu tôi yêu cầu dịch một từ trong es.wikipedia.org, tôi nên thêm ngoại lệ vào es.wikipedia.org và cứ thế cho bất kỳ trang web nào khác ... – brandizzi

+0

Tôi xin lỗi, tôi bằng cách nào đó đã bỏ lỡ phần đó của bạn OP – horatio

+0

Thực ra, tôi đã thêm nó sau khi đăng nhưng không thấy đề xuất của bạn. Vì vậy, nó là ok :) – brandizzi

1

Thú vị câu hỏi, cảm giác ruột của tôi là không thể vì trình duyệt không nhất thiết phải theo dõi trong đó mã đang cố gắng mở một cửa sổ mới, vì vậy nó không thể 'cho phép' nó kể từ khi nó đến từ trang web X.

Một tùy chọn mà tôi cảm thấy thực sự tốt hơn là mở nội dung trong hộp thoại trong cùng một cửa sổ. Hãy xem làm thế nào để thực hiện một bookmarklet jquery và phần còn lại nên thẳng về phía trước:

http://www.latentmotion.com/how-to-create-a-jquery-bookmarklet/

+0

Thật lạ lùng vì pepole nói rằng nó có thể ở đây: stackoverflow.com/q/4048008/287976 Tuy nhiên, tôi đã cố gắng sử dụng một bookmarklet mà tôi tin rằng có thể làm điều đó (một bookmarklet để lưu các liên kết trên) Ngon): đầu tiên nó thất bại, và sau đó nó chỉ thay đổi vị trí của tài liệu ... Thật không may, bởi vì tôi thực sự muốn mở nó trong một cửa sổ khác ... Có lẽ tôi thử jQuery, nhưng tôi đặt cược nó sẽ là đủ để tôi thêm ngoại lệ cho một số trang web phổ biến từ nơi tôi muốn dịch một số văn bản ... – brandizzi

7

Một cách để ngăn trình duyệt khiến một chặn pop-up là phải có javascript của bạn chứa đầy đủ trong vòng neo nhãn.

Khi bạn tham chiếu một tệp khác, nó dường như kích hoạt trình chặn cửa sổ bật lên của trình duyệt.

Ví dụ, đoạn mã sau không kích hoạt một cửa sổ pop-up khi người dùng kéo neo để thanh bookmark của trình duyệt của họ:

<a href="javascript:window.open('http://tagsby.me/index.small.php','newWindowName','width=960,height=400,scrollbars=yes,status=no,titlebar=no,toolbar=no');void(0);">No blocker</a> 

Tuy nhiên, nếu bạn tham khảo cùng mã trong một tập tin noblocker.js rằng đã được thêm vào đối tượng tài liệu cho trang web mà người dùng hiện đang truy cập:

<a id="tbm" class="testing" href="javascript:(function(){document.body.appendChild(document.createElement('script')).src='http://domain.com/noblocker.js';})();"> 

nó sẽ kích hoạt trình chặn cửa sổ bật lên. Có thể có một cách khác, nhưng đây là những gì tôi đã làm việc trên trang web của tôi http://tagsby.me ngay bây giờ.

+0

Bạn có tìm ra cách khác không? Tôi thấy rằng Pinterest quản lý để có một cửa sổ pop-up không bị chặn thông qua bookmarklet "Pin it" của nó mặc dù nó được gọi là thông qua một tập tin javascript từ xa - Kiểm tra nó ra trực tiếp trên http://pinterest.com/about/goodies/ – gwendall

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