JSLint类型混淆:jQuery .css()的函数和对象

时间:2011-06-23 13:03:58

标签: javascript jquery jslint

我很难使用JSLint验证这些行。我假设(可能不正确)他们实际上是有效的。以下是相关代码:

var shadowBox = $('<div/>').appendTo($(document.body));

// ...

shadowBox.css({
    left: (e.originalEvent.clientX + 10).toString() + 'px',
    top: e.originalEvent.clientY.toString() + 'px' 
});

我得到的验证错误是:

  

第492行的问题字符22:键入confusion:function和.css:object。

     

shadowBox.css({

  

第494行的问题字符57:输入混淆:数字和'+':字符串。

     

top:e.originalEvent.clientY.toString()+'px'

我对第一个问题感到困扰,因为这是一个相当常见的jQuery语法。 第二个似乎是误报,因为我将字符串与字符串连接起来。

由于

修改

找出问题所在:

结果证明JSLint对同一文档中存在的这两种语法模式不满意:

var $var = $('<div/>', {css: {width: '15px'}}); // ONE
$var.css({width : '20px'}); // TWO

3 个答案:

答案 0 :(得分:3)

来自jslint

输入混淆

JSLint可以进行类型推断。它可以报告案例变量和属性用于容纳多种类型。警告是类型混淆:{a}和{b}。其中{a}和{b}将替换为类型名称。

通常很容易看出导致警告的原因。在某些情况下,它可能非常令人费解。在令人费解的情况下,尝试使用类型值初始化变量。例如,如果您希望n包含数字,则写入

var n = 0;

这应该会产生更明确的警告。

类型混淆不一定是错误,特别是在提供与此类型一样多的类型自由的语言中。但是一些不一致是错误,因此类型规则可能会考虑添加到您的编程风格。此外,最快的JavaScript引擎会在类型混乱的情况下放慢速度。要关闭这些警告,请启用 Tolerate type 混淆option

var shadowBox = $('<div/>').appendTo($(document.body));

// ...

$(shadowBox).css({
    left: String.concat(e.originalEvent.clientX + 10).toString(), 'px'),
    top: String.concat(e.originalEvent.clientY.toString(), 'px') 
});

对于第二个错误,您可以使用string.concat(e.originalEvent.clientY.toString(),'px')或只是忽略错误。 jslint是一种检测不良做法的工具,但远非完美的工具。

顺便说一句,有一个js验证器比jslint更好:jshint。它没有先生的规则。 crockford喜欢,它有更好的javascript规则。

答案 1 :(得分:2)

事实证明,JSLint已经增加了他们的“类型混淆”规则。

虽然我认为类型混淆的定义纯粹是这样的:

var a = 1;
var b = a + 'string';

事实证明这也被Crockford先生认为是混淆(我并不特别同意他)

function MyObject () {
    this.top() {
        return '15px';
    }
}

var anonObject = {top: '15px'};
var myObject = new MyObject();
var testString = myObject.top();

或jQuery上下文中一个更简单的例子

var $b = $('<div/>').css({top: '15px'}),
    a = $b.offset().top + 15;

我的印象是,类型混淆只涉及在范围内改变价值的标识符。虽然克劳福德先生似乎在想:

  

来自:Douglas Crockford

     

主题:Re:JSLint类型问题

     

致:“Anthony S。”

     

日期:2011年6月23日,星期四,上午11:44

     

你似乎对什么类型的混淆感到困惑。如果你不这样做   想要看到警告,那么你就没有了。

答案 2 :(得分:0)

关于第一个,是shadowBox.css实际上是一个函数吗?你把它称为好像。 编辑:是的,因为这是一个常规的jQuery对象,所以您正确使用.css。的 /修改

关于第二个,虽然你没有给出任何背景,但这看起来对我有用。

请注意,jslint不能很好地理解有效的JS,我总是建议不要使用它。