IE следует по ссылке даже после onclick = "return false;" - PullRequest
6 голосов
/ 05 мая 2011

Я пишу приложение Rails 2.3.8 и использую стандартный помощник link_to.У меня есть разумное количество ссылок, которые используют пользовательские методы, отличные от GET, поэтому я передаю параметр :method => :whatever в link_to, и он генерирует ссылку с помощью обработчика onclick, например, так (для удобства чтения добавлен отступ):

<a
  onclick="
    var f = document.createElement('form');
    f.style.display = 'none';
    this.parentNode.appendChild(f);
    f.method = 'POST';
    f.action = this.href;
    var s = document.createElement('input');
    s.setAttribute('type', 'hidden');
    s.setAttribute('name', 'authenticity_token');
    s.setAttribute('value', '31M3q8SJkRz7f0R80l42Z2W7O2N7ZrzufhWQYql/Zd8=');
    f.appendChild(s);
    f.submit();
    return false;"
  href="/transactions/1015/transcribe"
>
Enter Data
</a>

Теперь по какой-то причине IE (оба 7 и 8 - два, которые я тестировал) решил, что return false; в конце недостаточно, чтобы помешать ему перейти по ссылке, и я заканчиваюдо получения двух запросов на мой сервер: запрос POST от обработчика onclick, который я хочу, и запрос GET от самой ссылки, чего я не делаю.Фактически, этот маршрут не существует ни для чего, кроме запроса POST, поэтому, когда браузер следует запросу GET, пользователь получает сообщение об ошибке «Неверный URL».Не хорошо.

Кто-нибудь видел это раньше и может сказать мне, что это вызывает?Или, еще лучше, кто-нибудь знает хороший обходной путь?

PS: Я бы предпочел НЕ *

  1. Обезьяна-патчlink-to или
  2. Напишите мою собственную версию link_to

, но если это то, что нужно, то это то, что нужно.И я использую jQuery 1.5., Если это поможет.

Ответы [ 4 ]

12 голосов
/ 05 мая 2011

В общем, когда IE решает "игнорировать" return false; из обработчика onclick, это происходит потому, что одна из строк перед return false; вызвала исключение. Это приведет к тихой ошибке обработчика onclick, и браузер попытается получить доступ к ссылке href. Это относится ко всем браузерам, не только к IE, но часто бывает, что IE будет генерировать исключения в тех случаях, когда другие браузеры этого не делают, поэтому кажется, что только IE игнорирует return false;.

Одним из быстрых патчей для этого является установка href="#", которая будет держать браузер на странице даже в случае сбоя обработчика onclick. Однако правильный способ отладки - это обернуть ваш код onclick во что-то вроде try { ... } catch (ex) { alert(ex); }, чтобы увидеть, что такое исключение, а затем исправить код onclick, чтобы он больше не вызывал исключение.

6 голосов
/ 05 мая 2011

Чтобы предотвратить отправку формы в JQuery, мы часто используем

event.preventDefault();

Итак, в вашем примере вы можете использовать это (как обсуждалось в комментариях):

$('a[onclick]').click(function(e) {e.preventDefault();});

Надеюсь, это поможет!

4 голосов
/ 08 июля 2011

У меня уже была эта проблема с IE раньше, и я обнаружил, что решение, которое работает (что, как я полагаю, является то, что jQuery event.preventDefault () делает под прикрытием), это ОБА return false; для обычных браузеров, но также event.returnValue = false; (до фактического return, очевидно) для IE. IE будет уважать это.

К сожалению, я не знаю, как вставить это в хелпер link_to, не взломав его. Это на самом деле то, что я пришел сюда в поисках. :)

1 голос
/ 05 мая 2011

Я считаю, что проблема в том, что вы отправляете свою новую форму:

f.submit();

и вы отправляете его прямо на свою ссылку href

f.action = this.href;

так что вы следите за этим адресом. Ваша ссылка возвращает false, но отправленная форма ведет вас в это место.

Так что ваш link_to в порядке. Проблема внутри вашего странного JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...