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()