Якорь "javascript: void (0)" вызывает window.onbeforeunload для запуска IE

Я использую выпадающий виджет под названием Chosen, у которого есть якорь с href javascript:void(0). Когда я нажимаю на раскрывающийся список, он работает, но в IE он запускает новое событие onbeforeunload, которое вызывает разочарование, потому что приложение подтверждает, хотите ли вы уйти. И, очевидно, вы не хотите иметь эти вопросы, когда вводите данные формы.

Есть ли способ избавиться от этой проблемы без изменения выбранной библиотеки?

К сожалению, это:

window.onbeforeunload = function (e) {
    console.log(window.location);
};

Не регистрируется javascript:void(0), поэтому я не могу использовать его для проверки целевого URL.

Такое поведение наблюдается, по крайней мере, в IE9, и это то, что касается меня (не более старые IE).

Ответ 1

Единственное решение, которое я вижу, это добавить возврат false в обработчик событий onclick ссылок. Он сообщит IE, что вы не планируете менять страницу, нажав на ссылку.

<a href="javascript:void(0);" onclick="doSomething(); return false;">Link</a>

То же самое можно записать так:

<script>
    function doSomething() {
        // do Something
        return false;
    }
</script>

<a href="javascript:void(0);" onclick="return doSomething();">Link</a>

Ответ 2

Я закончил прослушивание событий click против анкера и отменил событие, чтобы предотвратить onBeforeUnload от стрельбы:

$chosen.find('.chzn-single').click(function() {
    return false;
});

Ответ 3

Я знаю, что это довольно старый... Но я недавно наткнулся на эту работу. К сожалению, мы все еще вынуждены поддерживать IE9. Мы используем Angular.js в этом проекте, который будет динамически загружать новый контент на страницу, когда пользователь нажимает на тег привязки с data-ng-click.

В вашем примере все, что вам нужно сделать, это передать событие и внутри функции предотвратить действие по умолчанию и остановить его от пузыря. Для этого вам нужно всего лишь:

// Inside the HTML
{...}
<a href="javascript:void(0);" onclick="doSomething(evt);">Link</a>
{...}
<script>
    function doSomething(evt) {
        evt.preventDefault();
        evt.stopPropagation();
        // Do Something
    };
</script>
{...}

В Angular все, что я сделал, было следующее:

// Inside the View
<a href="javascript:void(0)" data-ng-click="addStuff($event)">Add Stuff</a>

// Inside the controller
function addStuff($event) {
    $event.preventDefault();
    $event.stopPropagation();
    // Do Something
};

Я надеюсь, что это еще не слишком поздно, и я надеюсь, что это поможет другим.

Ответ 4

Была та же проблема. Просто нашел ваш вопрос. Мое решение: вам нужно добавить атрибут onclick в каждый выбранный тег привязки выпадающего списка и вызвать window.onbeforeunload = null

В моем случае я положил

$(".chzn-single").attr("onclick", "window.onbeforeunload = null;");

После настройки выбранной библиотеки и она отлично работает

Ответ 5

не использовать href для этого. Простое решение с минимальной дополнительной работой:

Я предпочитаю использовать класс CSS, который имитирует href, очевидно, вы измените цвет и стиль этого класса, чтобы он соответствовал вашему веб-сайту, но для этой цели это стандартная синяя подчеркнутая ссылка

<style>
    .linkSimulate
    {
        cursor: pointer;
        COLOR: blue;
        text-decoration: underline;
    }
</style>

затем используйте простой якорь

<a onclick = "do_save();" class ="linkSimulate">Link</a>

Ответ 6

Даже если этот вопрос устарел, я ответил на вопрос @Bartosz, исправляя проблему в комментарии @Oiva Eskola:

Не будет ли это препятствовать работе окна после запуска выбранного элемента ссылки? - var thisOnClick;

Ниже мое решение правильно создать свойство HTML onclick, чтобы не отменять или отменять событие:

            var thisOnClick;

            $.each( $(' .container a '), function(){

                thisOnClick = $(this).attr('onclick');

                if ( typeof thisOnClick == 'undefined' ) {

                    $(this).attr('onclick', 'window.onbeforeunload = null;');

                } else if ( typeof thisOnClick == 'string' && thisOnClick.indexOf('window.onbeforeunload') == -1  ) {

                $(this).attr('onclick', thisOnClick + 'window.onbeforeunload = null;');
            }

        });