jquery .attr("onclick" не работает в IE7

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

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

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

    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 ответов

Решение

Вы можете получить встроенный 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);
        });
}

Я столкнулся с той же проблемой с 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. Однако, если вы измените 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;

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

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

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

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

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

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

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

Кредиты для Полумесяца Fresh.

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

Другие вопросы по тегам