JQuery.click() работает в каждом браузере, но Safari
У меня есть кусок JavaScript, который динамически создает тег A
внутри существующего div и затем вызывает на нем функцию jQuery "click". Это работает как во всех браузерах, кроме 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, где я даю награду за твитирование. Это до сих пор было единственным способом, с помощью которого я мог связать событие "твит" с окном. Если я открою окно любым другим способом (например, window.open), он не фиксирует связанное событие, которое позволяет мне знать, что они действительно завершили твит.
Поток выглядит примерно так:
- Пользователь щелкает кнопку твиттера во флэш-памяти
- Flash вызывает функцию javascript для динамической записи href и "click" it
- Открывается окно Twitter.
- Пользователь успешно выполняет твиты
- Событие, записанное в твиттере, фиксируется и обновляется с успехом.
- Содержимое разблокировано во флэш-памяти
Ответы
Ответ 1
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 (найдите "События ручного запуска" ).
Ответ 2
Тревор Диксон отвечает, исправляет Safari, но ломает даже последний Firefox:
TypeError: недостаточно аргументов для MouseEvent.initMouseEvent
Лучший способ поддержать Safari: без нарушения Firefox — вместо initMouseEvent
будет использоваться initEvent
:
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
, который устарел:
следует использовать MouseEvent
,
var eventObj = new MouseEvent("click", {
bubbles: true,
cancelable: true
});
element.dispatchEvent(eventObj);
Ответ 3
$('.shell a')[0]
получает объект DOM из объекта jQuery. Этот объект DOM имеет только DOM-методы (а не методы jQuery) и не существует отраслевого стандарта .click()
метода на элементе <a>
до HTML5 и он еще не реализован в каждом браузере - таким образом, вы увидите неполную реализацию в разных браузерах разницы.
У вас есть пара вариантов. Первый параметр получает объект jQuery и использует метод .click()
для объекта jQuery. Это будет работать только надежно, если вы запускаете обработчики кликов 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;
}
Ответ 4
$('.shell a')[0]
возвращает собственный DOM-элемент, у которого нет связанных с ним методов jQuery
Удалите "[0]", чтобы сохранить объект jQuery для использования методов jQuery
$('.shell a').click()