Javascript/jQuery: программно следовать ссылке
В коде Javascript я хотел бы программно заставить браузер следовать ссылке, которая находится на моей странице. Простой случай:
<a id="foo" href="mailto:[email protected]">something</a>
function goToBar() {
$('#foo').trigger('follow');
}
Это гипотетично, поскольку на самом деле это не работает. И нет, запуск click
не делает этого.
Я знаю window.location
и window.open
, но они отличаются от нативной ссылки следующими в некотором смысле, которые имеют для меня значение: а) в присутствии элемента <base />
и b) в случае mailto
URL. Последнее особенно важно. В Firefox, по крайней мере, вызов window.location.href = "mailto:[email protected]"
приводит к срабатыванию обработчиков окна unload
, тогда как просто щелчок по ссылке mailto
, насколько я могу судить, не работает.
Я ищу способ запуска обработки ссылок по умолчанию в браузере, от кода Javascript.
Существует ли такой механизм? Ответы на конкретные вопросы также приветствуются (особенно для Гекко).
Ответы
Ответ 1
Насколько я знаю, window.location делает именно то, что вы ищете, вызывая по умолчанию ссылку на ссылку браузера по умолчанию.
Некоторые браузеры замечают протокол до того, как будут запущены какие-либо события или изменен фактический href.
window.location = "mailto:[email protected]";
Попытка демонстрации скриптов, упомянутых ниже, я получаю следующие результаты:
- Chromium: стреляет
onbeforeunload
с помощью кнопки и ссылки
- Firefox срабатывает
onbeforeunload
только для кнопки
- Safari: никогда не срабатывает
onbeforeunload
- Opera: то же, что и Safari
Таким образом, хороший способ предотвратить событие unload
от запуска - это вернуть false в beforeunload
.
Ответ 2
Метод МЕТОД 1 click
HTMLElement
имеют метод click()
https://developer.mozilla.org/en/DOM/element.click
function goToBar() {
document.getElementById('foo').click();
}
Метод 2 Сжигание синтетических событий
Интересно, почему желюс удалил свой ответ. Это решение - это то, что я использовал в прошлом (когда клик был только IE). То есть, запуская синтетическое событие браузера (не поддельное, как jQuery click()
). Позвольте мне опубликовать решение, используя эту идею...
DEMO: http://jsfiddle.net/eyS6x/3/
/**
* Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically
* by testing for a 'synthetic=true' property on the event object
* @param {HTMLNode} node The node to fire the event handler on.
* @param {String} eventName The name of the event without the "on" (e.g., "focus")
*/
function fireEvent(node, eventName) {
// Make sure we use the ownerDocument from the provided node to avoid cross-window problems
var doc;
if (node.ownerDocument) {
doc = node.ownerDocument;
} else if (node.nodeType == 9 /** DOCUMENT_NODE */){
// the node may be the document itself
doc = node;
} else {
throw new Error("Invalid node passed to fireEvent: " + +node.tagName + "#" + node.id);
}
if (node.fireEvent) {
// IE-style
var event = doc.createEventObject();
event.synthetic = true; // allow detection of synthetic events
node.fireEvent("on" + eventName, event);
} else if (node.dispatchEvent) {
// Gecko-style approach is much more difficult.
var eventClass = "";
// Different events have different event classes.
// If this switch statement can't map an eventName to an eventClass,
// the event firing is going to fail.
switch (eventName) {
case "click":
case "mousedown":
case "mouseup":
eventClass = "MouseEvents";
break;
case "focus":
case "change":
case "blur":
case "select":
eventClass = "HTMLEvents";
break;
default:
throw "JSUtil.fireEvent: Couldn't find an event class for event '" + eventName + "'.";
break;
}
var event = doc.createEvent(eventClass);
var bubbles = eventName == "change" ? false : true;
event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable.
event.synthetic = true; // allow detection of synthetic events
node.dispatchEvent(event);
}
};
document.getElementById('button').onclick = function() {
fireEvent( document.getElementById('link'), 'click');
}