2012-08-07 37 views
2

My code的Javascript事件,参数 “E”, “事件” 或其他

var transformString = Modernizr.prefixed('transform'); 
var inputDown, inputMove, inputUp; 


if (window.Touch) { 
    inputDown = "touchstart"; 
    inputMove = "touchmove"; 
    inputUp = "touchend"; 
} 
else { 
    inputDown = "mousedown"; 
    inputMove = "mousemove"; 
    inputUp = "mouseup"; 
} 

var mouse = { startX: 0, startY: 0 }; 
var innerElement = $('.threedee'); 

function normalizedX(event){ 
    return window.Touch ? event.originalEvent.touches[0].pageX : event.pageX; 
}  

function normalizedY(event){ 
    return window.Touch ? event.originalEvent.touches[0].pageY : event.pageY; 
} 

$(document).bind(inputDown, function(event){ 
    event.preventDefault(); 
    if(event.button === 2) return true; // right-click 
    mouse.startX = normalizedX(event); 
    mouse.startY = normalizedY(event); 
    // store the transform state 
    // globalMatrix.setMatrixValue($inner.css('-webkit-transform')); 
    $(document) 
    .bind(inputMove, move) 
    .one(inputUp, function(){ $(document).unbind(inputMove); }); 
}); 

function move(event){ 
    event.preventDefault(); 
    var offsetX = normalizedX(event) - mouse.startX; 
    var offsetY = normalizedY(event) - mouse.startY; 
    if(event.shiftKey){ 
    offsetX = roundToMultiple(offsetX, 15); 
    offsetY = roundToMultiple(offsetY, 15); 
    } 
    innerElement.css(transformString, 'rotateY('+offsetX+'deg) rotateX('+-offsetY+'deg)'); 
    /* move relative to the initial position 
    $inner.css('-webkit-transform', globalMatrix.rotate(-offsetY, offsetX, 0));//*/ 
} 

function roundToMultiple(number, multiple){ 
    var value = number/multiple 
    , integer = Math.floor(value) 
    , rest = value - integer; 
    return rest > 0.5 ? (integer+1)*multiple : integer*multiple; 
}​ 

尝试看看的JavaScript部分而已,我的问题是存在的。

我很奇怪,为什么“事件”将以参数和参数传递为脚本中的大部分功能。有时它也可能是“e”。谁创造了他们?

我自己从来没有创建任何“事件”变量,谁负责这个“事件”变量。

+1

谷歌是你的朋友。 https://developer.mozilla.org/en-US/docs/DOM/event – Madbreaks 2012-08-07 19:29:17

回答

9

jQuery将调用您的活动功能,它会通过一个事件对象为参数。你不需要担心创建变量,你可以给你的参数任何你想要的名字(假设它是一个有效的变量名)。

事件对象的创建应被视为“黑盒子”,你不应该担心它的确切结构或实现。只要按照文档和示例指示你要做的事,你就会好起来的。

关键是要在函数中有一个参数,虽然;否则,您将无法访问事件对象jQuery通行证。

正如其他一些答案所述,避免使用名称event可能是一个好主意,因为如果您不小心,可能会在某些浏览器上与同名全局变量发生冲突。相反,如果您忘记在函数中使用参数,则使用e或类似的函数,然后您将得到一个NameError

// Wrong way #1 
$('.class').bind('click', function() { 
    event.preventDefault(); // may attempt to call .preventDefault() on window.event if it exists 
}); 

// Wrong way #2 (fails fast since e probably won't be on the global object) 
$('.class').bind('click', function() { 
    e.preventDefault();  // ReferenceError thrown here 
}); 

// The correct way 
$('.class').bind('click', function(e) { // or (event) if you want, but the first example can bite you 
    e.preventDefault();  // no problem 
}); 
+0

很清楚,我读了MDN文档和你的解释和例子 – 2012-08-07 20:33:43

+0

谢谢!我很高兴能够提供帮助。快乐的编码! – 2012-08-08 06:42:39

6

的jQuery通过标准化,错误修正和featurized jQuery event object到您的处理函数作为第一个参数。你应该命名这个参数e(或类似的),所以你永远不会意外地引用全球window.event(这是chrome和IE中的本地事件对象),而是得到一个快速的错误。

+0

如果它在函数参数列表中命名为'event',那么在函数中使用'event'变量将始终引用该参数,全球受到影响。唯一的问题可能发生,如果参数拼写错误。 – 2012-08-07 19:31:40

+1

@PlatinumAzure我明白,我的意思是如果你忘记了形式参数,那么在这种情况下你不会得到一个快速错误,但会隐含地指向全局错误。就在今天早些时候,我回答了这个问题发生在哪里 – Esailija 2012-08-07 19:32:03

+1

这里的问题http://stackoverflow.com/q/11845355/995876直到你在IE中调试你的应用程序时,这个错误才会出现,因为如果使用过'e',它在每个浏览器中都会失败。 – Esailija 2012-08-07 19:37:36

1

引用eevent的功能是回调函数。它们本质上是由jQuery自己调用的,并传递一个变量(您可以在那里定义函数,但是它会调用它,假设它已经定义)。这就是为什么它可以定义为eevent(也可能是purple_elephant)。

参考http://en.wikipedia.org/wiki/Callback_(computer_programming

+0

它不能是'紫色大象',因为这不是一个有效的变量名称。 :-P – 2012-08-07 19:32:10

+0

'purple_elephant'? – 2012-08-07 19:33:13

+0

当然,这将工作:-) – 2012-08-07 19:47:52