2013-12-10 1 views
1

Если у вас возникла проблема с использованием jQuery, и я не знаю, как это исправить. Просто сказал Ive получил следующее:jQuery, если if/else выполнены

var overlay; 

if(condition == "test") { 
    overlay = $("<div></div>"); 
} 
else if (condition == "test2") { 
    console.log("first-log"); 
    overlay = $("<span></span>"); 
} 

console.log("second-log"); 
overlay.prependTo("body"); 

Если условие совпадает с «если», все работает отлично, наложение наполняется содержанием и будет вставляться в тело.

В то время как условие соответствует «else if», я получаю сообщение об ошибке, что наложение не определено.

Итак, я поместил some console.log(), чтобы увидеть, что делает мой код. Оба действия console.log запускаются, но в моей консоли браузера я сначала вижу «второй журнал», а затем «первый-журнал».

Мой код пытается добавить до завершения 'if/else if', даже если условие соответствует.

Я попытался найти ответ, но я ничего не смог найти, поэтому я надеюсь, что кто-то здесь поможет мне. Благодаря!

jsfiddle of my code

+0

Я предполагаю, что код должен быть наложенным = $ (""); – abc123

+0

Заметил и изменил это. Но это всего лишь фиктивный код, написанный быстро. Мой собственный код более сложный, поэтому это всего лишь пример. – ronnyrr

+0

Является ли код более одного раза как-то? Это в обработчике событий, setTimeout, что-то еще? – Boldewyn

ответ

0

Вы должны инициализировать УАК накладку в начале программы.

+0

Кто бы ни дал -1: почему? Это хорошее исправление, учитывая опубликованный код. 'var overlay = $ ('');' исправляет проблему для отсутствующего случая 'else'. – Boldewyn

+0

Я пробовал это. Наложение больше не определено, как ожидалось. Но контент, который я добавил в наложение в 'else-if', не добавляется. – ronnyrr

+0

@Boldewyn - вероятно, потому что ответ не ясен о том, к чему его инициализировали. Поскольку код в вопросе стоит, он также не изменяет никакого поведения, когда 'condition ==" test2 "' – Krease

0

Я решаю такие проблемы в основном с обратным вызовом или обещаниями. С обратного вызова вы можете попробовать это:

var overlay = $(""); 

testCondition = function(callback) { 

    if(condition == "test") { 
    overlay = $("<div></div>"); 
    } 
    else if (condition == "test2") { 
    console.log("first-log"); 
    overlay = $("<span></span>"); 
    } 

    callback(overlay); 

} 

и вызвать эту функцию следующим образом:

testCondition(function(callback){ 
    overlay.prependTo("body"); 
}); 

Вот является fiddle

Как вы можете проверить в консоли, правый элемент получает предваряется;)

+0

Не знаю, как это могло бы помочь в первую очередь. Просто добавление шума к совершенно хорошему 'if' /' else'. (Не поймите меня неправильно, я люблю обещать себя.) – Boldewyn

+0

Да, я знаю, это своего рода грязный обходной путь здесь, но с этой большой информацией он дал это единственный рабочий ответ, который я мог бы дать. @ronnyrr: если бы вы могли добавить еще код, мы могли бы найти лучшее решение, возможно;) – Igle

+0

Как насчет ответа @ user3085570? Прекрасно работает без накладных расходов. У вас тоже сбой, когда 'condition == 'test3''. – Boldewyn

0

Там, кажется, что-то не так с вашим кодом, я просто протестировал его, и он работает!

Ваш код протестирован - http://jsfiddle.net/9Pb7u/

Если все остальное не простое исправление было бы поставить prependTo внутри если заявления - Кроме того, убедитесь, что вы добавить текст или стиль к DIV и диапазон в противном случае они, вероятно, выиграл» t быть видимым, пока вы не посмотрите на источник.

if(condition == "test") { 
    $("<div>TEST</div>").prependTo("body"); 
} else if (condition == "test2") { 
    $("<span>TEST 2</span>").prependTo("body"); 
} 

Работа http://jsfiddle.net/9f93d/

+0

Я предполагаю, что мой код немного сложный, чтобы использовать это. Проверьте мой JSFiddle, чтобы понять, что я имею в виду. – ronnyrr

+0

Я так думаю, но это пример, который вы дали. Все, что я получаю от вашего JSFiddle, это синтаксические ошибки - возможно, исправить их и включить соответствующие библиотеки в первую очередь. – Wez

0

Ключ к этой проблеме в вашем обновлении с jsfiddle кодом. На основании вашего jsfiddle связи, это, кажется, эта основная структура:

if (resource=="iframe") { 
    console.log("resource is iframe"); 

} else if (resource=="json") { 
    $.getJSON("someUrl", function(data) { 
     console.log("resource is json"); 
    }); 
} 

console.log("at the end - one of the above log statements should be hit"); 

Однако, я предполагаю, что проблема вы пытались упростить для вопроса в том, что ваш случае для обработки resource=="json" не удар.

Это, вероятно, потому, что вызов getJSON выполняется асинхронно - функция внутри, что если блок не выполняет встроенный, когда вы ожидаете, но позже, когда вызов getJSON есть результаты, и после того, как остальная часть внешняя функция завершил выполнение

Один из способов фиксации этого является изменение структуры с использованием обратного вызова (по аналогии с Igle's answer), чтобы убедиться, что ваш код обработки не исполняется до тех пор, потом:

function executeAfterIf() { 
    console.log("at the end - one of the above log statements should be hit"); 
} 

if (resource=="iframe") { 
    console.log("resource is iframe"); 
    executeAfterIf(); 

} else if (resource=="json") { 
    $.getJSON("someUrl", function(data) { 
     console.log("resource is json"); 
     executeAfterIf(); 
    }); 
} 

в этой основной рефакторинг, executeAfterIf - это функция обратного вызова, вызываемая после того, как обрабатывается любой случай вашего блока if.

Есть, конечно, другие шаблоны для обработки такого рода вещей; который вы выбираете, зависит от кода в остальной части вашего проекта.