2014-05-06 81 views
3

我已经看到了几个类似的帖子,其解决方案似乎适用于这些人,但我无法让这个工作。我在项目中使用http://tutorialzine.com/2013/05/mini-ajax-file-upload-form/。它完美地工作在所有浏览器中,除了Safari浏览器,“BROWSE”按钮不会打开文件对话框。存在下面的代码中的script.js(其中包括该插件工作):jQuery .click()在Safari中不起作用

$('#drop a').click(function(){ 
    // Simulate a click on the file input button 
    // to show the file browser dialog 
    $(this).parent().find('input').click(); 
}); 

的。点击()在Safari不火。我曾尝试解决方案按jQuery .click() works on every browser but Safari和实施

$('#drop a').click(function(){ 
    var a = $(this).parent().find('input'); 
    var evObj = document.createEvent('MouseEvents'); 
    evObj.initMouseEvent('click', true, true, window); 
    a.dispatchEvent(evObj); 
}); 

但后来我得到的错误dispatchEvent is not a function。然后,我对此进行了一些研究,并尝试了jQuery.noConflict()路由,但这并未解决该错误。另外,我在我的主文件中使用了很多jQuery,并且我无法为整个页面激活noConflict()模式。也没有理由说,jQuery应该与任何东西冲突,因为我只使用jQuery和普通的JavaScript,而我没有使用任何类似原型或角色。有人知道另一种方式来模拟Safari中的点击吗?

UPDATE:仅供参考,我在提到功能添加了一个alert('test')(当“浏览”点击触发),并且我得到Safari中的警报,但它不是模拟文件的点击输入元素,即:它不打开文件对话框。

+1

试试这个$(this).parent()。find('input')。trigger(“click”); –

+1

尝试'var a = $(this).parent()。find('input')[0];' – jalynn2

+1

@sudharsan:在一个jQuery对象上,'.trigger(“click”)''和'.click() '是一回事。 –

回答

4

在我原来的问题代码的第二部分竟然工作,除了2件事情。

1)的方法,不喜欢的jQuery,所以不是

var a = $(this).parent().find('input')[0];

我分配一个ID到我的文件输入和代替称为

var a = document.getElementById('upload_select');

2)的Safari公然忽略如果输入是隐藏的(display:none;),这是,所以我做了输入font-size = 1px;和不透明度= 0.

实现这两个更改得到了代码工作。 (“click”);

2

您需要仔细阅读that answer。 :-)

dispatchEvent是DOM元素上的函数,而不是jQuery对象。你试图在jQuery对象上调用它。所以:

$('#drop a').click(function(){ 
    var a = $(this).parent().find('input')[0]; 
    // Change here -----------------------^^^ 
    var evObj = document.createEvent('MouseEvents'); 
    evObj.initMouseEvent('click', true, true, window); 
    a.dispatchEvent(evObj); 
}); 

jQuery对象上使用[0]给你的第一个DOM对象jQuery对象中,或者undefined如果jQuery对象是空的。

+0

好吧,我认为这是因为jQuery正在检索一个数组,并且他们想要引用检索到的第一个元素。我现在不再在Firefox中使用'dispatchEvent不是函数'错误了(但它工作正常),但它在Safari中仍然不起作用。它什么都不做。我通常不使用Safari,所以我无法确定从Safari的调试中去哪里... – Magnanimity

+0

@Magnanimity:目前的Safari可能无法实现。来自tvanfossen的[这个答案](http://stackoverflow.com/a/210709/157247)表明你的原始东西在Safari上适合他,他通常知道他在做什么。如果没有这样做,这里有一个[有趣的解决方法](http://stackoverflow.com/a/3030174/157247)。这是一种解决方法,而不是“解决方案”,但是相当不错。 –