2013-02-15 5 views
0

Я пытаюсь построить в Facebook как предварительный просмотр общей ссылки. Для тех, кто визуально наклонным, что-то вроде этого:Динамически предотвратить onKeyUp функцию

enter image description here

Все работает нормально, но в течение нескольких небольших вещей. Предварительный просмотр доли ссылки запускается при помощи функции keyup в соответствующем текстовом поле. Что-то вроде этого:

$('#txtPublish').keyup(function(e){ 
       if ($(this).val() != '' && $(this).parent().find('.share-with').hasClass('active')) { 

        detectHyperlink(e,this); 
        } 
        else { 
      //do whatever 
        } 
      }); 

И соответствующее detectHyperlink начинается так:

function detectHyperlink(e,textarea) 
{ 
    if((e.which == 13 || e.which == 32 || e.which == 17) && ($(textarea).val().trim() != "")){ 
     var hyperlink_post = $('#txtPublish').val(); // make dynamic 
     if(hyperlink_post != null) { 
      hyperlink_post = " " + hyperlink_post; 
      var urlRegex = /(https?\:\/\/|\s)[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})(\/+[a-z0-9_.\:\;-]*)*(\?[\&\%\|\+a-z0-9_=,\.\:\;-]*)?([\&\%\|\+&a-z0-9_=,\:\;\.-]*)([\!\#\/\&\%\|\+a-z0-9_=,\:\;\.-]*)}*/i; 
      if(urlRegex.test(hyperlink_post)){ 
         // SImple DOM Manipulation 


      $.ajax({ 
       type: "post", 
       url: '/controller/crawlHyperlink', 
       data: {message: hyperlink_post}, 
       cache: false, 
       success: function(data) { 

// данные в формате JSON Offcourse для тех, кто заинтересован в этих вещах.

Это прекрасно работает, но проблема заключается в следующем: метод detectHyperlink продолжает вызываться только один раз. То есть, как только Textarea обнаружит гиперссылку и поделится информацией, она все равно продолжает цикл и делает ajax-вызовы на сервер. Поэтому, когда я нажимаю кнопку «Опубликовать», она по-прежнему делает пару вызовов на сервере, чтобы обнаружить гиперссылку, прежде чем она вернет эту информацию обратно.

Можете ли вы, ребята, понять почему?

Благодаря

+0

Вы пробовали '$ ('# txtPublish'). Один ('KeyUp', функция() {...' –

+0

так один будет технически выполнить только один раз в порядке. Так что на первом каждый экземпляр KeyUp он выполняет, но не выполняет после этого? Правильно? –

+0

Да. '.one (' будет выполняться только один раз –

ответ

0

Вы можете хотеть подавить действие гиперссылки по умолчанию, если вы отвергая его с JQuery.

$('#txtPublish').keyup(function(e){ 
    if ($(this).val() != '' && $(this).parent().find('.share-with').hasClass('active')) { 
    detectHyperlink(e,this); 
    e.preventDefault();//prevents default submit() from firing 
    } 

Кроме того, вы можете установить временный флаг, когда Аякса называется, и предотвратить ее повторение выполнения, если флаг установлен.

if (ajaxWasCalled==false) { 
    $.ajax({ 
    ... 
    ajaxWasCalled=true; 
    }); 
    } 
Смежные вопросы