2013-09-04 2 views
-3

ВАЖНО !: Я должен использовать атрибут onclick. Использование Jquery для прослушивателя событий/обработчика событий в моем случае не является вариантом. Зачем? В моем коде есть много других вещей, которые зависят от атрибута и его проявления в коде.Функция JavaScript не вызвана из атрибута onclick правильно

При вводе предупреждения в onclick приписывать это работает, как ожидалось, и предупреждение отображаются во всплывающем окне и вернуть ложными предотвращает форму от их представлений, нажав на кнопку:

<script> 
    $().ready(function() { 
     $('.pretty .prettycheckbox').click(function() { 

      var myType = $('.pretty .prettycheckbox').find("input[class^=car-type]:checked").val(); 

      if (myType == 1) { 
       $('#sendButton').attr("onclick", "alert('Direct!'); return false;"); 
      } 

      if (myType == 2) { 
       $('#sendButton').removeAttr("onclick"); 
      } 

     }); 
    }); 
</script> 

Но это не работает, когда вызывая функцию from onclick atttribute like:

<script> 
    $().ready(function() { 
     $('.pretty .prettycheckbox').click(function() { 

      var myType = $('.pretty .prettycheckbox').find("input[class^=car-type]:checked").val(); 

      if (myType == 1) { 
       $('#sendButton').attr("onclick", "submitDB(); return false;"); 
      } 

      if (myType == 2) { 
       $('#sendButton').removeAttr("onclick"); 
      } 

     }); 
    }); 
</script> 

<script> 
    $().ready(function(){ 
     function submitDB() { 
      alert('From function!'); 
     } 
    }); 
</script> 

Любая идея, почему?

Почему функция игнорируется?

+3

Вы используете jQuery, используйте 'on' для привязки обработчиков событий, не добавляйте атрибуты обработчика событий. – zzzzBov

+0

@zzzzBov Мне нужно использовать атрибут onclick. –

+1

@JimmyHendrikz ** Почему. ** Скорее всего, причина, по которой вам нужно добавить onclick, а не обычный клик, связана с другой проблемой, которая должна быть исправлена. –

ответ

7

Ваш код не работает, потому что у вас проблема с большим объемом. атрибуты onclick могут ориентироваться только на функции, находящиеся в глобальной области. В вашем случае ваша функция не находится в глобальной области.

<script> 
    $().ready(function(){ 
     function submitDB() { 
      alert('From function!'); 
     } 
    }); 
</script> 

должен быть

<script> 
     function submitDB() { 
      alert('From function!'); 
     } 
</script> 

Демо: http://jsfiddle.net/ZeLXY/

Я до сих пор не понимаю, почему "школа" будет пытаться научить, как добавить OnClick атрибутов с помощью JQuery.Нет причин, по которым вы бы хотели добавить атрибуты onclick к элементу с javascript, а тем более к jQuery.

3

Долгий и недостаток в том, что вы делаете это неправильно.

Если вы хотите связать обработчик событий к элементу, используйте on (или соответствующий псевдоним, например click):

$('#sendButton').on('click', function() { 
    alert('Direct!'); 
    return false; 
}); 

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

Чтобы отвязать обработчики событий, используйте off:

$('#sendButton').off('click'); 
+0

@JimmyHendrikz, учитывая ваше обновление, вы все еще делаете это неправильно. Не делайте *** никогда не полагайтесь на 'onclick' или другие атрибуты события. Они не являются надежными. – zzzzBov

1

Попробуйте это:

if (myType == 1) { 
    $('#sendButton').on("click", function() { 
     alert("clicked"); //sorry forgot to edit the callback in! 
    }); 
} 
if (myType == 2) { 
    $('#sendButton').off("click"); 
} 

Если вы должны использовать OnClick, не используйте JQuery.

1

Это не очень хорошая практика. Вы должны привязать событие к элементу, не изменяющему атрибут.

$('#sendButton').off("click").on("click", submitDB); 

Я просто нашел проблему ->http://jsfiddle.net/VJSRy/ Т.е. если вы действительно хотите использовать этот подход, который является неправильным, вы должны определить свою функцию как глобальную. I.e .:

submitDB = function() { 
    alert('From function!'); 
} 

I.e. пропустите var перед submitDB.

+1

, префикс атрибута 'javascript:' не нужен. – zzzzBov

+0

Я согласен с вами. – Krasimir

+0

Спасибо, но функция submitDB() не запускается; ( –