33

我有一段 JavaScript 可以A在现有 div 中动态创建一个标签,然后在其上调用 jQuery 函数“单击”。这在除 Safari 之外的所有浏览器中都可以正常工作。

Safari 返回以下错误:

'undefined' 不是函数(评估 '$('.shell a')[0].click()')

关于我做错了什么或为什么这在 Safari 中不起作用以及如何让它起作用的任何想法(或在所有浏览器中起作用的一段代码)我也尝试过使用.trigger("click")它并且它给出了相同的错误.

JavaScript

function writeAndClickLink(url) {

    $('.shell').html('<a href="' + url + '"></a>');
    $('.shell a')[0].click();
}

在 HTML 中:

<div class="shell"></div>

我以这种奇怪的方式这样做的原因是从 Flash 站点调用该函数以打开一个 Twitter 窗口,在该窗口中我奖励发推文。到目前为止,这是我可以让“tweet”事件绑定到窗口的唯一方法。如果我以任何其他方式打开窗口(例如 window.open),它不会捕获让我知道他们实际完成推文的绑定事件。

流程类似于:

  • 用户在 Flash 中单击推文按钮
  • Flash调用javascript函数动态写入href并“点击”它
  • 推特窗口打开
  • 用户成功发推文
  • Tweet 事件被捕获并成功更新闪烁
  • 内容在 Flash 中解锁
4

4 回答 4

33
var a = $('.shell a')[0];
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
a.dispatchEvent(evObj);

请参阅http://www.howtocreate.co.uk/tutorials/javascript/domevents(搜索“手动触发事件”)。

于 2012-10-17T00:45:13.423 回答
8

Trevor Dixon 的回答确实修复了 Safari,但在最新的 Firefox 中也出现了问题:

TypeError:MouseEvent.initMouseEvent 的参数不足

在不破坏 Firefox 的情况下支持 Safari 的最佳方式是使用initEvent而不是initMouseEvent这样:

var element = document.getElementById('your_id_here');
if(element.click)
    element.click();
else if(document.createEvent)
{
    var eventObj = document.createEvent('MouseEvents');
    eventObj.initEvent('click',true,true);
    element.dispatchEvent(eventObj);
}

要为 2016 年更新,MouseEvent应该使用它来代替initMouseEvent已弃用的:

var eventObj = new MouseEvent("click", {
    bubbles: true,
    cancelable: true
});
element.dispatchEvent(eventObj);
于 2014-05-06T13:54:25.363 回答
6

$('.shell a')[0]从 jQuery 对象中获取一个 DOM 对象。该 DOM 对象只有 DOM 方法(不是 jQuery 方法),并且在HTML5 之前元素.click()上没有行业标准方法,<a>并且尚未在每个浏览器中实现 - 因此您将在不同的浏览器中看到不完整的实现。

你有几个选择。第一个选项获取一个 jQuery 对象并使用 jQuery 对象.click()上的方法。这只有在您触发 jQuery 点击处理程序时才能可靠地工作,而不是在您只想要<a>标签的默认点击时。

function writeAndClickLink(url) {

    $('.shell').html('<a href="' + url + '"></a>');
    $('.shell a').eq(0).click();
}

或者,如果单击 URL 只是要转到一个新网页,甚至不必费心修改 DOM,只需设置 window.location 因为如果您只是要去一个,那么修改 DOM 根本没有意义新网页:

function writeAndClickLink(url) {
    window.location = url;    
}
于 2012-10-17T00:03:12.607 回答
3

$('.shell a')[0]返回没有绑定 jQuery 方法的原生 DOM 元素

删除“[0]”以保留 jQuery 对象以便使用 jQuery 方法

 $('.shell a').click()
于 2012-10-16T23:56:40.580 回答