2013-02-28 28 views
6

Tôi muốn xây dựng một tập lệnh JS bên ngoài (thẻ) mà dừng mã (thường không phải là của tôi) như location.href xảy ra mà không cần sử dụng một popup. Tôi đã thử những thứ như:Tôi có thể dừng vị trí JS.href không có cửa sổ bật lên không?

$(window).bind('beforeunload', function() { 
window.stop(); 
event.stopImmediatePropagation(); 
event.preventDefault(); 
location.href = '#'; 
}); 

nhưng dường như không có gì hữu ích. một lần nữa, tôi cần nó mà không cần sử dụng: return "bạn có chắc không?" có thể là một cuộc gọi lại khác?

Cảm ơn, Dan

+1

Không thể. Việc có thể dừng điều hướng mà không có thao tác nhập của người dùng sẽ phá vỡ cách duyệt web hoạt động. – jbabey

+0

Tôi có cùng cảm giác. Ví dụ trong Firefox, họ cố tình chặn ghi đè window.location.href vì lý do bảo mật. Xem [lỗi này trong bugzilla] (https://bugzilla.mozilla.org/show_bug.cgi?id=736694). – kamituel

+0

Thực tế là có thể. Nếu không, các trang web yêu cầu bạn nếu bạn muốn "rời khỏi và mất các thay đổi" sẽ không tồn tại. Sự kiện beforeunload tồn tại và nó bắt ngay cả khi bạn đóng cửa sổ mà không cần lướt đi. – Alfabravo

Trả lời

-1

cậu cố gắng sử dụng "return false"? Ngoài ra, bạn nên có sự kiện được gửi đến chức năng của bạn. đây là một ví dụ, nơi bạn có thể ngăn chặn từ một nút bấm và liên kết hyper

<input type="button" value="click me" /> 
<a href="www.google.com"> google </a> 

$(document).ready(function(){ 
    $('input[type="button"]').click(function(e){ 
      e.preventDefault(); 
    }); 
    $('a').click(function(e){ 
     e.preventDefault(); 

    }); 
}); 

đây là liên kết http://jsfiddle.net/juTtG/143/

+1

trong jQuery gọi return false giống như gọi cả e.preventDefault() và e.stopPropagation() .. như được giải thích bởi tác giả của JQuery John Resig: http://www.mail-archive.com/[email protected] .com/msg71371.html và http://jquery.10927.n7.nabble.com/Any-benefit-to-using-event-preventDefault-over-quot-return-false-quot-to-cancel-out-an -href-click-td102980.html –

+0

trả về false (không có "" offcourse) trong trường hợp này, in "return flase" trong cửa sổ bật lên, thật lạ, nhưng đây là những gì xảy ra, vì vậy nó không tốt cho tôi. Và tôi không có nút đầu vào hoặc a href, tôi có một Flash (không phải của tôi) gọi một phương thức JS thực hiện vị trí.href = 'url'. Nhưng cảm ơn cho hướng –

+0

ops xin lỗi sai lầm trả về là một trái ra – Nir

1

Cách quyền sử dụng onbeforeunload để khẳng định hướng đi là để chỉ trả về chuỗi của tin nhắn bạn muốn hiển thị. MDN has this to say.

Các chức năng nên gán một giá trị chuỗi đến tài sản của đối tượng Event returnValue và trả về chuỗi cùng

Vì vậy onbeforeunload chức năng của bạn cho hành vi mà bạn yêu cầu sẽ chỉ được (giống như ràng buộc nó với jquery, đặc biệt là kể từ khi onbeforeunload không hỗ trợ nhiều người nghe sự kiện như các sự kiện khác làm)

window.onbeforeunload = function() { 
    return "Are you sure?"; 
}; 

Nhưng trớ trêu thay, Firefox không hỗ trợ này cho các mục đích an ninh.

Lưu ý rằng trong Firefox 4 trở lên, chuỗi trả về không được hiển thị cho người dùng. Xem bug 588292.

Chỉnh sửa: Tôi đọc thêm báo cáo lỗi. Lý do chính mà trang web của họ cho quyết định này là: "1. Xóa văn bản do trang web cung cấp, vì đây là vấn đề bảo mật (văn bản không đáng tin cậy trong hộp thoại trình duyệt)". Tôi tự hỏi họ cảm thấy thế nào về một số alert?

Hầu hết các trình duyệt hiện đại (Chome, IE 9+ hoặc cũ hơn, và Opera, tôi biết chắc chắn) sẽ bỏ qua bất kỳ điều gì bạn cố thực hiện trong chức năng onbeforeunload ngoài trả về chuỗi để hiển thị. Điều này nhằm ngăn chặn việc xâm nhập trình duyệt của người dùng, mở cửa sổ bật lên, ghi đè các nỗ lực điều hướng bằng cách trỏ người dùng khác, có thể là miền độc hại, v.v.

Chỉnh sửa 2: Tôi dường như không chính xác. Chỉ một số mọi thứ không được phép trong onbeforeunload, chúng chỉ xảy ra chủ yếu là các loại nội dung bạn đã thử trong mã mẫu, phải thực hiện với tuyên truyền sự kiện và điều hướng trang.Từ deep in the comments của báo cáo lỗi FF đó, người dùng oyasumi đăng liên kết tới jsFiddle này bằng cách hiển thị văn bản tùy chỉnh cho người dùng FF 4+: http://jsfiddle.net/ecmanaut/hQ3AQ/ Vì vậy, dường như gọi alert() vẫn được cho phép, ngay cả trong onbeforeunload, là nguyên nhân ban đầu của lỗi "sửa lỗi": hiển thị văn bản tùy chỉnh trong hộp thoại trình duyệt/ứng dụng/HĐH/tìm kiếm chính thức.

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