1

我有一个非常奇怪的问题,以下代码行仅在 Mobile Safari 中导致错误:

evt.target = evt.target || evt.srcElement;

基本上,我onclick为一个包含一堆a元素的 div 设置了一个事件。当a单击 div 中的元素时,我想弄清楚a单击了哪个元素。我为此目的使用以下代码:

document.getElementById('the_div').onclick = someFunc(callbackFunction);    
function someFunc(callbackFunction) {      
  return function (evt) {        
    evt = evt || window.event;        
    evt.target = evt.target || evt.srcElement;        
    // More code here in which callbackFunction is used with evt.target.        
    return false;        
  };      
}

但令人困惑的是,该代码在我测试过的所有浏览器中都运行良好,除了 Mobile Safari。它在以下所有浏览器中都能正常工作:

  • 铬合金
  • 火狐
  • 歌剧
  • IE6-10
  • Safari(在 Windows 上)

但是,在 Mobile Safari 上,evt.target赋值会导致错误,然后会导致元素href属性中的 URLa被跟随。(我希望能够查看导致的错误,但我不确定如何在 Mobile Safari 中执行此操作。)

如果我将上面的代码更改为以下代码,那么一切正常(注意target变量声明):

document.getElementById('the_div').onclick = someFunc(callbackFunction);    
function someFunc(callbackFunction) {      
  return function (evt) {        
    evt = evt || window.event;        
    var target = evt.target || evt.srcElement;        
    // More code here in which callbackFunction is used with target.        
    return false;        
  };      
}

有没有人知道为什么evt.target分配只会在 Mobile Safari 中引起问题?

4

1 回答 1

1

好吧,event.target实际上应该是只读的。

target 类型 EventTarget只读

似乎区别只是Error当您尝试设置其值时是否抛出 an 。一些引擎似乎只是忽略它/默默地失败。

console.log(evt.target); // logs: <div id="the_div" ...></div>

evt.target = {};         // you'd expect it to be a plain `Object`

console.log(evt.target); // but, still logs: <div id="the_div" ...></div>

http://jsfiddle.net/YaCv2/

于 2013-08-03T22:03:11.440 回答