2

我的代码

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”。谁创造了他们???

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

4

3 回答 3

9

jQuery 将调用您的事件函数,并将一个事件对象传递给参数。您无需担心创建变量,并且可以为参数指定任何您想要的名称(假设它是有效的变量名称)。

事件对象的创建应该被认为是“黑匣子”,你不应该担心它的确切结构或实现。只需按照文档和示例显示的操作即可,一切都会好起来的。

不过,关键是在函数中有一个参数;否则,您将无法访问 jQuery 传递的事件对象。

正如其他一些答案所述,避免使用 name 可能是个好主意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
});
于 2012-08-07T19:30:40.867 回答
6

jQuery 将规范化、错误修复和功能化的jQuery 事件对象作为第一个参数传递给您的处理程序函数。你应该命名这个参数e(或类似的),这样你就不会意外地引用全局window.event(这是 chrome 和 IE 中的本机事件对象)并得到一个快速错误。

于 2012-08-07T19:30:01.983 回答
1

引用e或是event回调函数的函数。它们本质上是由 jQuery 本身调用并传递一个变量作为结果(你在那里定义函数,但它调用它,假设它已定义)。这就是为什么它可以被定义为eevent(也可以是purple_elephant)。

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

于 2012-08-07T19:30:29.620 回答