Javascript jQuery.click()适用于除Safari之外的所有浏览器

Javascript jQuery.click()适用于除Safari之外的所有浏览器,javascript,jquery,safari,click,Javascript,Jquery,Safari,Click,我有一段JavaScript,它在现有div内动态创建一个a标记,然后调用jQuery函数“单击”。除了Safari之外,这在所有浏览器中都能正常工作 Safari返回以下错误: “undefined”不是函数(计算“$”(“.shell a”)[0]。单击() 关于我做错了什么,为什么这在Safari中不起作用,以及如何让它起作用(或者是一段在所有浏览器中都能起作用的代码),我也尝试过使用.trigger(“click”),它给出了相同的错误 JavaScript 函数writeAndClic

我有一段JavaScript,它在现有div内动态创建一个
a
标记,然后调用jQuery函数“单击”。除了Safari之外,这在所有浏览器中都能正常工作

Safari返回以下错误:

“undefined”不是函数(计算“$”(“.shell a”)[0]。单击()

关于我做错了什么,为什么这在Safari中不起作用,以及如何让它起作用(或者是一段在所有浏览器中都能起作用的代码),我也尝试过使用
.trigger(“click”)
,它给出了相同的错误

JavaScript
函数writeAndClickLink(url){
$('.shell').html('');
$('.shell a')[0]。单击();
}
在HTML中:

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

我之所以这么做,是因为这个函数是从一个Flash站点调用的,用来打开一个推特窗口,在那里我为推特提供奖励。到目前为止,这是我将“tweet”事件绑定到窗口的唯一方法。如果我以任何其他方式打开窗口(例如window.open),它不会捕获绑定事件,让我知道他们实际完成了tweet

流程类似于:

  • 用户在flash中单击tweet按钮
  • Flash调用javascript函数动态写入href并“单击”它
  • 推特窗口打开
  • 用户成功发送tweet
  • Tweet事件被捕获并成功更新flash
  • 内容在flash中解锁
$('.shell a')[0]
返回未绑定jQuery方法的本机DOM元素

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

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

你有两个选择。第一个选项获取jQuery对象并使用jQuery对象上的
。click()
方法。只有在您触发jQuery单击处理程序时,这才可以可靠地工作,而不仅仅是在您只需要对
标记进行默认单击时

function writeAndClickLink(url) {

    $('.shell').html('<a href="' + url + '"></a>');
    $('.shell a').eq(0).click();
}
请参阅(搜索“手动触发事件”)。

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年更新,应使用,而不是不推荐使用的
initMouseEvent

var eventObj = new MouseEvent("click", {
    bubbles: true,
    cancelable: true
});
element.dispatchEvent(eventObj);

为什么
[0]
?这可能不是您想要的。我最终发现,如果我在用户单击事件附近调用click()或点击屏幕,那么click()调用将起作用。如果我首先向服务器发送一个数据包进行验证,然后在返回时调用click(),那么它将无法工作。我必须更改我的逻辑或流程。当我删除[0]时,它在任何浏览器中都不起作用,因此可能我从一开始就使用了错误的方法?@Scott:调用jQuery的单击不会触发浏览器的默认行为。你必须自己重定向它。这里有几个相关的问题,例如,如果意图进行重定向,您已经有url变量要传递到
location
object
window。location=url
我没有尝试重定向,我不想将它们从页面上移开。我添加了一些关于我为什么要这样做的附加信息。它实际上与Flash无关,因为Flash只是调用javascript函数(并将url的参数传递给它)。闪光灯只是意味着我不能有传统的标签。如果我直接从html调用函数,也是同样的问题。+1,很好的答案,尽管你没有给出通常的解释
=]
@fabriciomatté-添加了更多的解释。我已根据OP的更新删除了我的答案。这似乎更像是一个XY问题,但您保留了我的+1,因为您的代码正是我最初发布的代码。我尝试添加.eq(0)。早些时候(在StackOverflow上找到类似的问题和解决方案后)单击()但它在Safari中仍然不起作用。@Scott-你读过我的帖子吗?我说过eq(0).click()只有在您试图触发jQuery click处理程序时才起作用,而不是在您试图单击链接时才起作用。我只使用了“HTMLEvents”做了同样的事情,MouseEvents似乎是不同之处。initMouseEvent显然需要更多的参数Firefox@AlexW我也有同样的问题,我找到了一个很好的解决办法(短而甜)这里的修复和解释:@Klik是的,我刚刚去了for initMouseEvent并添加了所有默认值作为参数,我想这正是那篇文章所做的。我只是想让大家知道Firefox的行为与Chrome不同,上面的代码不会按原样运行。令人惊讶的是,该方法现在被弃用了完全赞成。这个答案在当时是有效的,但是
initMouseEvent
不推荐使用。
var a = $('.shell a')[0];
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
a.dispatchEvent(evObj);
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);
}
var eventObj = new MouseEvent("click", {
    bubbles: true,
    cancelable: true
});
element.dispatchEvent(eventObj);