смешивание моих событий нажатия jQuery с атрибутом onclick существующего объекта - PullRequest
3 голосов
/ 22 сентября 2011

Я использую jQuery, но имею дело с разметкой, созданной на страницах JSF.Многие элементы имеют атрибуты onclick, предоставляемые кодом JSF (это не моя сфера).

Пример:

<div onclick="[jsf js to submit form and go to next page]">submit</div>

Я пытаюсь добавить проверку на стороне клиента с помощью jQuery.Мне нужно что-то вроде этого псевдокода:

$('div').click(function(e){
  if(myValidation==true){
     // do nothing and let the JS in the onlick attribute do its thing
  } else {
     $error.show();
     // somehow stop the onclick attribute JS from firing
  }

})

Есть ли лучший метод для обработки этого?

Одна мысль у меня была, что при загрузке страницы, получить значение атрибута onclick, удалитьатрибут onclick объекта, тогда ... вот где я теряюсь.Я мог бы кэшировать JS как текст в атрибуте данных, но я не уверен, как это запустить позже.

Ответы [ 5 ]

3 голосов
/ 22 сентября 2011

Просто используйте eval для запуска кода атрибута onclick в вашем событии щелчка jQuery, если хотите. Вам нужно удалить onclick атрибут

<div onclick="alert('hi');">submit</div>

-

$(document).ready(function() {
    var divClick = $('#theDiv').attr('onclick');
    $('#theDiv').removeAttr('onclick');
});

$('#theDiv').bind('click', function(e) {
    if (myValidation == true) {
        // do nothing and let the JS in the onclick attribute do its thing
        eval(divClick);
    } else {
        $error.show();
        // somehow stop the onclick attribute JS from firing
        e.preventDefault();
    }
});
3 голосов
/ 22 сентября 2011

Или верните false или используйте:

e.stopPropagation()

или

e.preventDefault()

В зависимости от ваших потребностей.

1 голос
/ 22 сентября 2011

EDIT

Вы можете сохранить оригинальное событие:

var originalEvent = $('div').attr("onclick");
$('div').attr("onclick", false);

$('div').click(function(e) {
        if (false) {
            // do nothing and let the JS in the onlick attribute do its thing

            eval(originalEvent);
        }
        else {
            alert("error");
            // somehow stop the onclick attribute JS from firing
        }

    });

взгляните на это http://jsfiddle.net/j4jsU/

Измените if (false) на if (true), чтобы увидеть, что происходит, когда форма действительна.

0 голосов
/ 04 октября 2011

Почему вы не можете сделать что-то вроде:

div=document.getElementById('test');
oldClick=div.onclick;
bol=false;
div.onclick=function(){
    if(bol){
        oldClick();
    }
    else {
       alert('YOU SHALL NOT RUN INLINE JAVASCRIPT'); 
   }
}
0 голосов
/ 22 сентября 2011

Мне нравятся e.stopProgation () и e.preventDefault (), но если вы не предпочитаете эту стратегию, вы также можете вручную удалить атрибут onclick () и вручную вызвать функцию, которую он использовал, после успешной проверки.

Разные штрихи ..

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