Sco*_*ott 33 javascript safari jquery click
我有一段JavaScript,它A
在现有div 中动态创建一个标签,然后在其上调用jQuery函数"click".这适用于除Safari之外的所有浏览器.
Safari返回以下错误:
'undefined'不是函数(评估'$('.shell a')[0] .click()')
关于我做错了什么或者为什么这在Safari中不起作用以及如何使其工作(或者在所有浏览器中都能运行的一段代码)的任何想法我都试过使用.trigger("click")
它也会出现同样的错误.
function writeAndClickLink(url) {
$('.shell').html('<a href="' + url + '"></a>');
$('.shell a')[0].click();
}
Run Code Online (Sandbox Code Playgroud)
在HTML中:
<div class="shell"></div>
Run Code Online (Sandbox Code Playgroud)
我这样做的原因很简单,就是从Flash网站调用这个函数来打开一个推特窗口,我在那里给予推文奖励.到目前为止,这是我可以将"tweet"事件绑定到窗口的唯一方法.如果我以任何其他方式打开窗口(例如window.open),它不捕获绑定事件,让我知道他们实际完成了推文.
流程如下:
Tre*_*xon 34
var a = $('.shell a')[0];
var evObj = document.createEvent('MouseEvents');
evObj.initMouseEvent('click', true, true, window);
a.dispatchEvent(evObj);
Run Code Online (Sandbox Code Playgroud)
请参阅http://www.howtocreate.co.uk/tutorials/javascript/domevents(搜索"手动触发事件").
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);
}
Run Code Online (Sandbox Code Playgroud)
要更新2016年,MouseEvent
应使用而不是initMouseEvent
弃用的:
var eventObj = new MouseEvent("click", {
bubbles: true,
cancelable: true
});
element.dispatchEvent(eventObj);
Run Code Online (Sandbox Code Playgroud)
$('.shell a')[0]
从jQuery对象中获取DOM对象.DOM对象只有DOM方法(不是jQuery方法),并且在HTML5之前没有行业标准.click()
方法<a>
,而且还没有在每个浏览器中实现 - 因此你会看到不同浏览器的不完整实现.
你有几个选择.第一个选项获取jQuery对象并.click()
在jQuery对象上使用该方法.只有在触发jQuery单击处理程序时才能可靠地工作,而不是只需要<a>
标记的默认单击.
function writeAndClickLink(url) {
$('.shell').html('<a href="' + url + '"></a>');
$('.shell a').eq(0).click();
}
Run Code Online (Sandbox Code Playgroud)
或者,如果单击URL只是要转到新的网页,甚至不必修改DOM并只设置window.location,因为如果你只是去一个修改DOM就没有意义新网页:
function writeAndClickLink(url) {
window.location = url;
}
Run Code Online (Sandbox Code Playgroud)