2011-11-12 23 views
5

Tôi nhận thấy rằng dấu trang Javascript của tôi không thành công trên các trang web nhất định như Google Reader và trang kết quả tìm kiếm của Google (và ngẫu nhiên trên một số trang không phải của Google). Nhìn vào giao diện điều khiển, tôi có thể thấy rằng, đối với các trang này, nhấn vào bookmarklet không thêm yếu tố để người đứng đầu/body như nó thường làm, nhưng tạo ra một tài liệu mới trông như thế này:Javascript bookmarklet không thành công trên các trang web nhất định, tạo ra ghostly new <html> trang

<html> 
    <head></head> 
    <body></body> 
</html> 

Ngay cả khi Tôi đã giảm bookmarklet của mình xuống javascript:alert(window.location.href); nó sẽ tạo trang trống này và chạy bookmarklet trong đó, để cảnh báo hiển thị about:blank. Trên hầu hết các trang web, trang trống này không được tạo và vị trí chính xác được hiển thị.

Ai đó có thể giải thích điều này? Các trang web này có phải là hộp cát chạy bên ngoài mã như một biện pháp an toàn không?

CẬP NHẬT: Tôi hiện không thể tạo lại điều này trên các trình duyệt khác với trình duyệt Chrome 17.0.932.0 dev. Vui lòng cho tôi biết nếu bất kỳ ai khác có thể sao chép các kết quả này trên Chrome hoặc bằng cách khác.

+0

Tôi không thể tạo lại kết quả của bạn. Trình duyệt nào đang gây ra sự cố? –

+0

Tuyệt vời. Tôi có thể thề rằng điều này đã xảy ra trên các trình duyệt nhưng bây giờ tôi chỉ có thể tái tạo nó trong Chrome dev. Trừ khi bất kỳ ai khác có thể tái sản xuất trong các trình duyệt khác, hãy cân nhắc vấn đề này. – glortho

+0

Bạn có đang thử nghiệm thông qua bookmarklets hoặc bột nhão trong thanh vị trí không? –

Trả lời

1

Bạn cần đảm bảo rằng mã trên cùng, tức là mã ngay sau javascript: không trả lại bất kỳ điều gì.

Thông thường này được thực hiện bằng cách gói tất cả mọi thứ trong void():

javascript:void(alert(window.location.href)); 

Nó rất kỳ lạ mà nó phá vỡ với alert() mặc dù kể từ khi chức năng chính nó không trả lại bất cứ điều gì ...

+0

Cảm ơn, ThiefMaster. Tôi đã thử nó với khoảng trống và có kết quả tương tự. Vẫn nhận được nó rất thường xuyên trong Chrome dev. Mở nó trong FF và bookmarklet nó = không có vấn đề. Phải cố gắng nhiều hơn trong Chrome ổn định và báo cáo cho họ. – glortho

1

Nếu url javascript: trả về một chuỗi, nó sẽ được sử dụng để tạo tài liệu mới:

javascript:'foo bar baz'; 

Đây có thể là một vấn đề khó khăn để gỡ lỗi nếu bạn không biết xem. Nó có thể nảy sinh nếu bạn sử dụng một hàm trả về một chuỗi hoặc kết thúc bookmarklet của bạn với một dòng mà đặt ra một chuỗi giá trị:

javascript: a = prompt('foo bar baz'); b = a; 

Một giải pháp đơn giản là sử dụng một đóng cửa:

javascript:(function(){ var a; a = prompt('foo bar baz'); window.b = a}()); 

Một thay thế là kết thúc bằng void 0;

javascript: a = prompt('foo bar baz'); b = a; void 0; 
Các vấn đề liên quan