2013-04-30 2 views
1

Я использую компилятор google закрытия, и я получаю потепление, которое я не понимаю. Мне нужно проверить, если переключатель проверяется или не так, у меня есть следующий код:jQuery prop() и компилятор Google Closure

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @externs_url http://closure-compiler.googlecode.com/svn/trunk/contrib/externs/jquery-1.8.js 
// ==/ClosureCompiler== 

function test() { 

    var TheBool = $('#SomeElement').prop('checked'); 

    if (TheBool === true) { 
    alert('checked'); 
    } 
} 

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

enter image description here

Вы можете попробовать это на http://closure-compiler.appspot.com/home и скопировать и вставить код, как я его (убедитесь, что флажок «Оптимизация: Advanced»)

Как мне сделать это предупреждение уйти?

+0

У меня нет никаких предупреждений или ошибок ... – Ian

+1

@Ian: это потому, что вы не установили режим компиляции в «Дополнительно». – frenchie

+0

Вы совершенно правы. Извините за это :) – Ian

ответ

3

Это, кажется, ошибка в externs file предоставлена ​​компанией Google.

Они неправильно объявляют jQuery.prototype.prop как возвращающий либо строку или jQuery, и игнорируют факт, что он может возвращать логическое;

/** 
* @param {(string|Object.<string,*>)} arg1 
* @param {(string|number|boolean|function(number,String))=} arg2 
* @return {(string|!jQuery)} 
*/ 
jQuery.prototype.prop = function(arg1, arg2) {}; 

... если это необходимо;

/** 
* @param {(string|Object.<string,*>)} arg1 
* @param {(string|number|boolean|function(number,String))=} arg2 
* @return {(string|boolean|!jQuery)} 
*/ 
jQuery.prototype.prop = function(arg1, arg2) {}; 

Я это исправил и uploaded it, а также при использовании этой декларации экстернов, ваша проблема решена;

// ==ClosureCompiler== 
// @output_file_name default.js 
// @compilation_level ADVANCED_OPTIMIZATIONS 
// @externs_url http://files.mattlunn.me.uk/permanent/jquery-1.8.js 
// ==/ClosureCompiler== 

function test() { 

    var TheBool = $('#SomeElement').prop('checked'); 

    if (TheBool === true) { 
    alert('checked'); 
    } 

} 

Вы сможете обойти это, не проверяя непосредственно === true; просто if (TheBool) будет достаточно.


FWIW, это было reported на своей странице вопросов и патч представил.

+0

Хорошо, это действительно хорошо знать. Может быть, кто-то, кто отвечает за внешность, может это исправить. Спасибо за Ваш ответ. – frenchie

+0

Хорошо, спасибо за сообщение об ошибке. – frenchie

1

prop возвращает логическое значение. Поэтому нет необходимости проверять, есть ли это === true. Просто используйте:

if (TheBool) { 
    alert('checked'); 
} 

Чтобы сделать его более понятным при чтении, попробуйте:

var elementIsChecked = $('#SomeElement').prop('checked'); 
// `elementIsChecked` is either true or false 

if (elementIsChecked) { // `elementIsChecked` is coerced into a boolean, but it already is, so it doesn't matter 
    alert('checked'); 
} 

и, возможно, вы поймете, почему это не нужно, в первую очередь.

Выражения, используемые в if(), оцениваются как истинные или ложные, независимо от того, является ли их результат истинным или ложным. Это просто prop действительно возвращает true или false.

+0

Нет, вы не понимаете: http://api.jquery.com/prop/ Когда-нибудь это правда, а иногда оно ложно, в зависимости от того, проверен ли элемент управления или нет. – frenchie

+1

@frenchie: Иан говорит, что это правда ... попробуйте. – Matt

+0

@frenchie Я не понимаю, что вы говорите. Вы уже использовали выражения 'if'? – Ian

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