2013-06-29 3 views
0

У меня есть этот код:триггер события на объекте существует

$('#name').blur(function(){ 
    $('#usernameLoading').show(); 
    $.post("check", { 
    name: $('#name').val(), 
    platform: $('#platform').val() 
    }, function(response){ 
    $('#usernameResult').fadeOut(); 
    setTimeout("finishAjax('usernameResult', '"+escape(response)+"')", 400); 
    }); 
    return false; 
}); 

я хочу вместо этого изменить это просто, если #name существует, а не на размытость. Я пробовал .is('*'), но получил синтаксическую ошибку, так как я предполагаю, что это не фактический дескриптор события?

Что такое простой способ достичь этого?

+0

Итак, на создание элемента вправо? –

+0

Также возможно дублирование этого; http://stackoverflow.com/questions/8560819/fire-an-event-using-jquery-on-when-element-created –

+0

вы говорите 'if ($ ('# name'))'? – Ohgodwhy

ответ

2
if ($('#name').length > 0) { 
    $('#usernameLoading').show(); 
    $.post("check", { 
     name: $('#name').val(), 
     platform: $('#platform').val() 
    }, function (response) { 
     $('#usernameResult').fadeOut(); 
     setTimeout("finishAjax('usernameResult', '" + escape(response) + "')", 400); 
    }); 
} 

То есть, создать объект JQuery с селектором #name', а затем проверить, что его .length не равен нулю. Вы можете сократить, что:

if ($('#name').length) { 

... потому что ненулевая .length является truthy.

+0

Какое влияние не имеет функция 'function() {' ...? – Zeno

+0

Не имеет смысла использовать 'function() {'? Если вы привязываете обработчик событий, например, ваш оригинальный '.blur()', тогда вам нужно иметь функцию - jQuery вызывает эту функцию, когда происходит событие. Но поскольку вы заявили, что больше не хотите запускать код в ответ на событие, вы просто хотите его запустить, если элемент существует, поэтому достаточно простого теста 'if'. – nnnnnn

+0

P.S. Вышеприведенный код нужно будет обернуть в обработчик '$ (document) .ready (function() {...})' и/или поместить в блок сценария в конце тела, но это было бы был верен вашему исходному коду '.blur(), поэтому просто поставьте его в том же месте. Я предполагаю, что если элемент '# name' существует, он будет там, когда страница сначала загрузится - вы не говорите об элементе, который добавляется динамически после загрузки страницы? – nnnnnn

1

Вы все еще должны помещать этот код в какую-то функцию обработки событий, если ваш <script type='text/javascript'> не находится внизу вашего <body>. Попробуйте что-то вроде:

if($('#name')){ 
    $('#usernameLoading').show(); 
    $.post('check', {name: $('#name').val(), platform: $('#platform').val()}, function(response){ 
    $('#usernameResult').fadeOut(); 
    setTimeout(function(){ 
     //need your usernameResult and response to be dealt with here 
    }, 400); 
    }); 
    return false; 
} 

Вы должны заметить, что я изменил вашу запущенную функцию, что вы прошли в setTimeout(). Вы не можете отправить исполняемую функцию в такой параметр, если только вы не хотите, чтобы она выполнялась на месте. Можно, однако, создать свой метод finishAjax затем передать его без параметров, как:

setTimeout(finishAjax, 400); 

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

function lameFunc(func, funcArg){ 
    return func(funcArg); 
} 
function lameQuote(q){ 
    return q; 
} 
var whatever = lameFunc(lameQuote, 'var whatever is now this String'); 

Это был пример функции, которая передает аргумент в другую функцию. Вы могли бы обмениваться lameQuote с анонимной функцией и по-прежнему передать его аргументы, как:

var someVar = lameFunc(function(arg){return arg;}, 'This String Will Go In arg and, therfore, someVar'); 

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

function lameFunc(func){ 
    return func(); 
} 

Конечно, есть, очевидно, больше различий, но это должно научить вас чему-то.

+0

Обратите внимание, что 'if ($ ('# name')) {' будет _always_ быть правдивым (даже если элемент не существует). Что касается тайм-аута, OP передает строку в 'setTimeout()'; код в строке не будет выполнен немедленно. Но 'setTimeout (function() {finishAjax ('usernameResult', escape (response));}, 400);' также должен работать, потому что 'response' будет по-прежнему находиться в области видимости - и это позволяет избежать менее эффективной практики передавая строку. – nnnnnn

Смежные вопросы