jquery .attr («onclick» не работает в IE7 - PullRequest
3 голосов
/ 18 июля 2011

Я знаю, есть несколько постов с почти одинаковым вопросом, но все упомянутые "исправления" не работают для меня.

но сначала вот что мне нужно: Некоторые формы в моем приложении должны быть включены путем активации режима редактирования. Если режим редактирования активен, каждая кнопка (кроме «Сохранить и прервать») и ссылка на странице не должны делать то, что обычно делает, а должны сообщать, что вместо этого вам нужно выйти из режима редактирования.

Мой скрипт: Кнопка для запуска режима редактирования вызывает это:

    function startEditMode(selector) {
            var disableAction = "return false;";
            jQuery("mySelectors").each(function(){
                    jQuery(this).bind('click', editModeOnClickHandler);
                    var onClickValue = "";
                    var onClick = jQuery(this).attr("onClick");
                    if ( onClick !== undefined ) onClickValue = "" + onClick;
                    jQuery(this).attr("onClick", disableAction + onClickValue);
            });
    }

Чтобы остановить режим редактирования, существует метод, который обращает все это в обратную сторону. Используемый обработчик "editModeOnClickHandler" просто показывает сообщение и возвращает false; и не важно для моего вопроса.

Итак ... все отлично работает в FF и IE8 (также в Chrome), но не в IE7. OnClick просто не изменяется в IE7 через .attr, как я читал в других публикациях.

решение, которое размещено везде: Используйте привязку событий вместо манипулирования атрибутами. Я хотел бы использовать это!

Вот причина, почему я не могу: Я попытался отменить привязку всех обработчиков и привязать свой собственный обработчик, как вы видите в коде выше. Но это не мешает вызову встроенного onclick. Хорошо, вы можете подумать, не используйте встроенные вызовы ... но мой проект написан на JSF с использованием Primefaces, и большая часть его кода генерируется динамически. В общем, у меня нет возможности предотвратить встроенные клики.

Теперь я застрял. Я должен обрабатывать встроенные onclicks, которые можно предотвратить только путем вставки «return false;» впереди, но это кажется невозможным с IE7.

Кто-нибудь знает обходной путь IE7, чтобы иметь возможность манипулировать атрибутами onclick? И снова: я не могу использовать .bind ('click' ... или .click (потому что они не могут остановить исходный встроенный onclick.

Спасибо за все ответы! Alex

редактировать с вашей помощью я выяснил, что в IE7 изменение встроенного onclick возможно при this.onclick = ... Правильная обработка этого ответа уже была дана в ответе на этот вопрос: Как динамически изменить обработчик onClick?

Для моей конкретной проблемы здесь я не нашел правильного решения, потому что я не мог манипулировать исходными встроенными значениями onclick без их уничтожения. По этой причине я изменил свой сценарий, поэтому IE7 отключает все кнопки и ссылки, чтобы они больше не нажимались. Конечно, чтобы не включать слишком много, я тоже добавлю имя класса.

отключение всех еще не отключенных (это вызывается в цикле):

if (!jQuery(this).attr('disabled')) {
    jQuery(this).attr('disabled', 'disabled');
    jQuery(this).addClass('editmodedisabled');
}

включить мои предыдущие отключенные вещи:

if (jQuery(this).hasClass('editmodedisabled')) {
    jQuery(this).attr('disabled', '');
    jQuery(this).removeClass('editmodedisabled');
}

может быть, это кому-нибудь еще поможет

Ответы [ 5 ]

5 голосов
/ 24 октября 2012

Я столкнулся с той же проблемой с JSF и PrimeFaces, что и вы. Вот мое решение этой проблемы.

Вы можете отключить встроенные функции и восстановить их по своему желанию:

// get the element with jQuery
var element = $('#someId');

// get the current inline onclick function. This works under all browsers. 
var originalInlineClickHandler = element[0].onclick;

// define new click event which will replace the old one.
var click = function () {
    alert('You clicked me!');
}

// replace the old "onclick" event with the new one or in other words disable the click 
element[0].onclick = click;

// Now when clicking #someId element the new function will be executed and only it (the "click" function).
// Original inline function is gone already and those it will not be executed.

// Restore original inline function - a.k.a. enable the click event
element[0].onclick = originalInlineClickHandler.

Этот подход работает во всех браузерах. Дело в том, что все современные браузеры меняют element[0].onclick при изменении element.attr('onclick', callback); (имеется в виду, что element[0].onclick = eval(element.attr('onclick')) или что-то подобное), но не IE <= IE 7. Однако если вы изменяете свойство <code>element[0].onclick даже без изменения onclick Атрибут будет работать во всех браузерах. В этом случае атрибут onclick не соответствует реальному обработчику событий. Чтобы синхронизировать атрибут и свойство onclick во всех браузерах, можно добавить следующую строку:

// define new click event which will replace the old one.
var click = function () {
    alert('You clicked me!');
    return false;
}

// update the onclick attribute of the element. Under most browsers this will update and onclick property of the DOM element.
element.attr('onclick', click.toString());

// replace the old "onclick" event with the new one or in other words disable the click 
element[0].onclick = click;
1 голос
/ 18 июля 2011

Вы можете получить встроенный onclick, как это: var inlineHandler = this.onclick;

function startEditMode(selector) {
        var disableAction = "return false;";
        jQuery("mySelectors").each(function(){
                jQuery(this).bind('click', editModeOnClickHandler);
                var onClickValue = "";
                var onClick = this.onclick;
                if ( onClick !== undefined ) onClickValue = "" + onClick;
                jQuery(this).attr("onClick", disableAction + onClickValue);
        });
}
0 голосов
/ 23 февраля 2013

имел ту же проблему, но чистый href="javascript:some_js_function_without_returning_false();" решил ее.Я знаю, что это не решение проблемы, но в некоторых случаях это может помочь.

0 голосов
/ 18 июля 2011

Это выглядит так, как вы ищете:

var clickEvents = $(element).data("events").click; 
jQuery.each(clickEvents, function(key, handlerObj) {     
   alert(handlerObj.handler)  // also available: handlerObj.type, handlerObj.namespace 
})

Кредиты для Crescent Fresh.

0 голосов
/ 18 июля 2011

Это известная проблема с IE7.

Вы пробовали этот обходной путь ?

Кроме того, я также слышал, что это может быть так же просто, как использование проприетарной event.returnValue IE в качестве обходного пути, но не может проверить, что это работает.

Вот какая часть вашего кода будет изменена на:

var disableAction = "event.returnValue = false; return false;";
...